From b923335ed11ee84c780c43240309c2bb6275df0f Mon Sep 17 00:00:00 2001 From: Kruithne Date: Mon, 23 Apr 2018 17:40:32 +0100 Subject: [PATCH] Implement Skill Calculator plug-in --- .../skillcalculator/CacheSkillData.java | 51 + .../skillcalculator/CalculatorType.java | 55 + .../skillcalculator/SkillCalculator.java | 295 +++++ .../skillcalculator/SkillCalculatorPanel.java | 116 ++ .../SkillCalculatorPlugin.java | 87 ++ .../plugins/skillcalculator/UIActionSlot.java | 110 ++ .../UICalculatorInputArea.java | 141 +++ .../skillcalculator/UICombinedActionSlot.java | 85 ++ .../skillcalculator/beans/SkillData.java | 31 + .../skillcalculator/beans/SkillDataBonus.java | 31 + .../skillcalculator/beans/SkillDataEntry.java | 34 + .../client/plugins/skillcalculator/calc.png | Bin 0 -> 799 bytes .../skillcalculator/skill_agility.json | 94 ++ .../skillcalculator/skill_construction.json | 970 +++++++++++++++ .../skillcalculator/skill_cooking.json | 508 ++++++++ .../skillcalculator/skill_crafting.json | 538 +++++++++ .../skillcalculator/skill_farming.json | 52 + .../skillcalculator/skill_firemaking.json | 76 ++ .../skillcalculator/skill_fishing.json | 166 +++ .../skillcalculator/skill_fletching.json | 550 +++++++++ .../skillcalculator/skill_herblore.json | 298 +++++ .../plugins/skillcalculator/skill_hunter.json | 208 ++++ .../plugins/skillcalculator/skill_magic.json | 1066 +++++++++++++++++ .../plugins/skillcalculator/skill_mining.json | 142 +++ .../plugins/skillcalculator/skill_prayer.json | 284 +++++ .../skillcalculator/skill_runecraft.json | 202 ++++ .../skillcalculator/skill_smithing.json | 1036 ++++++++++++++++ .../skillcalculator/skill_thieving.json | 232 ++++ .../skillcalculator/skill_woodcutting.json | 79 ++ 29 files changed, 7537 insertions(+) create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/CacheSkillData.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/CalculatorType.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculator.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculatorPanel.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculatorPlugin.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/UIActionSlot.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/UICalculatorInputArea.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/UICombinedActionSlot.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/beans/SkillData.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/beans/SkillDataBonus.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/beans/SkillDataEntry.java create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/calc.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_agility.json create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_construction.json create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_cooking.json create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_crafting.json create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_farming.json create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_firemaking.json create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_fishing.json create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_fletching.json create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_herblore.json create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_hunter.json create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_magic.json create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_mining.json create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_prayer.json create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_runecraft.json create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_smithing.json create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_thieving.json create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_woodcutting.json diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/CacheSkillData.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/CacheSkillData.java new file mode 100644 index 0000000000..f4f54e0f52 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/CacheSkillData.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2018, Kruithne + * 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.skillcalculator; + +import com.google.gson.Gson; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.HashMap; +import java.util.Map; +import net.runelite.client.plugins.skillcalculator.beans.SkillData; + +class CacheSkillData +{ + private final Map cache = new HashMap<>(); + + SkillData getSkillData(String dataFile) + { + if (cache.containsKey(dataFile)) + { + return cache.get(dataFile); + } + + InputStream skillDataFile = SkillCalculatorPlugin.class.getResourceAsStream(dataFile); + SkillData skillData = new Gson().fromJson(new InputStreamReader(skillDataFile), SkillData.class); + + cache.put(dataFile, skillData); + return skillData; + } +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/CalculatorType.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/CalculatorType.java new file mode 100644 index 0000000000..e102988f50 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/CalculatorType.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2018, Kruithne + * 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.skillcalculator; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import net.runelite.api.Skill; + +@AllArgsConstructor +@Getter +enum CalculatorType +{ + MINING(Skill.MINING, "skill_mining.json"), + AGILITY(Skill.AGILITY, "skill_agility.json"), + SMITHING(Skill.SMITHING, "skill_smithing.json"), + HERBLORE(Skill.HERBLORE, "skill_herblore.json"), + FISHING(Skill.FISHING, "skill_fishing.json"), + THIEVING(Skill.THIEVING, "skill_thieving.json"), + COOKING(Skill.COOKING, "skill_cooking.json"), + PRAYER(Skill.PRAYER, "skill_prayer.json"), + CRAFTING(Skill.CRAFTING, "skill_crafting.json"), + FIREMAKING(Skill.FIREMAKING, "skill_firemaking.json"), + MAGIC(Skill.MAGIC, "skill_magic.json"), + FLETCHING(Skill.FLETCHING, "skill_fletching.json"), + WOODCUTTING(Skill.WOODCUTTING, "skill_woodcutting.json"), + RUNECRAFT(Skill.RUNECRAFT, "skill_runecraft.json"), + FARMING(Skill.FARMING, "skill_farming.json"), + CONSTRUCTION(Skill.CONSTRUCTION, "skill_construction.json"), + HUNTER(Skill.HUNTER, "skill_hunter.json"); + + private final Skill skill; + private final String dataFile; +} \ No newline at end of file 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 new file mode 100644 index 0000000000..5218a1ac44 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculator.java @@ -0,0 +1,295 @@ +/* + * Copyright (c) 2018, Kruithne + * 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.skillcalculator; + +import java.awt.BorderLayout; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.util.ArrayList; +import java.util.List; +import javax.swing.BorderFactory; +import javax.swing.BoxLayout; +import javax.swing.JCheckBox; +import javax.swing.JLabel; +import javax.swing.JPanel; +import net.runelite.api.Client; +import net.runelite.api.Experience; +import net.runelite.client.game.ItemManager; +import net.runelite.client.game.SpriteManager; +import net.runelite.client.plugins.skillcalculator.beans.SkillData; +import net.runelite.client.plugins.skillcalculator.beans.SkillDataBonus; +import net.runelite.client.plugins.skillcalculator.beans.SkillDataEntry; + +class SkillCalculator extends JPanel +{ + private Client client; + private SkillData skillData; + private List uiActionSlots = new ArrayList<>(); + private UICalculatorInputArea uiInput; + + private CacheSkillData cacheSkillData = new CacheSkillData(); + + static SpriteManager spriteManager; + static ItemManager itemManager; + + private UICombinedActionSlot combinedActionSlot = new UICombinedActionSlot(); + private ArrayList combinedActionSlots = new ArrayList<>(); + + private int currentLevel = 1; + private int currentXP = Experience.getXpForLevel(currentLevel); + private int targetLevel = currentLevel + 1; + private int targetXP = Experience.getXpForLevel(targetLevel); + private float xpFactor = 1.0f; + + private static int MAX_XP = Experience.getXpForLevel(Experience.MAX_VIRT_LEVEL); + + private static DecimalFormat XP_FORMAT = new DecimalFormat("#.#"); + + SkillCalculator(Client client, UICalculatorInputArea uiInput) + { + this.client = client; + this.uiInput = uiInput; + + setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); + setBorder(BorderFactory.createLineBorder(getBackground().brighter())); + + // Register listeners on the input fields.. + uiInput.uiFieldCurrentLevel.addActionListener(e -> onFieldCurrentLevelUpdated()); + uiInput.uiFieldCurrentXP.addActionListener(e -> onFieldCurrentXPUpdated()); + uiInput.uiFieldTargetLevel.addActionListener(e -> onFieldTargetLevelUpdated()); + uiInput.uiFieldTargetXP.addActionListener(e -> onFieldTargetXPUpdated()); + } + + void openCalculator(CalculatorType calculatorType) + { + // Load the skill data. + skillData = cacheSkillData.getSkillData(calculatorType.getDataFile()); + + // Reset the XP factor, removing bonuses. + xpFactor = 1.0f; + + // Update internal skill/XP values. + currentXP = client.getSkillExperience(calculatorType.getSkill()); + currentLevel = Experience.getLevelForXp(currentXP); + targetLevel = enforceSkillBounds(currentLevel + 1); + targetXP = Experience.getXpForLevel(targetLevel); + + // Remove all components (action slots) from this panel. + removeAll(); + + // Add in checkboxes for available skill bonuses. + renderBonusOptions(); + + // Add the combined action slot. + add(combinedActionSlot); + + // Create action slots for the skill actions. + renderActionSlots(); + + // Update the input fields. + updateInputFields(); + } + + private void updateCombinedAction() + { + int size = combinedActionSlots.size(); + if (size > 1) + { + combinedActionSlot.setTitle(size + " actions selected"); + } + else if (size == 1) + { + combinedActionSlot.setTitle("1 action selected"); + } + else + { + combinedActionSlot.setTitle("No action selected"); + combinedActionSlot.setText("Shift-click to select multiple"); + return; + } + + int actionCount = 0; + int neededXP = targetXP - currentXP; + double xp = 0; + + for (UIActionSlot slot : combinedActionSlots) + xp += slot.value; + + if (neededXP > 0) + actionCount = (int) Math.ceil(neededXP / xp); + + combinedActionSlot.setText(formatXPActionString(xp, actionCount)); + } + + private void clearCombinedSlots() + { + for (UIActionSlot slot : combinedActionSlots) + slot.setSelected(false); + + combinedActionSlots.clear(); + } + + private void renderBonusOptions() + { + if (skillData.bonuses != null) + { + for (SkillDataBonus bonus : skillData.bonuses) + { + JPanel uiOption = new JPanel(new BorderLayout()); + JLabel uiLabel = new JLabel(bonus.name); + JCheckBox uiCheckbox = new JCheckBox(); + + // Adding an empty 8-pixel border on the left gives us nice padding. + uiOption.setBorder(BorderFactory.createEmptyBorder(0, 8, 0, 0)); + + // Adjust XP bonus depending on check-state of the boxes. + uiCheckbox.addActionListener(e -> adjustXPBonus(uiCheckbox.isSelected(), bonus.value)); + + uiOption.add(uiLabel, BorderLayout.WEST); + uiOption.add(uiCheckbox, BorderLayout.EAST); + add(uiOption); + } + } + } + + private void renderActionSlots() + { + // Wipe the list of references to the slot components. + uiActionSlots.clear(); + + // Create new components for the action slots. + for (SkillDataEntry action : skillData.actions) + { + UIActionSlot slot = new UIActionSlot(action); + uiActionSlots.add(slot); // Keep our own reference. + add(slot); // Add component to the panel. + + slot.addMouseListener(new MouseAdapter() + { + @Override + public void mousePressed(MouseEvent e) + { + if (!e.isShiftDown()) + clearCombinedSlots(); + + if (slot.isSelected) + combinedActionSlots.remove(slot); + else + combinedActionSlots.add(slot); + + slot.setSelected(!slot.isSelected); + updateCombinedAction(); + } + }); + } + + // Refresh the rendering of this panel. + revalidate(); + repaint(); + } + + private void calculate() + { + for (UIActionSlot slot : uiActionSlots) + { + int actionCount = 0; + int neededXP = targetXP - currentXP; + double xp = slot.action.xp * xpFactor; + + if (neededXP > 0) + actionCount = (int) Math.ceil(neededXP / xp); + + slot.setText(formatXPActionString(xp, actionCount)); + slot.setAvailable(currentLevel >= slot.action.level); + slot.value = xp; + } + } + + private String formatXPActionString(double xp, int actionCount) + { + return XP_FORMAT.format(xp) + "xp - " + NumberFormat.getIntegerInstance().format(actionCount) + (actionCount > 1 ? " actions" : " action"); + } + + private void updateInputFields() + { + if (targetXP < currentXP) + { + targetLevel = enforceSkillBounds(currentLevel + 1); + targetXP = Experience.getXpForLevel(targetLevel); + } + + uiInput.setCurrentLevelInput(currentLevel); + uiInput.setCurrentXPInput(currentXP); + uiInput.setTargetLevelInput(targetLevel); + uiInput.setTargetXPInput(targetXP); + calculate(); + } + + private void adjustXPBonus(boolean addBonus, float value) + { + xpFactor += addBonus ? value : -value; + calculate(); + } + + private void onFieldCurrentLevelUpdated() + { + currentLevel = enforceSkillBounds(uiInput.getCurrentLevelInput()); + currentXP = Experience.getXpForLevel(currentLevel); + updateInputFields(); + } + + private void onFieldCurrentXPUpdated() + { + currentXP = enforceXPBounds(uiInput.getCurrentXPInput()); + currentLevel = Experience.getLevelForXp(currentXP); + updateInputFields(); + } + + private void onFieldTargetLevelUpdated() + { + targetLevel = enforceSkillBounds(uiInput.getTargetLevelInput()); + targetXP = Experience.getXpForLevel(targetLevel); + updateInputFields(); + } + + private void onFieldTargetXPUpdated() + { + targetXP = enforceXPBounds(uiInput.getTargetXPInput()); + targetLevel = Experience.getLevelForXp(targetXP); + updateInputFields(); + } + + private static int enforceSkillBounds(int input) + { + return Math.min(Experience.MAX_VIRT_LEVEL, Math.max(1, input)); + } + + private static int enforceXPBounds(int input) + { + return Math.min(MAX_XP, Math.max(0, input)); + } +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculatorPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculatorPanel.java new file mode 100644 index 0000000000..25b2797c3d --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculatorPanel.java @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2018, Kruithne + * 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.skillcalculator; + +import java.awt.Dimension; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.image.BufferedImage; +import javax.swing.BorderFactory; +import javax.swing.Box; +import javax.swing.BoxLayout; +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JPanel; +import net.runelite.api.Client; +import net.runelite.client.game.SkillIconManager; +import net.runelite.client.ui.PluginPanel; + +class SkillCalculatorPanel extends PluginPanel +{ + private JButton activeButton; + private int uiButtonIndex = 0; + private final SkillCalculator uiCalculator; + private final SkillIconManager iconManager; + private final JPanel uiButtonGrid = new JPanel(); + private final GridBagLayout uiButtonGridLayout = new GridBagLayout(); + private final GridBagConstraints uiButtonGridConstraints = new GridBagConstraints(); + + SkillCalculatorPanel(SkillIconManager iconManager, Client client) + { + super(); + this.iconManager = iconManager; + + BoxLayout layout = new BoxLayout(this, BoxLayout.Y_AXIS); + setLayout(layout); + + uiButtonGridConstraints.fill = GridBagConstraints.BOTH; + uiButtonGridConstraints.weightx = 1; + uiButtonGridConstraints.ipady = 12; + uiButtonGridConstraints.insets = new Insets(2, 2, 2, 2); + + uiButtonGrid.setLayout(uiButtonGridLayout); + uiButtonGrid.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3)); + addCalculatorButtons(); + + final UICalculatorInputArea uiInput = new UICalculatorInputArea(); + uiCalculator = new SkillCalculator(client, uiInput); + + add(uiButtonGrid); + add(Box.createRigidArea(new Dimension(0, 8))); + add(uiInput); + add(Box.createRigidArea(new Dimension(0, 14))); + add(uiCalculator); + } + + private void addCalculatorButtons() + { + for (CalculatorType calculatorType : CalculatorType.values()) + { + final JButton uiButton = new JButton(); + final BufferedImage icon = iconManager.getSkillImage(calculatorType.getSkill()); + uiButton.addActionListener(e -> openCalculator(calculatorType, uiButton)); + + uiButton.setIcon(new ImageIcon(icon)); + uiButton.setToolTipText(calculatorType.getSkill().getName()); + uiButton.setFocusPainted(false); + + uiButtonGridConstraints.gridx = uiButtonIndex % 4; + uiButtonGridLayout.setConstraints(uiButton, uiButtonGridConstraints); + uiButtonGrid.add(uiButton); + uiButtonIndex++; + } + } + + private void openCalculator(CalculatorType calculatorType, JButton button) + { + // Remove highlight from existing button.. + if (activeButton != null) + activeButton.setSelected(false); + + // Set the new button as selected.. + button.setSelected(true); + activeButton = button; + + // Invoke the calculator component.. + uiCalculator.openCalculator(calculatorType); + + // Refresh rendering.. + revalidate(); + repaint(); + } +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculatorPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculatorPlugin.java new file mode 100644 index 0000000000..66bfbc70c0 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculatorPlugin.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2018, Kruithne + * 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.skillcalculator; + +import java.awt.image.BufferedImage; +import javax.imageio.ImageIO; +import javax.inject.Inject; +import net.runelite.api.Client; +import net.runelite.client.game.ItemManager; +import net.runelite.client.game.SkillIconManager; +import net.runelite.client.game.SpriteManager; +import net.runelite.client.plugins.Plugin; +import net.runelite.client.plugins.PluginDescriptor; +import net.runelite.client.ui.ClientUI; +import net.runelite.client.ui.NavigationButton; +import net.runelite.client.ui.PluginToolbar; + +@PluginDescriptor(name = "Skill Calculator") +public class SkillCalculatorPlugin extends Plugin +{ + @Inject + private ClientUI ui; + + @Inject + private Client client; + + @Inject + private SkillIconManager skillIconManager; + + @Inject + private ItemManager itemManager; + + @Inject + private SpriteManager spriteManager; + + @Inject + private PluginToolbar pluginToolbar; + + private NavigationButton uiNavigationButton; + private SkillCalculatorPanel uiPanel; + + @Override + protected void startUp() throws Exception + { + BufferedImage icon; + synchronized (ImageIO.class) + { + icon = ImageIO.read(getClass().getResourceAsStream("calc.png")); + } + + SkillCalculator.spriteManager = spriteManager; + SkillCalculator.itemManager = itemManager; + + uiPanel = new SkillCalculatorPanel(skillIconManager, client); + uiNavigationButton = NavigationButton.builder().name("Skill Calculator").icon(icon).panel(uiPanel).build(); + pluginToolbar.addNavigation(uiNavigationButton); + } + + @Override + protected void shutDown() throws Exception + { + pluginToolbar.removeNavigation(uiNavigationButton); + } +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/UIActionSlot.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/UIActionSlot.java new file mode 100644 index 0000000000..74c3bfe16f --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/UIActionSlot.java @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2018, Kruithne + * 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.skillcalculator; + +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.GridLayout; +import javax.swing.BorderFactory; +import javax.swing.JLabel; +import javax.swing.JPanel; +import net.runelite.client.plugins.skillcalculator.beans.SkillDataEntry; +import net.runelite.client.ui.FontManager; +import net.runelite.client.ui.JShadowedLabel; + +class UIActionSlot extends JPanel +{ + SkillDataEntry action; + private JShadowedLabel uiLabelActions; + private static final Dimension ICON_SIZE = new Dimension(32, 32); + + boolean isAvailable = false; + boolean isSelected = false; + + double value = 0; + + UIActionSlot(SkillDataEntry action) + { + this.action = action; + + BorderLayout layout = new BorderLayout(); + layout.setHgap(8); + setLayout(layout); + + setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4)); + + JLabel uiIcon = new JLabel(); + + if (action.icon != null) + SkillCalculator.itemManager.getImage(action.icon).addTo(uiIcon); + else if (action.sprite != null) + SkillCalculator.spriteManager.addSpriteTo(uiIcon, action.sprite, 0); + + uiIcon.setMinimumSize(ICON_SIZE); + uiIcon.setMaximumSize(ICON_SIZE); + uiIcon.setPreferredSize(ICON_SIZE); + uiIcon.setHorizontalAlignment(JLabel.CENTER); + add(uiIcon, BorderLayout.LINE_START); + + JPanel uiInfo = new JPanel(new GridLayout(2, 1)); + uiInfo.setOpaque(false); + + JShadowedLabel uiLabelName = new JShadowedLabel(action.name); + uiInfo.add(uiLabelName); + + uiLabelActions = new JShadowedLabel("Unknown"); + uiLabelActions.setFont(FontManager.getRunescapeSmallFont()); + uiInfo.add(uiLabelActions); + + add(uiInfo, BorderLayout.CENTER); + } + + void setSelected(boolean selected) + { + isSelected = selected; + updateBackground(); + } + + void setAvailable(boolean available) + { + isAvailable = available; + updateBackground(); + } + + void setText(String text) + { + uiLabelActions.setText(text); + } + + private void updateBackground() + { + if (isSelected) + this.setBackground(isAvailable ? Color.GREEN : Color.RED); + else + this.setBackground(isAvailable ? Color.GREEN.darker() : Color.RED.darker()); + } +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/UICalculatorInputArea.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/UICalculatorInputArea.java new file mode 100644 index 0000000000..c845cc522e --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/UICalculatorInputArea.java @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2018, Kruithne + * 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.skillcalculator; + +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JTextField; + +class UICalculatorInputArea extends JPanel +{ + private final GridBagLayout uiLayout; + private final GridBagConstraints uiConstraints; + + private int gridX = 0; + private int gridY = 0; + + JTextField uiFieldCurrentLevel; + JTextField uiFieldCurrentXP; + JTextField uiFieldTargetLevel; + JTextField uiFieldTargetXP; + + UICalculatorInputArea() + { + uiLayout = new GridBagLayout(); + uiConstraints = new GridBagConstraints(); + uiConstraints.insets = new Insets(3, 9, 3, 9); + setLayout(uiLayout); + + uiFieldCurrentLevel = addComponent("Current Level"); + uiFieldCurrentXP = addComponent("Current XP"); + uiFieldTargetLevel = addComponent("Target Level"); + uiFieldTargetXP = addComponent("Target XP"); + } + + int getCurrentLevelInput() + { + return getInput(uiFieldCurrentLevel); + } + + void setCurrentLevelInput(int value) + { + setInput(uiFieldCurrentLevel, value); + } + + int getCurrentXPInput() + { + return getInput(uiFieldCurrentXP); + } + + void setCurrentXPInput(Object value) + { + setInput(uiFieldCurrentXP, value); + } + + int getTargetLevelInput() + { + return getInput(uiFieldTargetLevel); + } + + void setTargetLevelInput(Object value) + { + setInput(uiFieldTargetLevel, value); + } + + int getTargetXPInput() + { + return getInput(uiFieldTargetXP); + } + + void setTargetXPInput(Object value) + { + setInput(uiFieldTargetXP, value); + } + + private int getInput(JTextField field) + { + try + { + return Integer.parseInt(field.getText()); + } + catch (NumberFormatException e) + { + return 0; + } + } + + private void setInput(JTextField field, Object value) + { + field.setText(String.valueOf(value)); + } + + private JTextField addComponent(String label) + { + final JLabel uiLabel = new JLabel(label); + final JTextField uiField = new JTextField(6); + + uiConstraints.gridx = gridX; + uiConstraints.gridy = gridY; + + uiLayout.setConstraints(uiLabel, uiConstraints); + add(uiLabel); + + uiConstraints.gridy++; + uiLayout.setConstraints(uiField, uiConstraints); + add(uiField); + + gridX++; + if (gridX % 2 == 0) + { + gridY += 2; + gridX = 0; + } + + return uiField; + } +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/UICombinedActionSlot.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/UICombinedActionSlot.java new file mode 100644 index 0000000000..acdd05b7de --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/UICombinedActionSlot.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2018, Kruithne + * 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.skillcalculator; + +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.GridLayout; +import javax.swing.BorderFactory; +import javax.swing.JLabel; +import javax.swing.JPanel; +import net.runelite.client.ui.FontManager; +import net.runelite.client.ui.JShadowedLabel; + +class UICombinedActionSlot extends JPanel +{ + + private JShadowedLabel uiLabelActions; + private JShadowedLabel uiLabelTitle; + private static final Dimension ICON_SIZE = new Dimension(32, 32); + + UICombinedActionSlot() + { + BorderLayout layout = new BorderLayout(); + layout.setHgap(8); + setLayout(layout); + + setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4)); + + JLabel uiIcon = new JLabel(); + SkillCalculator.spriteManager.addSpriteTo(uiIcon, 582, 0); + + uiIcon.setMinimumSize(ICON_SIZE); + uiIcon.setMaximumSize(ICON_SIZE); + uiIcon.setPreferredSize(ICON_SIZE); + uiIcon.setHorizontalAlignment(JLabel.CENTER); + add(uiIcon, BorderLayout.LINE_START); + + JPanel uiInfo = new JPanel(new GridLayout(2, 1)); + uiInfo.setOpaque(false); + + uiLabelTitle = new JShadowedLabel("No Action Selected"); + uiInfo.add(uiLabelTitle); + + uiLabelActions = new JShadowedLabel("Shift-click to select multiple"); + uiLabelActions.setFont(FontManager.getRunescapeSmallFont()); + uiInfo.add(uiLabelActions); + + setBackground(Color.orange); + add(uiInfo, BorderLayout.CENTER); + } + + void setText(String text) + { + uiLabelActions.setText(text); + } + + void setTitle(String text) + { + uiLabelTitle.setText(text); + } +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/beans/SkillData.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/beans/SkillData.java new file mode 100644 index 0000000000..5809bfcf5a --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/beans/SkillData.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2018, Kruithne + * 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.skillcalculator.beans; + +public class SkillData +{ + public SkillDataEntry[] actions; + public SkillDataBonus[] bonuses; +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/beans/SkillDataBonus.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/beans/SkillDataBonus.java new file mode 100644 index 0000000000..3af77a8a75 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/beans/SkillDataBonus.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2018, Kruithne + * 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.skillcalculator.beans; + +public class SkillDataBonus +{ + public String name; + public float value; +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/beans/SkillDataEntry.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/beans/SkillDataEntry.java new file mode 100644 index 0000000000..892112fcad --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/beans/SkillDataEntry.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2018, Kruithne + * 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.skillcalculator.beans; + +public class SkillDataEntry +{ + public String name; + public int level; + public double xp; + public Integer icon; + public Integer sprite; +} \ No newline at end of file diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/calc.png b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/calc.png new file mode 100644 index 0000000000000000000000000000000000000000..55b3f5a5a27561039fe03a077542920b3d89c72e GIT binary patch literal 799 zcmV+)1K|9LP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qRNAp5A0007xNkl5YlRb5FlZ> z;D%rD+8IAnO*_fSeCJE%nR(~TIii2a~!d z0QB3c@Of?yAE%};xv+ro*;(F`pO~M=h|`HFmy6+H@?c+xEJTdq9t(bMZDD?G4ZpUx z@ojk-KQ=cpv$zQN#sswpeV<>MDZy+%JtPG_Tmv-R0bye!5CXsat{Pt}p9N=UvC>NV0h z*kxu3j;JV@4aF>h_5>N%Xz(^U8QrZ$o*BP$5}{V0r}YJ#nVEQ(lEPU>J>`=ek}#H< z$~_?<4dC%(QNEC%!2RfMsX)KI8jj`)mPM<*{wd4*5EqBn2?-3R$@V*JG&~(vJ!hi^ zQXqM%%34{139S|*>FErmp7@nRKdG^wGBP-rsvtSklNR%1mP0^-+`e)WRJjo9HG;gf zoBl}h+#y?iIrnIwvxbj;$WhCUr*G;S_X_yy*Y{002ovPDHLkV1kA)S}*_r literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_agility.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_agility.json new file mode 100644 index 0000000000..0bd890268e --- /dev/null +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_agility.json @@ -0,0 +1,94 @@ +{ + "actions": [ + { + "level": 1, + "icon": 2150, + "name": "Gnome Stronghold", + "xp": 86.5 + }, + { + "level": 10, + "icon": 11849, + "name": "Draynor Village Rooftop", + "xp": 120 + }, + { + "level": 20, + "icon": 11849, + "name": "Al Kharid Rooftop", + "xp": 180 + }, + { + "level": 30, + "icon": 11849, + "name": "Varrock Rooftop", + "xp": 238 + }, + { + "level": 30, + "icon": 10595, + "name": "Penguin Agility Course", + "xp": 540 + }, + { + "level": 35, + "icon": 1365, + "name": "Barbarian Outpost", + "xp": 152.5 + }, + { + "level": 40, + "icon": 11849, + "name": "Canifis Rooftop", + "xp": 240 + }, + { + "level": 48, + "icon": 4026, + "name": "Ape Atoll", + "xp": 580 + }, + { + "level": 50, + "icon": 11849, + "name": "Falador Rooftop", + "xp": 440 + }, + { + "level": 52, + "icon": 964, + "name": "Wilderness Agility Course", + "xp": 571 + }, + { + "level": 60, + "icon": 11849, + "name": "Seers' Village Rooftop", + "xp": 570 + }, + { + "level": 60, + "icon": 4179, + "name": "Werewolf Agility Course", + "xp": 540 + }, + { + "level": 70, + "icon": 11849, + "name": "Pollnivneach Rooftop", + "xp": 890 + }, + { + "level": 80, + "icon": 11849, + "name": "Rellekka Rooftop", + "xp": 780 + }, + { + "level": 90, + "icon": 11849, + "name": "Ardougne Rooftop", + "xp": 793 + } + ] +} \ No newline at end of file diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_construction.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_construction.json new file mode 100644 index 0000000000..ef0684bac6 --- /dev/null +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_construction.json @@ -0,0 +1,970 @@ +{ + "actions": [ + { + "level": 1, + "icon": 8168, + "name": "Exit Portal", + "xp": 100 + }, + { + "level": 1, + "icon": 960, + "name": "Plank", + "xp": 29 + }, + { + "level": 1, + "icon": 8780, + "name": "Teak Plank", + "xp": 90 + }, + { + "level": 1, + "icon": 8180, + "name": "Plant", + "xp": 31 + }, + { + "level": 1, + "icon": 8782, + "name": "Mahogany Plank", + "xp": 140 + }, + { + "level": 1, + "icon": 8778, + "name": "Oak Plank", + "xp": 60 + }, + { + "level": 1, + "icon": 8186, + "name": "Fern", + "xp": 31 + }, + { + "level": 1, + "icon": 8189, + "name": "Short Plant", + "xp": 31 + }, + { + "level": 1, + "icon": 8183, + "name": "Dock Leaf", + "xp": 31 + }, + { + "level": 1, + "icon": 8309, + "name": "Crude Wooden Chair", + "xp": 58 + }, + { + "level": 2, + "icon": 8316, + "name": "Brown Rug", + "xp": 30 + }, + { + "level": 2, + "icon": 8322, + "name": "Torn Curtains", + "xp": 132 + }, + { + "level": 3, + "icon": 8325, + "name": "Clay Fireplace", + "xp": 30 + }, + { + "level": 4, + "icon": 8319, + "name": "Wooden Bookcase", + "xp": 115 + }, + { + "level": 5, + "icon": 8216, + "name": "Firepit", + "xp": 40 + }, + { + "level": 5, + "icon": 8236, + "name": "Cat Blanket", + "xp": 15 + }, + { + "level": 5, + "icon": 8169, + "name": "Decorative Rock", + "xp": 100 + }, + { + "level": 5, + "icon": 8173, + "name": "Tree", + "xp": 31 + }, + { + "level": 6, + "icon": 8181, + "name": "Small Fern", + "xp": 70 + }, + { + "level": 6, + "icon": 8184, + "name": "Thistle", + "xp": 70 + }, + { + "level": 6, + "icon": 8187, + "name": "Bush", + "xp": 70 + }, + { + "level": 6, + "icon": 8187, + "name": "Large Leaf Bush", + "xp": 70 + }, + { + "level": 6, + "icon": 8223, + "name": "Wooden Shelves 1", + "xp": 87 + }, + { + "level": 7, + "icon": 8230, + "name": "Pump and Drain", + "xp": 100 + }, + { + "level": 7, + "icon": 8239, + "name": "Beer Barrel", + "xp": 87 + }, + { + "level": 8, + "icon": 8310, + "name": "Wooden Chair", + "xp": 87 + }, + { + "level": 9, + "icon": 8233, + "name": "Wooden Larder", + "xp": 228 + }, + { + "level": 10, + "icon": 8115, + "name": "Wood Dining Table", + "xp": 115 + }, + { + "level": 10, + "icon": 8170, + "name": "Pond", + "xp": 100 + }, + { + "level": 10, + "icon": 8174, + "name": "Nice Tree", + "xp": 44 + }, + { + "level": 10, + "icon": 8108, + "name": "Wooden Bench", + "xp": 115 + }, + { + "level": 11, + "icon": 8217, + "name": "Firepit with Hook", + "xp": 60 + }, + { + "level": 12, + "icon": 8185, + "name": "Reeds", + "xp": 100 + }, + { + "level": 12, + "icon": 8186, + "name": "Fern", + "xp": 70 + }, + { + "level": 12, + "icon": 8240, + "name": "Cider Barrel", + "xp": 91 + }, + { + "level": 12, + "icon": 8224, + "name": "Wooden Shelves 2", + "xp": 147 + }, + { + "level": 12, + "icon": 8115, + "name": "Wood Table", + "xp": 87 + }, + { + "level": 12, + "icon": 8191, + "name": "Huge Plant", + "xp": 100 + }, + { + "level": 12, + "icon": 8188, + "name": "Tall Plant", + "xp": 100 + }, + { + "level": 13, + "icon": 8317, + "name": "Rug", + "xp": 60 + }, + { + "level": 14, + "icon": 8311, + "name": "Rocking Chair", + "xp": 87 + }, + { + "level": 15, + "icon": 8171, + "name": "Imp Statue", + "xp": 150 + }, + { + "level": 15, + "icon": 8175, + "name": "Oak Tree", + "xp": 70 + }, + { + "level": 16, + "icon": 8102, + "name": "Oak Decoration", + "xp": 120 + }, + { + "level": 17, + "icon": 8218, + "name": "Firepit with Pot", + "xp": 80 + }, + { + "level": 18, + "icon": 8323, + "name": "Curtains", + "xp": 225 + }, + { + "level": 18, + "icon": 1905, + "name": "Asgarnian Ale", + "xp": 184 + }, + { + "level": 19, + "icon": 8237, + "name": "Cat Basket", + "xp": 58 + }, + { + "level": 19, + "icon": 8312, + "name": "Oak Chair", + "xp": 120 + }, + { + "level": 20, + "icon": 8031, + "name": "Wooden Bed", + "xp": 117 + }, + { + "level": 20, + "icon": 8038, + "name": "Shoe Box", + "xp": 58 + }, + { + "level": 21, + "icon": 8045, + "name": "Shaving Stand", + "xp": 30 + }, + { + "level": 22, + "icon": 8116, + "name": "Oak Table", + "xp": 240 + }, + { + "level": 22, + "icon": 8109, + "name": "Oak Bench", + "xp": 240 + }, + { + "level": 23, + "icon": 8225, + "name": "Wooden Shelves 3", + "xp": 147 + }, + { + "level": 23, + "icon": 8313, + "name": "Oak Armchair", + "xp": 180 + }, + { + "level": 24, + "icon": 8219, + "name": "Small Oven", + "xp": 80 + }, + { + "level": 25, + "icon": 8052, + "name": "Oak Clock", + "xp": 142 + }, + { + "level": 26, + "icon": 1909, + "name": "Greenman's Ale", + "xp": 184 + }, + { + "level": 26, + "icon": 8099, + "name": "Rope Bell-Pull", + "xp": 64 + }, + { + "level": 27, + "icon": 8231, + "name": "Pump and Tub", + "xp": 200 + }, + { + "level": 27, + "icon": 8039, + "name": "Oak Drawers", + "xp": 120 + }, + { + "level": 29, + "icon": 8320, + "name": "Oak Bookcase", + "xp": 180 + }, + { + "level": 29, + "icon": 8220, + "name": "Large Oven", + "xp": 100 + }, + { + "level": 29, + "icon": 8046, + "name": "Oak Shaving Stand", + "xp": 61 + }, + { + "level": 30, + "icon": 8176, + "name": "Willow Tree", + "xp": 100 + }, + { + "level": 30, + "icon": 8032, + "name": "Oak Bed", + "xp": 210 + }, + { + "level": 31, + "icon": 8110, + "name": "Carved Oak Bench", + "xp": 240 + }, + { + "level": 31, + "icon": 8117, + "name": "Carved Oak Table", + "xp": 360 + }, + { + "level": 32, + "icon": 8118, + "name": "Oak Table", + "xp": 180 + }, + { + "level": 32, + "icon": 8023, + "name": "Boxing Ring", + "xp": 420 + }, + { + "level": 33, + "icon": 8234, + "name": "Oak Larder", + "xp": 480 + }, + { + "level": 33, + "icon": 8238, + "name": "Cushioned Basket", + "xp": 58 + }, + { + "level": 33, + "icon": 8326, + "name": "Stone Fireplace", + "xp": 40 + }, + { + "level": 34, + "icon": 8221, + "name": "Steel Range", + "xp": 120 + }, + { + "level": 34, + "icon": 8226, + "name": "Oak Shelves 1", + "xp": 240 + }, + { + "level": 34, + "icon": 8028, + "name": "Glove Rack", + "xp": 120 + }, + { + "level": 34, + "icon": 8033, + "name": "Large Oak Bed", + "xp": 330 + }, + { + "level": 35, + "icon": 8314, + "name": "Teak Armchair", + "xp": 180 + }, + { + "level": 36, + "icon": 1911, + "name": "Dragon Bitter", + "xp": 224 + }, + { + "level": 36, + "icon": 8103, + "name": "Teak Decoration", + "xp": 180 + }, + { + "level": 37, + "icon": 8100, + "name": "Bell-Pull", + "xp": 120 + }, + { + "level": 37, + "icon": 8047, + "name": "Oak Dresser", + "xp": 121 + }, + { + "level": 38, + "icon": 8112, + "name": "Teak Bench", + "xp": 360 + }, + { + "level": 38, + "icon": 8118, + "name": "Teak Table", + "xp": 360 + }, + { + "level": 39, + "icon": 8040, + "name": "Oak Wardrobe", + "xp": 180 + }, + { + "level": 40, + "icon": 8034, + "name": "Teak Bed", + "xp": 300 + }, + { + "level": 40, + "icon": 8321, + "name": "Mahogany Bookcase", + "xp": 420 + }, + { + "level": 40, + "icon": 8334, + "name": "Oak Lectern", + "xp": 60 + }, + { + "level": 40, + "icon": 8324, + "name": "Opulent Curtains", + "xp": 315 + }, + { + "level": 41, + "icon": 8024, + "name": "Fencing Ring", + "xp": 570 + }, + { + "level": 41, + "icon": 8341, + "name": "Globe", + "xp": 180 + }, + { + "level": 42, + "icon": 8222, + "name": "Fancy Range", + "xp": 160 + }, + { + "level": 42, + "icon": 8351, + "name": "Crystal Ball", + "xp": 280 + }, + { + "level": 43, + "icon": 8354, + "name": "Alchemical Chart", + "xp": 30 + }, + { + "level": 43, + "icon": 8235, + "name": "Teak larder", + "xp": 750 + }, + { + "level": 44, + "icon": 8348, + "name": "Wooden Telescope", + "xp": 121 + }, + { + "level": 44, + "icon": 8029, + "name": "Weapons Rack", + "xp": 180 + }, + { + "level": 44, + "icon": 8112, + "name": "Carved Teak Bench", + "xp": 360 + }, + { + "level": 45, + "icon": 8227, + "name": "Oak Shelves 2", + "xp": 240 + }, + { + "level": 45, + "icon": 8119, + "name": "Carved Teak Table", + "xp": 600 + }, + { + "level": 45, + "icon": 8035, + "name": "Large Teak Bed", + "xp": 480 + }, + { + "level": 45, + "icon": 8177, + "name": "Maple Tree", + "xp": 122 + }, + { + "level": 46, + "icon": 8048, + "name": "Teak Dresser", + "xp": 181 + }, + { + "level": 47, + "icon": 8232, + "name": "Sink", + "xp": 300 + }, + { + "level": 47, + "icon": 8335, + "name": "Eagle Lectern", + "xp": 120 + }, + { + "level": 47, + "icon": 8336, + "name": "Demon Lectern", + "xp": 120 + }, + { + "level": 48, + "icon": 5755, + "name": "Chef's Delight", + "xp": 224 + }, + { + "level": 50, + "icon": 8328, + "name": "Teak Portal", + "xp": 270 + }, + { + "level": 50, + "icon": 8315, + "name": "Mahogany Armchair", + "xp": 280 + }, + { + "level": 50, + "icon": 8342, + "name": "Ornamental Globe", + "xp": 270 + }, + { + "level": 50, + "icon": 8331, + "name": "Teleport Focus", + "xp": 40 + }, + { + "level": 51, + "icon": 8041, + "name": "Teak Drawers", + "xp": 180 + }, + { + "level": 51, + "icon": 8025, + "name": "Combat Ring", + "xp": 630 + }, + { + "level": 52, + "icon": 8118, + "name": "Teak Table", + "xp": 270 + }, + { + "level": 52, + "icon": 8113, + "name": "Mahogany Bench", + "xp": 560 + }, + { + "level": 52, + "icon": 8120, + "name": "Mahogany Table", + "xp": 840 + }, + { + "level": 53, + "icon": 8036, + "name": "4-Poster Bed", + "xp": 450 + }, + { + "level": 54, + "icon": 8030, + "name": "Extra Weapons Rack", + "xp": 440 + }, + { + "level": 54, + "icon": 8352, + "name": "Elemental Sphere", + "xp": 580 + }, + { + "level": 55, + "icon": 8053, + "name": "Teak Clock", + "xp": 202 + }, + { + "level": 56, + "icon": 8104, + "name": "Gilded Decoration", + "xp": 1020 + }, + { + "level": 56, + "icon": 8049, + "name": "Fancy Teak Dresser", + "xp": 182 + }, + { + "level": 56, + "icon": 8228, + "name": "Teak Shelves 1", + "xp": 330 + }, + { + "level": 57, + "icon": 8337, + "name": "Teak Eagle Lectern", + "xp": 180 + }, + { + "level": 57, + "icon": 8338, + "name": "Teak Demon Lectern", + "xp": 180 + }, + { + "level": 59, + "icon": 8343, + "name": "Lunar Globe", + "xp": 570 + }, + { + "level": 60, + "icon": 8037, + "name": "Gilded 4-Poster Bed", + "xp": 1330 + }, + { + "level": 60, + "icon": 8101, + "name": "Posh Bell-Pull", + "xp": 420 + }, + { + "level": 60, + "icon": 8178, + "name": "Yew Tree", + "xp": 141 + }, + { + "level": 61, + "icon": 8114, + "name": "Gilded Bench", + "xp": 1760 + }, + { + "level": 63, + "icon": 8042, + "name": "Teak Wardrobe", + "xp": 270 + }, + { + "level": 63, + "icon": 8327, + "name": "Marble Fireplace", + "xp": 500 + }, + { + "level": 63, + "icon": 8355, + "name": "Astronomical Chart", + "xp": 45 + }, + { + "level": 64, + "icon": 8349, + "name": "Teak Telescope", + "xp": 181 + }, + { + "level": 64, + "icon": 8050, + "name": "Mahogany Dresser", + "xp": 281 + }, + { + "level": 65, + "icon": 8329, + "name": "Mahogany Portal", + "xp": 420 + }, + { + "level": 65, + "icon": 8332, + "name": "Greater Focus", + "xp": 500 + }, + { + "level": 65, + "icon": 8318, + "name": "Opulent Rug", + "xp": 360 + }, + { + "level": 66, + "icon": 8353, + "name": "Crystal of Power", + "xp": 890 + }, + { + "level": 67, + "icon": 8229, + "name": "Teak Shelves 2", + "xp": 930 + }, + { + "level": 67, + "icon": 8338, + "name": "Mahogany Demon Lectern", + "xp": 580 + }, + { + "level": 67, + "icon": 8338, + "name": "Mahogany Eagle Lectern", + "xp": 580 + }, + { + "level": 68, + "icon": 8344, + "name": "Celestial Globe", + "xp": 570 + }, + { + "level": 70, + "icon": 8172, + "name": "Dungeon Entrance", + "xp": 500 + }, + { + "level": 71, + "icon": 8026, + "name": "Ranging Pedestals", + "xp": 720 + }, + { + "level": 72, + "icon": 8121, + "name": "Opulent Table", + "xp": 3100 + }, + { + "level": 74, + "icon": 8122, + "name": "Oak Door", + "xp": 600 + }, + { + "level": 74, + "icon": 8051, + "name": "Gilded Dresser", + "xp": 582 + }, + { + "level": 75, + "icon": 8043, + "name": "Mahogany Wardrobe", + "xp": 420 + }, + { + "level": 75, + "icon": 8179, + "name": "Magic Tree", + "xp": 223 + }, + { + "level": 77, + "icon": 8341, + "name": "Armillary Globe", + "xp": 960 + }, + { + "level": 80, + "icon": 8330, + "name": "Marble Portal", + "xp": 1500 + }, + { + "level": 80, + "icon": 8333, + "name": "Scrying Pool", + "xp": 2000 + }, + { + "level": 81, + "icon": 8027, + "name": "Balance Beam", + "xp": 1000 + }, + { + "level": 83, + "icon": 8356, + "name": "Infernal Chart", + "xp": 60 + }, + { + "level": 84, + "icon": 8350, + "name": "Mahogany Telescope", + "xp": 281 + }, + { + "level": 85, + "icon": 8054, + "name": "Gilded Clock", + "xp": 602 + }, + { + "level": 86, + "icon": 8346, + "name": "Small Orrery", + "xp": 1320 + }, + { + "level": 87, + "icon": 8044, + "name": "Gilded Wardrobe", + "xp": 720 + }, + { + "level": 95, + "icon": 8347, + "name": "Large Orrery", + "xp": 1420 + } + ] +} \ No newline at end of file diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_cooking.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_cooking.json new file mode 100644 index 0000000000..d60d89d138 --- /dev/null +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_cooking.json @@ -0,0 +1,508 @@ +{ + "actions": [ + { + "level": 1, + "icon": 315, + "name": "Shrimps", + "xp": 30 + }, + { + "level": 1, + "icon": 2140, + "name": "Cooked Chicken", + "xp": 30 + }, + { + "level": 1, + "icon": 2142, + "name": "Cooked Meat", + "xp": 30 + }, + { + "level": 1, + "icon": 3228, + "name": "Cooked Rabbit", + "xp": 30 + }, + { + "level": 1, + "icon": 325, + "name": "Sardine", + "xp": 40 + }, + { + "level": 1, + "icon": 2309, + "name": "Bread", + "xp": 40 + }, + { + "level": 3, + "icon": 9436, + "name": "Sinew", + "xp": 3 + }, + { + "level": 5, + "icon": 347, + "name": "Herring", + "xp": 50 + }, + { + "level": 6, + "icon": 2084, + "name": "Fruit Blast", + "xp": 50 + }, + { + "level": 7, + "icon": 6701, + "name": "Baked Potato", + "xp": 15 + }, + { + "level": 8, + "icon": 2048, + "name": "Pineapple Punch", + "xp": 70 + }, + { + "level": 9, + "icon": 7072, + "name": "Spicy Sauce", + "xp": 24 + }, + { + "level": 10, + "icon": 355, + "name": "Mackerel", + "xp": 60 + }, + { + "level": 10, + "icon": 2325, + "name": "Redberry Pie", + "xp": 78 + }, + { + "level": 10, + "icon": 2217, + "name": "Toad Crunchies", + "xp": 100 + }, + { + "level": 11, + "icon": 7062, + "name": "Chilli Con Carne", + "xp": 55 + }, + { + "level": 11, + "icon": 9980, + "name": "Roast Bird Meat", + "xp": 62.5 + }, + { + "level": 12, + "icon": 3369, + "name": "Thin Snail Meat", + "xp": 70 + }, + { + "level": 13, + "icon": 7078, + "name": "Scrambled Egg", + "xp": 50 + }, + { + "level": 14, + "icon": 5763, + "name": "Cider", + "xp": 182 + }, + { + "level": 14, + "icon": 2205, + "name": "Worm Crunchies", + "xp": 104 + }, + { + "level": 15, + "icon": 319, + "name": "Anchovies", + "xp": 30 + }, + { + "level": 15, + "icon": 333, + "name": "Trout", + "xp": 70 + }, + { + "level": 16, + "icon": 7223, + "name": "Roast Rabbit", + "xp": 72.5 + }, + { + "level": 17, + "icon": 3371, + "name": "Lean Snail Meat", + "xp": 80 + }, + { + "level": 18, + "icon": 339, + "name": "Cod", + "xp": 75 + }, + { + "level": 18, + "icon": 2054, + "name": "Wizard Blizzard", + "xp": 110 + }, + { + "level": 19, + "icon": 1913, + "name": "Dwarven Stout", + "xp": 215 + }, + { + "level": 20, + "icon": 2080, + "name": "Short Green Guy", + "xp": 120 + }, + { + "level": 20, + "icon": 2327, + "name": "Meat Pie", + "xp": 110 + }, + { + "level": 20, + "icon": 351, + "name": "Pike", + "xp": 80 + }, + { + "level": 21, + "icon": 9988, + "name": "Roast Beast Meat", + "xp": 82.5 + }, + { + "level": 22, + "icon": 3373, + "name": "Fat Snail Meat", + "xp": 95 + }, + { + "level": 23, + "icon": 7064, + "name": "Egg And Tomato", + "xp": 50 + }, + { + "level": 24, + "icon": 1905, + "name": "Asgarnian Ale", + "xp": 248 + }, + { + "level": 25, + "icon": 329, + "name": "Salmon", + "xp": 90 + }, + { + "level": 25, + "icon": 2003, + "name": "Stew", + "xp": 117 + }, + { + "level": 25, + "icon": 2277, + "name": "Fruit Batta", + "xp": 150 + }, + { + "level": 26, + "icon": 2255, + "name": "Toad Batta", + "xp": 152 + }, + { + "level": 27, + "icon": 2253, + "name": "Worm Batta", + "xp": 154 + }, + { + "level": 28, + "icon": 2281, + "name": "Vegetable Batta", + "xp": 156 + }, + { + "level": 28, + "icon": 5988, + "name": "Sweetcorn", + "xp": 104 + }, + { + "level": 28, + "icon": 3381, + "name": "Cooked Slimy Eel", + "xp": 95 + }, + { + "level": 29, + "icon": 7170, + "name": "Mud Pie", + "xp": 128 + }, + { + "level": 30, + "icon": 361, + "name": "Tuna", + "xp": 100 + }, + { + "level": 30, + "icon": 2323, + "name": "Apple Pie", + "xp": 130 + }, + { + "level": 30, + "icon": 2191, + "name": "Worm Hole", + "xp": 170 + }, + { + "level": 30, + "icon": 3144, + "name": "Cooked Karambwan", + "xp": 190 + }, + { + "level": 32, + "icon": 2092, + "name": "Drunk Dragon", + "xp": 160 + }, + { + "level": 34, + "icon": 7178, + "name": "Garden Pie", + "xp": 138 + }, + { + "level": 35, + "icon": 1993, + "name": "Jug Of Wine", + "xp": 200 + }, + { + "level": 35, + "icon": 2289, + "name": "Plain Pizza", + "xp": 143 + }, + { + "level": 35, + "icon": 10136, + "name": "Rainbow Fish", + "xp": 110 + }, + { + "level": 37, + "icon": 2064, + "name": "Blurberry Special", + "xp": 180 + }, + { + "level": 38, + "icon": 5003, + "name": "Cave Eel", + "xp": 115 + }, + { + "level": 39, + "icon": 1911, + "name": "Dragon Bitter", + "xp": 347 + }, + { + "level": 40, + "icon": 379, + "name": "Lobster", + "xp": 120 + }, + { + "level": 40, + "icon": 1891, + "name": "Cake", + "xp": 180 + }, + { + "level": 41, + "icon": 7054, + "name": "Chilli Potato", + "xp": 165.5 + }, + { + "level": 42, + "icon": 2185, + "name": "Chocolate Bomb", + "xp": 190 + }, + { + "level": 43, + "icon": 365, + "name": "Bass", + "xp": 130 + }, + { + "level": 44, + "icon": 2955, + "name": "Moonlight Mead", + "xp": 380 + }, + { + "level": 45, + "icon": 373, + "name": "Swordfish", + "xp": 140 + }, + { + "level": 45, + "icon": 2293, + "name": "Meat Pizza", + "xp": 169 + }, + { + "level": 47, + "icon": 7188, + "name": "Fish Pie", + "xp": 164 + }, + { + "level": 50, + "icon": 2343, + "name": "Cooked Oomlie Wrap", + "xp": 30 + }, + { + "level": 50, + "icon": 1897, + "name": "Chocolate Cake", + "xp": 210 + }, + { + "level": 51, + "icon": 7056, + "name": "Egg Potato", + "xp": 195.5 + }, + { + "level": 55, + "icon": 2297, + "name": "Anchovy Pizza", + "xp": 182 + }, + { + "level": 58, + "icon": 1883, + "name": "Ugthanki Kebab (Fresh)", + "xp": 80 + }, + { + "level": 60, + "icon": 2011, + "name": "Curry", + "xp": 280 + }, + { + "level": 62, + "icon": 7946, + "name": "Monkfish", + "xp": 150 + }, + { + "level": 64, + "icon": 7058, + "name": "Mushroom Potato", + "xp": 270.5 + }, + { + "level": 65, + "icon": 2301, + "name": "Pineapple Pizza", + "xp": 188 + }, + { + "level": 67, + "icon": 7068, + "name": "Tuna And Corn", + "xp": 204 + }, + { + "level": 68, + "icon": 7060, + "name": "Tuna Potato", + "xp": 309.5 + }, + { + "level": 70, + "icon": 7198, + "name": "Admiral Pie", + "xp": 210 + }, + { + "level": 80, + "icon": 385, + "name": "Shark", + "xp": 210 + }, + { + "level": 82, + "icon": 397, + "name": "Sea Turtle", + "xp": 211.3 + }, + { + "level": 84, + "icon": 13441, + "name": "Anglerfish", + "xp": 230 + }, + { + "level": 85, + "icon": 11936, + "name": "Dark Crab", + "xp": 215 + }, + { + "level": 85, + "icon": 7208, + "name": "Wild Pie", + "xp": 240 + }, + { + "level": 91, + "icon": 391, + "name": "Manta Ray", + "xp": 216.3 + }, + { + "level": 95, + "icon": 7218, + "name": "Summer Pie", + "xp": 260 + } + ] +} \ No newline at end of file diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_crafting.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_crafting.json new file mode 100644 index 0000000000..6d70a0880e --- /dev/null +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_crafting.json @@ -0,0 +1,538 @@ +{ + "actions": [ + { + "level": 1, + "icon": 1759, + "name": "Ball Of Wool", + "xp": 2.5 + }, + { + "level": 1, + "icon": 1059, + "name": "Leather Gloves", + "xp": 13.8 + }, + { + "level": 1, + "icon": 1609, + "name": "Opal", + "xp": 15 + }, + { + "level": 1, + "icon": 1775, + "name": "Molten Glass", + "xp": 20 + }, + { + "level": 1, + "icon": 1919, + "name": "Beer Glass", + "xp": 17.5 + }, + { + "level": 4, + "icon": 4527, + "name": "Empty Candle Lantern", + "xp": 19 + }, + { + "level": 5, + "icon": 1635, + "name": "Gold Ring", + "xp": 15 + }, + { + "level": 6, + "icon": 1654, + "name": "Gold Necklace", + "xp": 20 + }, + { + "level": 7, + "icon": 1061, + "name": "Leather Boots", + "xp": 16.3 + }, + { + "level": 7, + "icon": 11068, + "name": "Gold Bracelet", + "xp": 25 + }, + { + "level": 8, + "icon": 1673, + "name": "Gold Amulet (U)", + "xp": 30 + }, + { + "level": 9, + "icon": 1167, + "name": "Cowl", + "xp": 18.5 + }, + { + "level": 10, + "icon": 9438, + "name": "Crossbow String", + "xp": 15 + }, + { + "level": 10, + "icon": 1777, + "name": "Bow String", + "xp": 15 + }, + { + "level": 11, + "icon": 1063, + "name": "Leather Vambraces", + "xp": 22 + }, + { + "level": 12, + "icon": 4525, + "name": "Empty Oil Lamp", + "xp": 25 + }, + { + "level": 13, + "icon": 1611, + "name": "Jade", + "xp": 20 + }, + { + "level": 14, + "icon": 1129, + "name": "Leather Body", + "xp": 25 + }, + { + "level": 16, + "icon": 1613, + "name": "Red Topaz", + "xp": 25 + }, + { + "level": 16, + "icon": 1718, + "name": "Holy Symbol", + "xp": 50 + }, + { + "level": 17, + "icon": 1724, + "name": "Unholy Symbol", + "xp": 50 + }, + { + "level": 18, + "icon": 1095, + "name": "Leather Chaps", + "xp": 27 + }, + { + "level": 19, + "icon": 6038, + "name": "Magic String", + "xp": 30 + }, + { + "level": 20, + "icon": 1637, + "name": "Sapphire Ring", + "xp": 40 + }, + { + "level": 20, + "icon": 1607, + "name": "Sapphire", + "xp": 50 + }, + { + "level": 21, + "icon": 5418, + "name": "Empty Sack", + "xp": 38 + }, + { + "level": 22, + "icon": 1656, + "name": "Sapphire Necklace", + "xp": 55 + }, + { + "level": 23, + "icon": 11071, + "name": "Sapphire Bracelet", + "xp": 60 + }, + { + "level": 23, + "icon": 5525, + "name": "Tiara", + "xp": 52.5 + }, + { + "level": 24, + "icon": 1675, + "name": "Sapphire Amulet (U)", + "xp": 65 + }, + { + "level": 27, + "icon": 1605, + "name": "Emerald", + "xp": 67.5 + }, + { + "level": 27, + "icon": 1639, + "name": "Emerald Ring", + "xp": 55 + }, + { + "level": 28, + "icon": 1131, + "name": "Hardleather Body", + "xp": 35 + }, + { + "level": 29, + "icon": 1658, + "name": "Emerald Necklace", + "xp": 60 + }, + { + "level": 30, + "icon": 11076, + "name": "Emerald Bracelet", + "xp": 65 + }, + { + "level": 30, + "icon": 954, + "name": "Rope", + "xp": 25 + }, + { + "level": 31, + "icon": 1677, + "name": "Emerald Amulet (U)", + "xp": 70 + }, + { + "level": 32, + "icon": 10077, + "name": "Spiky Vambraces", + "xp": 6 + }, + { + "level": 33, + "icon": 229, + "name": "Vial", + "xp": 35 + }, + { + "level": 34, + "icon": 1603, + "name": "Ruby", + "xp": 85 + }, + { + "level": 34, + "icon": 1641, + "name": "Ruby Ring", + "xp": 70 + }, + { + "level": 36, + "icon": 5376, + "name": "Basket", + "xp": 56 + }, + { + "level": 38, + "icon": 1169, + "name": "Coif", + "xp": 37 + }, + { + "level": 40, + "icon": 1660, + "name": "Ruby Necklace", + "xp": 75 + }, + { + "level": 42, + "icon": 11085, + "name": "Ruby Bracelet", + "xp": 80 + }, + { + "level": 42, + "icon": 6668, + "name": "Fishbowl", + "xp": 42.5 + }, + { + "level": 43, + "icon": 1601, + "name": "Diamond", + "xp": 107.5 + }, + { + "level": 43, + "icon": 1643, + "name": "Diamond Ring", + "xp": 85 + }, + { + "level": 46, + "icon": 567, + "name": "Unpowered Orb", + "xp": 52.5 + }, + { + "level": 49, + "icon": 4542, + "name": "Lantern Lens", + "xp": 55 + }, + { + "level": 50, + "icon": 1679, + "name": "Ruby Amulet (U)", + "xp": 85 + }, + { + "level": 54, + "icon": 1395, + "name": "Water Battlestaff", + "xp": 100 + }, + { + "level": 55, + "icon": 1645, + "name": "Dragonstone Ring", + "xp": 100 + }, + { + "level": 55, + "icon": 1615, + "name": "Dragonstone", + "xp": 137.5 + }, + { + "level": 56, + "icon": 1662, + "name": "Diamond Necklace", + "xp": 90 + }, + { + "level": 57, + "icon": 1065, + "name": "Green D'hide Vamb", + "xp": 62 + }, + { + "level": 58, + "icon": 11092, + "name": "Diamond Bracelet", + "xp": 95 + }, + { + "level": 58, + "icon": 1399, + "name": "Earth Battlestaff", + "xp": 112.5 + }, + { + "level": 60, + "icon": 1099, + "name": "Green D'hide Chaps", + "xp": 124 + }, + { + "level": 62, + "icon": 1393, + "name": "Fire Battlestaff", + "xp": 125 + }, + { + "level": 63, + "icon": 1135, + "name": "Green D'hide Body", + "xp": 186 + }, + { + "level": 66, + "icon": 1397, + "name": "Air Battlestaff", + "xp": 137.5 + }, + { + "level": 66, + "icon": 2487, + "name": "Blue D'hide Vamb", + "xp": 70 + }, + { + "level": 67, + "icon": 6564, + "name": "Onyx Ring", + "xp": 115 + }, + { + "level": 67, + "icon": 6573, + "name": "Onyx", + "xp": 167.5 + }, + { + "level": 68, + "icon": 2493, + "name": "Blue D'hide Chaps", + "xp": 140 + }, + { + "level": 70, + "icon": 1681, + "name": "Diamond Amulet (U)", + "xp": 100 + }, + { + "level": 71, + "icon": 2499, + "name": "Blue D'hide Body", + "xp": 210 + }, + { + "level": 72, + "icon": 1664, + "name": "Dragon Necklace", + "xp": 105 + }, + { + "level": 73, + "icon": 2489, + "name": "Red D'hide Vamb", + "xp": 78 + }, + { + "level": 74, + "icon": 11115, + "name": "Dragonstone Bracelet", + "xp": 110 + }, + { + "level": 75, + "icon": 2495, + "name": "Red D'hide Chaps", + "xp": 156 + }, + { + "level": 77, + "icon": 2501, + "name": "Red D'hide Body", + "xp": 234 + }, + { + "level": 79, + "icon": 2491, + "name": "Black D'hide Vamb", + "xp": 86 + }, + { + "level": 80, + "icon": 1683, + "name": "Dragonstone Amulet (U)", + "xp": 150 + }, + { + "level": 82, + "icon": 2497, + "name": "Black D'hide Chaps", + "xp": 172 + }, + { + "level": 82, + "icon": 6577, + "name": "Onyx Necklace", + "xp": 120 + }, + { + "level": 83, + "icon": 21338, + "name": "Amethyst Bolt Tips", + "xp": 60 + }, + { + "level": 84, + "icon": 2503, + "name": "Black D'hide Body", + "xp": 258 + }, + { + "level": 84, + "icon": 11130, + "name": "Onyx Bracelet", + "xp": 125 + }, + { + "level": 85, + "icon": 21350, + "name": "Amethyst Arrowtips", + "xp": 60 + }, + { + "level": 87, + "icon": 21352, + "name": "Amethyst Javelin Heads", + "xp": 60 + }, + { + "level": 87, + "icon": 10973, + "name": "Light Orb", + "xp": 70 + }, + { + "level": 89, + "icon": 19499, + "name": "Zenyte Ring", + "xp": 150 + }, + { + "level": 89, + "icon": 19493, + "name": "Zenyte", + "xp": 200 + }, + { + "level": 90, + "icon": 6579, + "name": "Onyx Amulet (U)", + "xp": 165 + }, + { + "level": 92, + "icon": 19500, + "name": "Zenyte Necklace", + "xp": 165 + }, + { + "level": 95, + "icon": 19492, + "name": "Zenyte Bracelet", + "xp": 180 + }, + { + "level": 98, + "icon": 19501, + "name": "Zenyte Amulet (U)", + "xp": 200 + } + ] +} \ No newline at end of file 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 new file mode 100644 index 0000000000..b819ad9de3 --- /dev/null +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_farming.json @@ -0,0 +1,52 @@ +{ + "bonuses": [ + { + "name": "Farmer's Outfit (+2.5%)", + "value": 0.025 + } + ], + "actions": [ + { + "level": 1, + "icon": 1942, + "name": "Potatoes", + "xp": 8 + }, + { + "level": 5, + "icon": 1957, + "name": "Onions", + "xp": 10 + }, + { + "level": 7, + "icon": 1965, + "name": "Cabbages", + "xp": 10 + }, + { + "level": 12, + "icon": 1982, + "name": "Tomatoes", + "xp": 12.5 + }, + { + "level": 20, + "icon": 5986, + "name": "Sweetcorn", + "xp": 17 + }, + { + "level": 31, + "icon": 5504, + "name": "Strawberries", + "xp": 26 + }, + { + "level": 47, + "icon": 5982, + "name": "Watermelons", + "xp": 49 + } + ] +} \ No newline at end of file diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_firemaking.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_firemaking.json new file mode 100644 index 0000000000..8bc6eaf7b4 --- /dev/null +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_firemaking.json @@ -0,0 +1,76 @@ +{ + "bonuses": [ + { + "name": "Pyromancer Outfit (+2.5%)", + "value": 0.025 + } + ], + "actions": [ + { + "level": 1, + "icon": 1511, + "name": "Logs", + "xp": 40 + }, + { + "level": 1, + "icon": 2862, + "name": "Achey Tree Logs", + "xp": 40 + }, + { + "level": 15, + "icon": 1521, + "name": "Oak Logs", + "xp": 60 + }, + { + "level": 30, + "icon": 1519, + "name": "Willow Logs", + "xp": 90 + }, + { + "level": 35, + "icon": 6333, + "name": "Teak Logs", + "xp": 105 + }, + { + "level": 42, + "icon": 10810, + "name": "Arctic Pine Logs", + "xp": 125 + }, + { + "level": 45, + "icon": 1517, + "name": "Maple Logs", + "xp": 135 + }, + { + "level": 50, + "icon": 6332, + "name": "Mahogany Logs", + "xp": 157.5 + }, + { + "level": 60, + "icon": 1515, + "name": "Yew Logs", + "xp": 202.5 + }, + { + "level": 75, + "icon": 1513, + "name": "Magic Logs", + "xp": 303.8 + }, + { + "level": 90, + "icon": 19669, + "name": "Redwood Logs", + "xp": 350 + } + ] +} \ No newline at end of file diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_fishing.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_fishing.json new file mode 100644 index 0000000000..ace00f506a --- /dev/null +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_fishing.json @@ -0,0 +1,166 @@ +{ + "bonuses": [ + { + "name": "Anglers Outfit (+2.5%)", + "value": 0.025 + } + ], + "actions": [ + { + "level": 1, + "icon": 317, + "name": "Raw Shrimps", + "xp": 10 + }, + { + "level": 5, + "icon": 327, + "name": "Raw Sardine", + "xp": 20 + }, + { + "level": 10, + "icon": 345, + "name": "Raw Herring", + "xp": 30 + }, + { + "level": 15, + "icon": 321, + "name": "Raw Anchovies", + "xp": 40 + }, + { + "level": 16, + "icon": 353, + "name": "Raw Mackerel", + "xp": 20 + }, + { + "level": 20, + "icon": 335, + "name": "Raw Trout", + "xp": 50 + }, + { + "level": 23, + "icon": 341, + "name": "Raw Cod", + "xp": 45 + }, + { + "level": 25, + "icon": 349, + "name": "Raw Pike", + "xp": 60 + }, + { + "level": 28, + "icon": 3379, + "name": "Raw Slimy Eel", + "xp": 65 + }, + { + "level": 30, + "icon": 331, + "name": "Raw Salmon", + "xp": 70 + }, + { + "level": 35, + "icon": 359, + "name": "Raw Tuna", + "xp": 80 + }, + { + "level": 38, + "icon": 10138, + "name": "Raw Rainbow Fish", + "xp": 80 + }, + { + "level": 38, + "icon": 5001, + "name": "Raw Cave Eel", + "xp": 80 + }, + { + "level": 40, + "icon": 377, + "name": "Raw Lobster", + "xp": 90 + }, + { + "level": 46, + "icon": 363, + "name": "Raw Bass", + "xp": 100 + }, + { + "level": 48, + "icon": 11328, + "name": "Leaping Trout", + "xp": 50 + }, + { + "level": 50, + "icon": 371, + "name": "Raw Swordfish", + "xp": 100 + }, + { + "level": 58, + "icon": 11330, + "name": "Leaping Salmon", + "xp": 70 + }, + { + "level": 62, + "icon": 7944, + "name": "Raw Monkfish", + "xp": 120 + }, + { + "level": 65, + "icon": 3142, + "name": "Raw Karambwan", + "xp": 50 + }, + { + "level": 70, + "icon": 11332, + "name": "Leaping Sturgeon", + "xp": 80 + }, + { + "level": 76, + "icon": 383, + "name": "Raw Shark", + "xp": 110 + }, + { + "level": 79, + "icon": 395, + "name": "Raw Sea Turtle", + "xp": 38 + }, + { + "level": 81, + "icon": 389, + "name": "Raw Manta Ray", + "xp": 46 + }, + { + "level": 82, + "icon": 13439, + "name": "Raw Anglerfish", + "xp": 120 + }, + { + "level": 85, + "icon": 11934, + "name": "Raw Dark Crab", + "xp": 130 + } + ] +} \ No newline at end of file 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 new file mode 100644 index 0000000000..b6a641532a --- /dev/null +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_fletching.json @@ -0,0 +1,550 @@ +{ + "actions": [ + { + "level": 1, + "icon": 52, + "name": "Arrow Shaft", + "xp": 5 + }, + { + "level": 1, + "icon": 53, + "name": "Headless Arrow", + "xp": 1 + }, + { + "level": 1, + "icon": 882, + "name": "Bronze Arrow", + "xp": 1.3 + }, + { + "level": 1, + "icon": 806, + "name": "Bronze Dart", + "xp": 1.8 + }, + { + "level": 5, + "icon": 2866, + "name": "Ogre Arrow", + "xp": 1 + }, + { + "level": 5, + "icon": 50, + "name": "Shortbow (U)", + "xp": 5 + }, + { + "level": 5, + "icon": 841, + "name": "Shortbow", + "xp": 5 + }, + { + "level": 9, + "icon": 877, + "name": "Bronze Bolts", + "xp": 0.5 + }, + { + "level": 9, + "icon": 9440, + "name": "Wooden Stock", + "xp": 6 + }, + { + "level": 9, + "icon": 9454, + "name": "Bronze Crossbow (U)", + "xp": 12 + }, + { + "level": 9, + "icon": 9174, + "name": "Bronze Crossbow", + "xp": 6 + }, + { + "level": 10, + "icon": 839, + "name": "Longbow", + "xp": 10 + }, + { + "level": 10, + "icon": 48, + "name": "Longbow (U)", + "xp": 10 + }, + { + "level": 11, + "icon": 879, + "name": "Opal Bolts", + "xp": 1.6 + }, + { + "level": 15, + "icon": 884, + "name": "Iron Arrow", + "xp": 2.5 + }, + { + "level": 20, + "icon": 54, + "name": "Oak Shortbow (U)", + "xp": 16.5 + }, + { + "level": 20, + "icon": 843, + "name": "Oak Shortbow", + "xp": 16.5 + }, + { + "level": 22, + "icon": 807, + "name": "Iron Dart", + "xp": 3.8 + }, + { + "level": 24, + "icon": 9442, + "name": "Oak Stock", + "xp": 16 + }, + { + "level": 24, + "icon": 9456, + "name": "Blurite Crossbow (U)", + "xp": 32 + }, + { + "level": 24, + "icon": 9176, + "name": "Blurite Crossbow", + "xp": 16 + }, + { + "level": 25, + "icon": 56, + "name": "Oak Longbow (U)", + "xp": 25 + }, + { + "level": 25, + "icon": 845, + "name": "Oak Longbow", + "xp": 25 + }, + { + "level": 27, + "icon": 22251, + "name": "Oak Shield", + "xp": 50 + }, + { + "level": 30, + "icon": 886, + "name": "Steel Arrow", + "xp": 5 + }, + { + "level": 32, + "icon": 10158, + "name": "Kebbit Bolts", + "xp": 1 + }, + { + "level": 35, + "icon": 60, + "name": "Willow Shortbow (U)", + "xp": 33.3 + }, + { + "level": 35, + "icon": 849, + "name": "Willow Shortbow", + "xp": 33.3 + }, + { + "level": 37, + "icon": 808, + "name": "Steel Dart", + "xp": 7.5 + }, + { + "level": 39, + "icon": 9140, + "name": "Iron Bolts", + "xp": 1.5 + }, + { + "level": 39, + "icon": 9444, + "name": "Willow Stock", + "xp": 22 + }, + { + "level": 39, + "icon": 9457, + "name": "Iron Crossbow (U)", + "xp": 44 + }, + { + "level": 39, + "icon": 9177, + "name": "Iron Crossbow", + "xp": 22 + }, + { + "level": 40, + "icon": 58, + "name": "Willow Longbow (U)", + "xp": 41.5 + }, + { + "level": 40, + "icon": 847, + "name": "Willow Longbow", + "xp": 41.5 + }, + { + "level": 41, + "icon": 880, + "name": "Pearl Bolts", + "xp": 3.2 + }, + { + "level": 42, + "icon": 22254, + "name": "Willow Shield", + "xp": 83 + }, + { + "level": 42, + "icon": 10159, + "name": "Long Kebbit Bolts", + "xp": 1.3 + }, + { + "level": 43, + "icon": 9145, + "name": "Silver Bolts", + "xp": 2.5 + }, + { + "level": 45, + "icon": 888, + "name": "Mithril Arrow", + "xp": 7.5 + }, + { + "level": 46, + "icon": 9141, + "name": "Steel Bolts", + "xp": 3.5 + }, + { + "level": 46, + "icon": 9446, + "name": "Teak Stock", + "xp": 27 + }, + { + "level": 46, + "icon": 9459, + "name": "Steel Crossbow (U)", + "xp": 54 + }, + { + "level": 46, + "icon": 9179, + "name": "Steel Crossbow", + "xp": 27 + }, + { + "level": 50, + "icon": 64, + "name": "Maple Shortbow (U)", + "xp": 50 + }, + { + "level": 50, + "icon": 853, + "name": "Maple Shortbow", + "xp": 50 + }, + { + "level": 51, + "icon": 881, + "name": "Barbed Bolts", + "xp": 9.5 + }, + { + "level": 52, + "icon": 809, + "name": "Mithril Dart", + "xp": 11.2 + }, + { + "level": 53, + "icon": 12926, + "name": "Toxic Blowpipe", + "xp": 120 + }, + { + "level": 54, + "icon": 9181, + "name": "Mith Crossbow", + "xp": 32 + }, + { + "level": 54, + "icon": 9448, + "name": "Maple Stock", + "xp": 32 + }, + { + "level": 54, + "icon": 9142, + "name": "Mithril Bolts", + "xp": 5 + }, + { + "level": 54, + "icon": 9461, + "name": "Mithril Crossbow (U)", + "xp": 64 + }, + { + "level": 55, + "icon": 62, + "name": "Maple Longbow (U)", + "xp": 58.5 + }, + { + "level": 55, + "icon": 11875, + "name": "Broad Bolts", + "xp": 3 + }, + { + "level": 55, + "icon": 851, + "name": "Maple Longbow", + "xp": 58 + }, + { + "level": 56, + "icon": 9337, + "name": "Sapphire Bolts", + "xp": 4.7 + }, + { + "level": 57, + "icon": 22257, + "name": "Maple Shield", + "xp": 116.5 + }, + { + "level": 58, + "icon": 9338, + "name": "Emerald Bolts", + "xp": 5.5 + }, + { + "level": 60, + "icon": 890, + "name": "Adamant Arrow", + "xp": 10 + }, + { + "level": 61, + "icon": 9143, + "name": "Adamant Bolts", + "xp": 7 + }, + { + "level": 61, + "icon": 9450, + "name": "Mahogany Stock", + "xp": 41 + }, + { + "level": 61, + "icon": 9463, + "name": "Adamant Crossbow (U)", + "xp": 82 + }, + { + "level": 61, + "icon": 9183, + "name": "Adamant Crossbow", + "xp": 41 + }, + { + "level": 63, + "icon": 9339, + "name": "Ruby Bolts", + "xp": 6.3 + }, + { + "level": 65, + "icon": 9340, + "name": "Diamond Bolts", + "xp": 7 + }, + { + "level": 65, + "icon": 857, + "name": "Yew Shortbow", + "xp": 67.5 + }, + { + "level": 65, + "icon": 68, + "name": "Yew Shortbow (U)", + "xp": 67.5 + }, + { + "level": 67, + "icon": 810, + "name": "Adamant Dart", + "xp": 15 + }, + { + "level": 69, + "icon": 9465, + "name": "Runite Crossbow (U)", + "xp": 100 + }, + { + "level": 69, + "icon": 9185, + "name": "Rune Crossbow", + "xp": 50 + }, + { + "level": 69, + "icon": 9452, + "name": "Yew Stock", + "xp": 50 + }, + { + "level": 69, + "icon": 9144, + "name": "Runite Bolts", + "xp": 10 + }, + { + "level": 70, + "icon": 855, + "name": "Yew Longbow", + "xp": 75 + }, + { + "level": 70, + "icon": 66, + "name": "Yew Longbow (U)", + "xp": 75 + }, + { + "level": 71, + "icon": 9341, + "name": "Dragonstone Bolts", + "xp": 8.2 + }, + { + "level": 72, + "icon": 22260, + "name": "Yew Shield", + "xp": 150 + }, + { + "level": 73, + "icon": 9342, + "name": "Onyx Bolts", + "xp": 9.4 + }, + { + "level": 75, + "icon": 892, + "name": "Rune Arrow", + "xp": 12.5 + }, + { + "level": 76, + "icon": 21316, + "name": "Amethyst Broad Bolts", + "xp": 10.6 + }, + { + "level": 80, + "icon": 861, + "name": "Magic Shortbow", + "xp": 83.3 + }, + { + "level": 80, + "icon": 72, + "name": "Magic Shortbow (U)", + "xp": 83.3 + }, + { + "level": 81, + "icon": 811, + "name": "Rune Dart", + "xp": 18.8 + }, + { + "level": 82, + "icon": 21326, + "name": "Amethyst Arrow", + "xp": 13.5 + }, + { + "level": 84, + "icon": 21318, + "name": "Amethyst Javelin", + "xp": 13.5 + }, + { + "level": 85, + "icon": 859, + "name": "Magic Longbow", + "xp": 91.5 + }, + { + "level": 85, + "icon": 70, + "name": "Magic Longbow (U)", + "xp": 91.5 + }, + { + "level": 87, + "icon": 22263, + "name": "Magic Shield", + "xp": 183 + }, + { + "level": 90, + "icon": 11212, + "name": "Dragon Arrow", + "xp": 15 + }, + { + "level": 92, + "icon": 22266, + "name": "Redwood Shield", + "xp": 216 + }, + { + "level": 95, + "icon": 11230, + "name": "Dragon Dart", + "xp": 25 + } + ] +} \ No newline at end of file diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_herblore.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_herblore.json new file mode 100644 index 0000000000..0b1333657e --- /dev/null +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_herblore.json @@ -0,0 +1,298 @@ +{ + "actions": [ + { + "level": 3, + "icon": 121, + "name": "Attack Potion (3)", + "xp": 25 + }, + { + "level": 3, + "icon": 249, + "name": "Guam Leaf", + "xp": 2.5 + }, + { + "level": 5, + "icon": 251, + "name": "Marrentill", + "xp": 3.8 + }, + { + "level": 5, + "icon": 175, + "name": "Antipoison (3)", + "xp": 37.5 + }, + { + "level": 8, + "icon": 4844, + "name": "Relicym's Balm (3)", + "xp": 40 + }, + { + "level": 11, + "icon": 253, + "name": "Tarromin", + "xp": 5 + }, + { + "level": 12, + "icon": 115, + "name": "Strength Potion (3)", + "xp": 50 + }, + { + "level": 15, + "icon": 3410, + "name": "Serum 207 (3)", + "xp": 50 + }, + { + "level": 20, + "icon": 255, + "name": "Harralander", + "xp": 6.3 + }, + { + "level": 22, + "icon": 127, + "name": "Restore Potion (3)", + "xp": 62.5 + }, + { + "level": 25, + "icon": 257, + "name": "Ranarr Weed", + "xp": 7.5 + }, + { + "level": 26, + "icon": 3010, + "name": "Energy Potion (3)", + "xp": 67.5 + }, + { + "level": 30, + "icon": 2998, + "name": "Toadflax", + "xp": 8 + }, + { + "level": 30, + "icon": 133, + "name": "Defence Potion (3)", + "xp": 75 + }, + { + "level": 34, + "icon": 3034, + "name": "Agility Potion (3)", + "xp": 80 + }, + { + "level": 36, + "icon": 9741, + "name": "Combat Potion (3)", + "xp": 84 + }, + { + "level": 38, + "icon": 139, + "name": "Prayer Potion (3)", + "xp": 87.5 + }, + { + "level": 40, + "icon": 259, + "name": "Irit Leaf", + "xp": 8.8 + }, + { + "level": 45, + "icon": 145, + "name": "Super Attack (3)", + "xp": 100 + }, + { + "level": 48, + "icon": 181, + "name": "Superantipoison (3)", + "xp": 106.3 + }, + { + "level": 48, + "icon": 261, + "name": "Avantoe", + "xp": 10 + }, + { + "level": 50, + "icon": 151, + "name": "Fishing Potion (3)", + "xp": 112.5 + }, + { + "level": 52, + "icon": 3018, + "name": "Super Energy (3)", + "xp": 117.5 + }, + { + "level": 53, + "icon": 10000, + "name": "Hunter Potion (3)", + "xp": 120 + }, + { + "level": 54, + "icon": 263, + "name": "Kwuarm", + "xp": 11.3 + }, + { + "level": 55, + "icon": 157, + "name": "Super Strength (3)", + "xp": 125 + }, + { + "level": 59, + "icon": 3000, + "name": "Snapdragon", + "xp": 11.8 + }, + { + "level": 60, + "icon": 187, + "name": "Weapon Poison", + "xp": 137.5 + }, + { + "level": 63, + "icon": 3026, + "name": "Super Restore (3)", + "xp": 142.5 + }, + { + "level": 65, + "icon": 265, + "name": "Cadantine", + "xp": 12.5 + }, + { + "level": 65, + "icon": 10927, + "name": "Sanfew Serum (3)", + "xp": 160 + }, + { + "level": 66, + "icon": 163, + "name": "Super Defence (3)", + "xp": 150 + }, + { + "level": 67, + "icon": 2481, + "name": "Lantadyme", + "xp": 13.1 + }, + { + "level": 68, + "icon": 5945, + "name": "Antidote+ (3)", + "xp": 155 + }, + { + "level": 69, + "icon": 2454, + "name": "Antifire Potion (3)", + "xp": 157.5 + }, + { + "level": 70, + "icon": 267, + "name": "Dwarf Weed", + "xp": 13.8 + }, + { + "level": 72, + "icon": 169, + "name": "Ranging Potion (3)", + "xp": 162.5 + }, + { + "level": 73, + "icon": 5937, + "name": "Weapon Poison (+)", + "xp": 165 + }, + { + "level": 75, + "icon": 269, + "name": "Torstol", + "xp": 15 + }, + { + "level": 76, + "icon": 3042, + "name": "Magic Potion (3)", + "xp": 172.5 + }, + { + "level": 77, + "icon": 12627, + "name": "Stamina Potion (3)", + "xp": 76.5 + }, + { + "level": 78, + "icon": 189, + "name": "Zamorak Brew (3)", + "xp": 175 + }, + { + "level": 79, + "icon": 5954, + "name": "Antidote++ (3)", + "xp": 177.5 + }, + { + "level": 81, + "icon": 6687, + "name": "Saradomin Brew (3)", + "xp": 180 + }, + { + "level": 82, + "icon": 5940, + "name": "Weapon Poison (++)", + "xp": 190 + }, + { + "level": 84, + "icon": 11953, + "name": "Extended Antifire (3)", + "xp": 82.5 + }, + { + "level": 87, + "icon": 12907, + "name": "Anti-venom(3)", + "xp": 90 + }, + { + "level": 90, + "icon": 12695, + "name": "Super Combat Potion(4)", + "xp": 150 + }, + { + "level": 94, + "icon": 12915, + "name": "Anti-venom+(3)", + "xp": 125 + } + ] +} 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 new file mode 100644 index 0000000000..35071f639f --- /dev/null +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_hunter.json @@ -0,0 +1,208 @@ +{ + "actions": [ + { + "level": 1, + "icon": 9965, + "name": "Crimson Swift", + "xp": 34 + }, + { + "level": 1, + "icon": 9953, + "name": "Polar Kebbit", + "xp": 30 + }, + { + "level": 3, + "icon": 9954, + "name": "Common Kebbit", + "xp": 36 + }, + { + "level": 5, + "icon": 9968, + "name": "Golden Warbler", + "xp": 47 + }, + { + "level": 7, + "icon": 9955, + "name": "Feldip Weasel", + "xp": 48 + }, + { + "level": 9, + "icon": 9966, + "name": "Copper Longtail", + "xp": 61 + }, + { + "level": 11, + "icon": 9967, + "name": "Cerulean Twitch", + "xp": 64.5 + }, + { + "level": 13, + "icon": 9956, + "name": "Desert Devil", + "xp": 66 + }, + { + "level": 15, + "icon": 9970, + "name": "Ruby Harvest", + "xp": 24 + }, + { + "level": 19, + "icon": 9969, + "name": "Tropical Wagtail", + "xp": 95 + }, + { + "level": 23, + "icon": 9953, + "name": "Wild Kebbit", + "xp": 128 + }, + { + "level": 25, + "icon": 9971, + "name": "Sapphire Glacialis", + "xp": 34 + }, + { + "level": 27, + "icon": 10092, + "name": "Ferret", + "xp": 115 + }, + { + "level": 27, + "icon": 9975, + "name": "White Rabbit", + "xp": 144 + }, + { + "level": 29, + "icon": 10149, + "name": "Swamp Lizard", + "xp": 152 + }, + { + "level": 31, + "icon": 10045, + "name": "Spined Larupia", + "xp": 180 + }, + { + "level": 33, + "icon": 9958, + "name": "Barb-tailed Kebbit", + "xp": 168 + }, + { + "level": 35, + "icon": 9972, + "name": "Snowy Knight", + "xp": 44 + }, + { + "level": 37, + "icon": 9957, + "name": "Prickly Kebbit", + "xp": 204 + }, + { + "level": 41, + "icon": 10051, + "name": "Horned Graahk", + "xp": 240 + }, + { + "level": 43, + "icon": 9960, + "name": "Spotted Kebbit", + "xp": 104 + }, + { + "level": 45, + "icon": 9973, + "name": "Black Warlock", + "xp": 54 + }, + { + "level": 47, + "icon": 10146, + "name": "Orange Salamander", + "xp": 224 + }, + { + "level": 49, + "icon": 9961, + "name": "Razor-backed Kebbit", + "xp": 348 + }, + { + "level": 51, + "icon": 9959, + "name": "Sabre-toothed Kebbit", + "xp": 200 + }, + { + "level": 53, + "icon": 9976, + "name": "Chinchompa", + "xp": 198.3 + }, + { + "level": 55, + "icon": 10039, + "name": "Sabre-toothed Kyatt", + "xp": 300 + }, + { + "level": 57, + "icon": 9963, + "name": "Dark Kebbit", + "xp": 132 + }, + { + "level": 59, + "icon": 10147, + "name": "Red Salamander", + "xp": 272 + }, + { + "level": 60, + "icon": 19556, + "name": "Maniacal Monkey", + "xp": 1000 + }, + { + "level": 63, + "icon": 9977, + "name": "Carnivorous Chinchompa", + "xp": 265 + }, + { + "level": 67, + "icon": 10148, + "name": "Black Salamander", + "xp": 319.5 + }, + { + "level": 69, + "icon": 9964, + "name": "Dashing Kebbit", + "xp": 156 + }, + { + "level": 73, + "icon": 5091, + "name": "Black Chinchompa", + "xp": 315 + } + ] +} \ No newline at end of file diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_magic.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_magic.json new file mode 100644 index 0000000000..a7622798e8 --- /dev/null +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_magic.json @@ -0,0 +1,1066 @@ +{ + "actions": [ + { + "level": 1, + "sprite": 15, + "name": "Wind Strike", + "xp": 5.5 + }, + { + "level": 3, + "sprite": 1247, + "name": "Reanimate Goblin", + "xp": 6 + }, + { + "level": 3, + "sprite": 16, + "name": "Confuse", + "xp": 13 + }, + { + "level": 4, + "sprite": 358, + "name": "Enchant Opal Bolt", + "xp": 9 + }, + { + "level": 5, + "sprite": 17, + "name": "Water Strike", + "xp": 7.5 + }, + { + "level": 6, + "sprite": 1269, + "name": "Lumbridge Graveyard Teleport", + "xp": 10 + }, + { + "level": 7, + "sprite": 18, + "name": "Enchant Sapphire Jewellery", + "xp": 17.5 + }, + { + "level": 7, + "sprite": 358, + "name": "Enchant Sapphire Bolt", + "xp": 17.5 + }, + { + "level": 7, + "sprite": 1264, + "name": "Reanimate Monkey", + "xp": 14 + }, + { + "level": 9, + "sprite": 19, + "name": "Earth Strike", + "xp": 9.5 + }, + { + "level": 11, + "sprite": 20, + "name": "Weaken", + "xp": 21 + }, + { + "level": 12, + "sprite": 1258, + "name": "Reanimate Imp", + "xp": 24 + }, + { + "level": 13, + "sprite": 21, + "name": "Fire Strike", + "xp": 11.5 + }, + { + "level": 14, + "sprite": 358, + "name": "Enchant Jade Bolt", + "xp": 19 + }, + { + "level": 15, + "sprite": 22, + "name": "Bones To Bananas", + "xp": 25 + }, + { + "level": 16, + "sprite": 1259, + "name": "Reanimate Minotaur", + "xp": 32 + }, + { + "level": 17, + "sprite": 1269, + "name": "Draynor Manor Teleport", + "xp": 16 + }, + { + "level": 17, + "sprite": 23, + "name": "Wind Bolt", + "xp": 13.5 + }, + { + "level": 19, + "sprite": 1257, + "name": "Reanimate Scorpion", + "xp": 38 + }, + { + "level": 19, + "sprite": 24, + "name": "Curse", + "xp": 29 + }, + { + "level": 20, + "sprite": 319, + "name": "Bind", + "xp": 30 + }, + { + "level": 21, + "sprite": 25, + "name": "Low Level Alchemy", + "xp": 31 + }, + { + "level": 21, + "sprite": 1256, + "name": "Reanimate Bear", + "xp": 42 + }, + { + "level": 22, + "sprite": 1260, + "name": "Reanimate Unicorn", + "xp": 44 + }, + { + "level": 23, + "sprite": 26, + "name": "Water Bolt", + "xp": 16.5 + }, + { + "level": 24, + "sprite": 358, + "name": "Enchant Pearl Bolt", + "xp": 29 + }, + { + "level": 25, + "sprite": 27, + "name": "Varrock Teleport", + "xp": 35 + }, + { + "level": 26, + "sprite": 1268, + "name": "Reanimate Dog", + "xp": 52 + }, + { + "level": 27, + "sprite": 28, + "name": "Enchant Emerald Jewellery", + "xp": 37 + }, + { + "level": 27, + "sprite": 358, + "name": "Enchant Emerald Bolt", + "xp": 37 + }, + { + "level": 28, + "sprite": 1271, + "name": "Mind Altar Teleport", + "xp": 22 + }, + { + "level": 29, + "sprite": 358, + "name": "Enchant Topaz Bolt", + "xp": 33 + }, + { + "level": 29, + "sprite": 29, + "name": "Earth Bolt", + "xp": 19.5 + }, + { + "level": 30, + "sprite": 1251, + "name": "Reanimate Chaos Druid", + "xp": 60 + }, + { + "level": 31, + "sprite": 30, + "name": "Lumbridge Teleport", + "xp": 41 + }, + { + "level": 33, + "sprite": 31, + "name": "Telekinetic Grab", + "xp": 43 + }, + { + "level": 34, + "sprite": 1300, + "name": "Respawn Teleport", + "xp": 27 + }, + { + "level": 35, + "sprite": 32, + "name": "Fire Bolt", + "xp": 22.5 + }, + { + "level": 37, + "sprite": 1255, + "name": "Reanimate Giant", + "xp": 74 + }, + { + "level": 37, + "sprite": 33, + "name": "Falador Teleport", + "xp": 47 + }, + { + "level": 39, + "sprite": 34, + "name": "Crumble Undead", + "xp": 24.5 + }, + { + "level": 40, + "sprite": 1301, + "name": "Salve Graveyard Teleport", + "xp": 30 + }, + { + "level": 40, + "sprite": 1254, + "name": "Reanimate Ogre", + "xp": 80 + }, + { + "level": 40, + "sprite": 355, + "name": "Teleport To House", + "xp": 30 + }, + { + "level": 41, + "sprite": 35, + "name": "Wind Blast", + "xp": 25.5 + }, + { + "level": 43, + "sprite": 36, + "name": "Superheat Item", + "xp": 53 + }, + { + "level": 43, + "sprite": 1250, + "name": "Reanimate Elf", + "xp": 86 + }, + { + "level": 45, + "sprite": 37, + "name": "Camelot Teleport", + "xp": 55.5 + }, + { + "level": 46, + "sprite": 1252, + "name": "Reanimate Troll", + "xp": 92 + }, + { + "level": 47, + "sprite": 38, + "name": "Water Blast", + "xp": 28.5 + }, + { + "level": 48, + "sprite": 1302, + "name": "Fenkenstrain's Castle Teleport", + "xp": 50 + }, + { + "level": 49, + "sprite": 39, + "name": "Enchant Ruby Jewellery", + "xp": 59 + }, + { + "level": 49, + "sprite": 358, + "name": "Enchant Ruby Bolt", + "xp": 59 + }, + { + "level": 50, + "sprite": 53, + "name": "Iban Blast", + "xp": 30 + }, + { + "level": 50, + "sprite": 329, + "name": "Smoke Rush", + "xp": 30 + }, + { + "level": 50, + "sprite": 324, + "name": "Magic Dart", + "xp": 30 + }, + { + "level": 50, + "sprite": 320, + "name": "Snare", + "xp": 60 + }, + { + "level": 51, + "sprite": 54, + "name": "Ardougne Teleport", + "xp": 61 + }, + { + "level": 52, + "sprite": 1266, + "name": "Reanimate Horror", + "xp": 104 + }, + { + "level": 52, + "sprite": 337, + "name": "Shadow Rush", + "xp": 31 + }, + { + "level": 53, + "sprite": 40, + "name": "Earth Blast", + "xp": 31.5 + }, + { + "level": 54, + "sprite": 341, + "name": "Paddewwa Teleport", + "xp": 64 + }, + { + "level": 55, + "sprite": 41, + "name": "High Level Alchemy", + "xp": 65 + }, + { + "level": 56, + "sprite": 42, + "name": "Charge Water Orb", + "xp": 56 + }, + { + "level": 56, + "sprite": 333, + "name": "Blood Rush", + "xp": 33 + }, + { + "level": 57, + "sprite": 358, + "name": "Enchant Diamond Bolt", + "xp": 67 + }, + { + "level": 57, + "sprite": 43, + "name": "Enchant Diamond Jewellery", + "xp": 67 + }, + { + "level": 57, + "sprite": 1261, + "name": "Reanimate Kalphite", + "xp": 114 + }, + { + "level": 58, + "sprite": 55, + "name": "Watchtower Teleport", + "xp": 68 + }, + { + "level": 58, + "sprite": 325, + "name": "Ice Rush", + "xp": 34 + }, + { + "level": 59, + "sprite": 44, + "name": "Fire Blast", + "xp": 34.5 + }, + { + "level": 60, + "sprite": 342, + "name": "Senntisten Teleport", + "xp": 70 + }, + { + "level": 60, + "sprite": 60, + "name": "Claws Of Guthix", + "xp": 35 + }, + { + "level": 60, + "sprite": 59, + "name": "Flames Of Zamorak", + "xp": 35 + }, + { + "level": 60, + "sprite": 61, + "name": "Saradomin Strike", + "xp": 35 + }, + { + "level": 60, + "sprite": 45, + "name": "Charge Earth Orb", + "xp": 70 + }, + { + "level": 60, + "sprite": 354, + "name": "Bones To Peaches", + "xp": 65 + }, + { + "level": 61, + "sprite": 1303, + "name": "West Ardougne Teleport", + "xp": 68 + }, + { + "level": 61, + "sprite": 323, + "name": "Trollheim Teleport", + "xp": 68 + }, + { + "level": 62, + "sprite": 1253, + "name": "Reanimate Dagannoth", + "xp": 124 + }, + { + "level": 62, + "sprite": 330, + "name": "Smoke Burst", + "xp": 36 + }, + { + "level": 62, + "sprite": 46, + "name": "Wind Wave", + "xp": 36 + }, + { + "level": 63, + "sprite": 47, + "name": "Charge Fire Orb", + "xp": 73 + }, + { + "level": 64, + "sprite": 338, + "name": "Shadow Burst", + "xp": 37 + }, + { + "level": 64, + "sprite": 357, + "name": "Teleport Ape Atoll", + "xp": 74 + }, + { + "level": 65, + "sprite": 543, + "name": "Bake Pie", + "xp": 60 + }, + { + "level": 65, + "sprite": 1304, + "name": "Harmony Island Teleport", + "xp": 74 + }, + { + "level": 65, + "sprite": 1267, + "name": "Reanimate Bloodveld", + "xp": 130 + }, + { + "level": 65, + "sprite": 563, + "name": "Geomancy", + "xp": 60 + }, + { + "level": 65, + "sprite": 48, + "name": "Water Wave", + "xp": 37.5 + }, + { + "level": 66, + "sprite": 49, + "name": "Charge Air Orb", + "xp": 76 + }, + { + "level": 66, + "sprite": 567, + "name": "Cure Plant", + "xp": 60 + }, + { + "level": 66, + "sprite": 343, + "name": "Kharyrll Teleport", + "xp": 76 + }, + { + "level": 66, + "sprite": 56, + "name": "Vulnerability", + "xp": 76 + }, + { + "level": 66, + "sprite": 577, + "name": "Monster Examine", + "xp": 61 + }, + { + "level": 67, + "sprite": 568, + "name": "Npc Contact", + "xp": 63 + }, + { + "level": 68, + "sprite": 334, + "name": "Blood Burst", + "xp": 39 + }, + { + "level": 68, + "sprite": 559, + "name": "Cure Other", + "xp": 65 + }, + { + "level": 68, + "sprite": 50, + "name": "Enchant Dragonstone Jewellery", + "xp": 78 + }, + { + "level": 68, + "sprite": 358, + "name": "Enchant Dragonstone Bolt", + "xp": 78 + }, + { + "level": 68, + "sprite": 578, + "name": "Humidify", + "xp": 65 + }, + { + "level": 69, + "sprite": 544, + "name": "Moonclan Teleport", + "xp": 66 + }, + { + "level": 69, + "sprite": 1262, + "name": "Reanimate Tzhaar", + "xp": 138 + }, + { + "level": 70, + "sprite": 51, + "name": "Earth Wave", + "xp": 40 + }, + { + "level": 70, + "sprite": 326, + "name": "Ice Burst", + "xp": 40 + }, + { + "level": 70, + "sprite": 569, + "name": "Tele Group Moonclan", + "xp": 67 + }, + { + "level": 71, + "sprite": 1305, + "name": "Cemetery Teleport", + "xp": 82 + }, + { + "level": 71, + "sprite": 562, + "name": "Cure Me", + "xp": 69 + }, + { + "level": 71, + "sprite": 579, + "name": "Hunter Kit", + "xp": 70 + }, + { + "level": 72, + "sprite": 344, + "name": "Lassar Teleport", + "xp": 82 + }, + { + "level": 72, + "sprite": 1248, + "name": "Reanimate Demon", + "xp": 144 + }, + { + "level": 72, + "sprite": 545, + "name": "Waterbirth Teleport", + "xp": 71 + }, + { + "level": 73, + "sprite": 570, + "name": "Tele Group Waterbirth", + "xp": 72 + }, + { + "level": 73, + "sprite": 57, + "name": "Enfeeble", + "xp": 83 + }, + { + "level": 74, + "sprite": 349, + "name": "Teleother Lumbridge", + "xp": 84 + }, + { + "level": 74, + "sprite": 331, + "name": "Smoke Blitz", + "xp": 42 + }, + { + "level": 74, + "sprite": 565, + "name": "Cure Group", + "xp": 74 + }, + { + "level": 75, + "sprite": 576, + "name": "Stat Spy", + "xp": 76 + }, + { + "level": 75, + "sprite": 547, + "name": "Barbarian Teleport", + "xp": 76 + }, + { + "level": 75, + "sprite": 52, + "name": "Fire Wave", + "xp": 42.5 + }, + { + "level": 76, + "sprite": 575, + "name": "Tele Group Barbarian", + "xp": 77 + }, + { + "level": 76, + "sprite": 339, + "name": "Shadow Blitz", + "xp": 43 + }, + { + "level": 76, + "sprite": 585, + "name": "Spin Flax", + "xp": 75 + }, + { + "level": 77, + "sprite": 548, + "name": "Superglass Make", + "xp": 78 + }, + { + "level": 78, + "sprite": 583, + "name": "Tan Leather", + "xp": 81 + }, + { + "level": 78, + "sprite": 549, + "name": "Khazard Teleport", + "xp": 80 + }, + { + "level": 78, + "sprite": 345, + "name": "Dareeyak Teleport", + "xp": 88 + }, + { + "level": 78, + "sprite": 1308, + "name": "Resurrect Crops", + "xp": 90 + }, + { + "level": 78, + "sprite": 1263, + "name": "Reanimate Aviansie", + "xp": 156 + }, + { + "level": 79, + "sprite": 321, + "name": "Entangle", + "xp": 89 + }, + { + "level": 79, + "sprite": 572, + "name": "Tele Group Khazard", + "xp": 81 + }, + { + "level": 79, + "sprite": 580, + "name": "Dream", + "xp": 82 + }, + { + "level": 80, + "sprite": 322, + "name": "Charge", + "xp": 180 + }, + { + "level": 80, + "sprite": 335, + "name": "Blood Blitz", + "xp": 45 + }, + { + "level": 80, + "sprite": 58, + "name": "Stun", + "xp": 90 + }, + { + "level": 80, + "sprite": 550, + "name": "String Jewellery", + "xp": 83 + }, + { + "level": 81, + "sprite": 554, + "name": "Stat Restore Pot Share", + "xp": 84 + }, + { + "level": 81, + "sprite": 362, + "name": "Wind Surge", + "xp": 44 + }, + { + "level": 82, + "sprite": 350, + "name": "Teleother Falador", + "xp": 92 + }, + { + "level": 82, + "sprite": 552, + "name": "Magic Imbue", + "xp": 86 + }, + { + "level": 82, + "sprite": 327, + "name": "Ice Blitz", + "xp": 46 + }, + { + "level": 83, + "sprite": 553, + "name": "Fertile Soil", + "xp": 87 + }, + { + "level": 83, + "sprite": 1306, + "name": "Barrows Teleport", + "xp": 90 + }, + { + "level": 84, + "sprite": 346, + "name": "Carrallangar Teleport", + "xp": 82 + }, + { + "level": 84, + "sprite": 551, + "name": "Boost Potion Share", + "xp": 88 + }, + { + "level": 85, + "sprite": 1265, + "name": "Reanimate Abyssal Creature", + "xp": 170 + }, + { + "level": 85, + "sprite": 363, + "name": "Water Surge", + "xp": 46 + }, + { + "level": 85, + "sprite": 555, + "name": "Fishing Guild Teleport", + "xp": 89 + }, + { + "level": 85, + "sprite": 352, + "name": "Tele Block", + "xp": 80 + }, + { + "level": 85, + "sprite": 359, + "name": "Teleport To Bounty Target", + "xp": 45 + }, + { + "level": 86, + "sprite": 332, + "name": "Smoke Barrage", + "xp": 48 + }, + { + "level": 86, + "sprite": 573, + "name": "Tele Group Fishing Guild", + "xp": 90 + }, + { + "level": 86, + "sprite": 581, + "name": "Plank Make", + "xp": 90 + }, + { + "level": 87, + "sprite": 556, + "name": "Catherby Teleport", + "xp": 92 + }, + { + "level": 87, + "sprite": 353, + "name": "Enchant Onyx Jewellery", + "xp": 97 + }, + { + "level": 87, + "sprite": 358, + "name": "Enchant Onyx Bolt", + "xp": 97 + }, + { + "level": 88, + "sprite": 340, + "name": "Shadow Barrage", + "xp": 48 + }, + { + "level": 88, + "sprite": 574, + "name": "Tele Group Catherby", + "xp": 93 + }, + { + "level": 89, + "sprite": 557, + "name": "Ice Plateau Teleport", + "xp": 96 + }, + { + "level": 89, + "sprite": 584, + "name": "Recharge Dragonstone", + "xp": 97.5 + }, + { + "level": 90, + "sprite": 347, + "name": "Annakarl Teleport", + "xp": 100 + }, + { + "level": 90, + "sprite": 364, + "name": "Earth Surge", + "xp": 48 + }, + { + "level": 90, + "sprite": 575, + "name": "Tele Group Ice Plateau", + "xp": 99 + }, + { + "level": 90, + "sprite": 351, + "name": "Teleother Camelot", + "xp": 100 + }, + { + "level": 90, + "sprite": 1307, + "name": "Ape Atoll Teleport", + "xp": 100 + }, + { + "level": 91, + "sprite": 558, + "name": "Energy Transfer", + "xp": 100 + }, + { + "level": 92, + "sprite": 336, + "name": "Blood Barrage", + "xp": 51 + }, + { + "level": 92, + "sprite": 560, + "name": "Heal Other", + "xp": 101 + }, + { + "level": 93, + "sprite": 561, + "name": "Vengeance Other", + "xp": 108 + }, + { + "level": 93, + "sprite": 361, + "name": "Enchant Zenyte Jewellery", + "xp": 110 + }, + { + "level": 93, + "sprite": 1249, + "name": "Reanimate Dragon", + "xp": 186 + }, + { + "level": 94, + "sprite": 328, + "name": "Ice Barrage", + "xp": 52 + }, + { + "level": 94, + "sprite": 564, + "name": "Vengeance", + "xp": 112 + }, + { + "level": 95, + "sprite": 566, + "name": "Heal Group", + "xp": 124 + }, + { + "level": 95, + "sprite": 361, + "name": "Fire Surge", + "xp": 51 + }, + { + "level": 96, + "sprite": 348, + "name": "Ghorrock Teleport", + "xp": 106 + }, + { + "level": 96, + "sprite": 582, + "name": "Spellbook Swap", + "xp": 130 + } + ] +} \ No newline at end of file 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 new file mode 100644 index 0000000000..1a21aa0de1 --- /dev/null +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_mining.json @@ -0,0 +1,142 @@ +{ + "bonuses": [ + { + "name": "Prospector Outfit (+2.5%)", + "value": 0.025 + } + ], + "actions": [ + { + "level": 1, + "icon": 434, + "name": "Clay", + "xp": 5 + }, + { + "level": 1, + "icon": 1436, + "name": "Rune Essence", + "xp": 5 + }, + { + "level": 1, + "icon": 436, + "name": "Copper Ore", + "xp": 17.5 + }, + { + "level": 1, + "icon": 438, + "name": "Tin Ore", + "xp": 17.5 + }, + { + "level": 10, + "icon": 3211, + "name": "Limestone", + "xp": 26.5 + }, + { + "level": 15, + "icon": 440, + "name": "Iron Ore", + "xp": 35 + }, + { + "level": 20, + "icon": 442, + "name": "Silver Ore", + "xp": 40 + }, + { + "level": 30, + "icon": 7936, + "name": "Pure Essence", + "xp": 5 + }, + { + "level": 30, + "icon": 453, + "name": "Coal", + "xp": 50 + }, + { + "level": 35, + "icon": 6977, + "name": "Sandstone (10kg)", + "xp": 60 + }, + { + "level": 35, + "icon": 6975, + "name": "Sandstone (5kg)", + "xp": 50 + }, + { + "level": 35, + "icon": 6973, + "name": "Sandstone (2kg)", + "xp": 40 + }, + { + "level": 35, + "icon": 6971, + "name": "Sandstone (1kg)", + "xp": 30 + }, + { + "level": 38, + "icon": 13445, + "name": "Dense Essence Block", + "xp": 12 + }, + { + "level": 40, + "icon": 444, + "name": "Gold Ore", + "xp": 65 + }, + { + "level": 45, + "icon": 6979, + "name": "Granite (500g)", + "xp": 50 + }, + { + "level": 45, + "icon": 6981, + "name": "Granite (2kg)", + "xp": 60 + }, + { + "level": 45, + "icon": 6983, + "name": "Granite (5kg)", + "xp": 75 + }, + { + "level": 55, + "icon": 447, + "name": "Mithril Ore", + "xp": 80 + }, + { + "level": 70, + "icon": 449, + "name": "Adamantite Ore", + "xp": 95 + }, + { + "level": 85, + "icon": 451, + "name": "Runite Ore", + "xp": 125 + }, + { + "level": 92, + "icon": 21347, + "name": "Amethyst", + "xp": 240 + } + ] +} \ No newline at end of file diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_prayer.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_prayer.json new file mode 100644 index 0000000000..82d59a4314 --- /dev/null +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_prayer.json @@ -0,0 +1,284 @@ +{ + "bonuses": [ + { + "name": "Lit Gilded Altar (+350%)", + "value": 3.5 + }, + { + "name": "Ectofuntus (+400%)", + "value": 4 + } + ], + "actions": [ + { + "level": 1, + "icon": 526, + "name": "Bones", + "xp": 4.5 + }, + { + "level": 1, + "icon": 13480, + "name": "Ensouled Elf Head", + "xp": 754 + }, + { + "level": 1, + "icon": 13456, + "name": "Ensouled Minotaur Head", + "xp": 364 + }, + { + "level": 1, + "icon": 13459, + "name": "Ensouled Scorpion Head", + "xp": 454 + }, + { + "level": 1, + "icon": 13462, + "name": "Ensouled Bear Head", + "xp": 480 + }, + { + "level": 1, + "icon": 13465, + "name": "Ensouled Unicorn Head", + "xp": 494 + }, + { + "level": 1, + "icon": 13468, + "name": "Ensouled Dog Head", + "xp": 520 + }, + { + "level": 1, + "icon": 13471, + "name": "Ensouled Chaos Druid Head", + "xp": 584 + }, + { + "level": 1, + "icon": 13474, + "name": "Ensouled Giant Head", + "xp": 650 + }, + { + "level": 1, + "icon": 13477, + "name": "Ensouled Ogre Head", + "xp": 716 + }, + { + "level": 1, + "icon": 13483, + "name": "Ensouled Troll Head", + "xp": 780 + }, + { + "level": 1, + "icon": 13450, + "name": "Ensouled Monkey Head", + "xp": 182 + }, + { + "level": 1, + "icon": 13486, + "name": "Ensouled Horror Head", + "xp": 832 + }, + { + "level": 1, + "icon": 13489, + "name": "Ensouled Kalphite Head", + "xp": 884 + }, + { + "level": 1, + "icon": 13492, + "name": "Ensouled Dagannoth Head", + "xp": 936 + }, + { + "level": 1, + "icon": 13495, + "name": "Ensouled Bloodveld Head", + "xp": 1040 + }, + { + "level": 1, + "icon": 13498, + "name": "Ensouled Tzhaar Head", + "xp": 1104 + }, + { + "level": 1, + "icon": 13501, + "name": "Ensouled Demon Head", + "xp": 1170 + }, + { + "level": 1, + "icon": 13504, + "name": "Ensouled Aviansie Head", + "xp": 1234 + }, + { + "level": 1, + "icon": 13507, + "name": "Ensouled Abyssal Head", + "xp": 1300 + }, + { + "level": 1, + "icon": 13510, + "name": "Ensouled Dragon Head", + "xp": 1560 + }, + { + "level": 1, + "icon": 13453, + "name": "Ensouled Imp Head", + "xp": 286 + }, + { + "level": 1, + "icon": 13447, + "name": "Ensouled Goblin Head", + "xp": 130 + }, + { + "level": 1, + "icon": 2859, + "name": "Wolf Bones", + "xp": 4.5 + }, + { + "level": 1, + "icon": 3396, + "name": "Loar Remains", + "xp": 33 + }, + { + "level": 1, + "icon": 528, + "name": "Burnt Bones", + "xp": 4.5 + }, + { + "level": 1, + "icon": 3179, + "name": "Monkey Bones", + "xp": 5 + }, + { + "level": 1, + "icon": 530, + "name": "Bat Bones", + "xp": 5.3 + }, + { + "level": 1, + "icon": 3125, + "name": "Jogre Bones", + "xp": 15 + }, + { + "level": 1, + "icon": 532, + "name": "Big Bones", + "xp": 15 + }, + { + "level": 1, + "icon": 4812, + "name": "Zogre Bones", + "xp": 22.5 + }, + { + "level": 1, + "icon": 3123, + "name": "Shaikahan Bones", + "xp": 25 + }, + { + "level": 1, + "icon": 534, + "name": "Babydragon Bones", + "xp": 30 + }, + { + "level": 1, + "icon": 3398, + "name": "Phrin Remains", + "xp": 46.5 + }, + { + "level": 1, + "icon": 4834, + "name": "Ourg Bones", + "xp": 140 + }, + { + "level": 1, + "icon": 3400, + "name": "Riyl Remains", + "xp": 59.5 + }, + { + "level": 1, + "icon": 6812, + "name": "Wyvern Bones", + "xp": 72 + }, + { + "level": 1, + "icon": 536, + "name": "Dragon Bones", + "xp": 72 + }, + { + "level": 1, + "icon": 3402, + "name": "Asyn Remains", + "xp": 82.5 + }, + { + "level": 1, + "icon": 4830, + "name": "Fayrg Bones", + "xp": 84 + }, + { + "level": 1, + "icon": 3404, + "name": "Fiyr Remains", + "xp": 84 + }, + { + "level": 1, + "icon": 11943, + "name": "Lava Dragon Bones", + "xp": 85 + }, + { + "level": 1, + "icon": 4832, + "name": "Raurg Bones", + "xp": 96 + }, + { + "level": 1, + "icon": 6729, + "name": "Dagannoth Bones", + "xp": 125 + }, + { + "level": 70, + "icon": 22124, + "name": "Superior Dragon Bones", + "xp": 150 + } + ] +} \ No newline at end of file diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_runecraft.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_runecraft.json new file mode 100644 index 0000000000..e71b503004 --- /dev/null +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_runecraft.json @@ -0,0 +1,202 @@ +{ + "actions": [ + { + "level": 1, + "icon": 5527, + "name": "Air Tiara", + "xp": 25 + }, + { + "level": 1, + "icon": 5541, + "name": "Nature Tiara", + "xp": 45 + }, + { + "level": 1, + "icon": 5529, + "name": "Mind Tiara", + "xp": 27.5 + }, + { + "level": 1, + "icon": 556, + "name": "Air Rune", + "xp": 5 + }, + { + "level": 1, + "icon": 5547, + "name": "Death Tiara", + "xp": 50 + }, + { + "level": 1, + "icon": 5545, + "name": "Law Tiara", + "xp": 47.5 + }, + { + "level": 1, + "icon": 22121, + "name": "Wrath Tiara", + "xp": 52.5 + }, + { + "level": 1, + "icon": 5543, + "name": "Chaos Tiara", + "xp": 42.5 + }, + { + "level": 1, + "icon": 5533, + "name": "Body Tiara", + "xp": 37.5 + }, + { + "level": 1, + "icon": 5537, + "name": "Fire Tiara", + "xp": 35 + }, + { + "level": 1, + "icon": 5535, + "name": "Earth Tiara", + "xp": 32.5 + }, + { + "level": 1, + "icon": 5531, + "name": "Water Tiara", + "xp": 30 + }, + { + "level": 1, + "icon": 5539, + "name": "Cosmic Tiara", + "xp": 40 + }, + { + "level": 2, + "icon": 558, + "name": "Mind Rune", + "xp": 5.5 + }, + { + "level": 5, + "icon": 555, + "name": "Water Rune", + "xp": 6 + }, + { + "level": 5, + "icon": 4697, + "name": "Smoke Rune", + "xp": 9.5 + }, + { + "level": 6, + "icon": 4695, + "name": "Mist Rune", + "xp": 8.5 + }, + { + "level": 9, + "icon": 557, + "name": "Earth Rune", + "xp": 6.5 + }, + { + "level": 10, + "icon": 4696, + "name": "Dust Rune", + "xp": 9 + }, + { + "level": 13, + "icon": 4698, + "name": "Mud Rune", + "xp": 9.5 + }, + { + "level": 14, + "icon": 554, + "name": "Fire Rune", + "xp": 7 + }, + { + "level": 19, + "icon": 4694, + "name": "Steam Rune", + "xp": 10 + }, + { + "level": 20, + "icon": 559, + "name": "Body Rune", + "xp": 7.5 + }, + { + "level": 23, + "icon": 4699, + "name": "Lava Rune", + "xp": 10.5 + }, + { + "level": 27, + "icon": 564, + "name": "Cosmic Rune", + "xp": 8 + }, + { + "level": 35, + "icon": 562, + "name": "Chaos Rune", + "xp": 8.5 + }, + { + "level": 40, + "icon": 9075, + "name": "Astral Rune", + "xp": 8.7 + }, + { + "level": 44, + "icon": 561, + "name": "Nature Rune", + "xp": 9 + }, + { + "level": 54, + "icon": 563, + "name": "Law Rune", + "xp": 9.5 + }, + { + "level": 65, + "icon": 560, + "name": "Death Rune", + "xp": 10 + }, + { + "level": 77, + "icon": 565, + "name": "Blood Rune", + "xp": 23.8 + }, + { + "level": 90, + "icon": 566, + "name": "Soul Rune", + "xp": 29.7 + }, + { + "level": 95, + "icon": 21880, + "name": "Wrath Rune", + "xp": 8 + } + ] +} \ No newline at end of file diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_smithing.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_smithing.json new file mode 100644 index 0000000000..625ae2673a --- /dev/null +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_smithing.json @@ -0,0 +1,1036 @@ +{ + "actions": [ + { + "level": 1, + "icon": 2349, + "name": "Bronze Bar", + "xp": 6.3 + }, + { + "level": 1, + "icon": 1351, + "name": "Bronze Axe", + "xp": 12.5 + }, + { + "level": 1, + "icon": 1205, + "name": "Bronze Dagger", + "xp": 12.5 + }, + { + "level": 2, + "icon": 1422, + "name": "Bronze Mace", + "xp": 12.5 + }, + { + "level": 3, + "icon": 1139, + "name": "Bronze Med Helm", + "xp": 12.5 + }, + { + "level": 3, + "icon": 9375, + "name": "Bronze Bolts (Unf)", + "xp": 12.5 + }, + { + "level": 4, + "icon": 4819, + "name": "Bronze Nails", + "xp": 12.5 + }, + { + "level": 4, + "icon": 1277, + "name": "Bronze Sword", + "xp": 12.5 + }, + { + "level": 4, + "icon": 1794, + "name": "Bronze Wire", + "xp": 12.5 + }, + { + "level": 4, + "icon": 819, + "name": "Bronze Dart Tip", + "xp": 12.5 + }, + { + "level": 5, + "icon": 39, + "name": "Bronze Arrowtips", + "xp": 12.5 + }, + { + "level": 5, + "icon": 1321, + "name": "Bronze Scimitar", + "xp": 25 + }, + { + "level": 6, + "icon": 19570, + "name": "Bronze Javelin Heads", + "xp": 12.5 + }, + { + "level": 6, + "icon": 1291, + "name": "Bronze Longsword", + "xp": 25 + }, + { + "level": 6, + "icon": 9420, + "name": "Bronze Limbs", + "xp": 12.5 + }, + { + "level": 7, + "icon": 864, + "name": "Bronze Knife", + "xp": 12.5 + }, + { + "level": 7, + "icon": 1155, + "name": "Bronze Full Helm", + "xp": 25 + }, + { + "level": 8, + "icon": 1173, + "name": "Bronze Sq Shield", + "xp": 25 + }, + { + "level": 9, + "icon": 1337, + "name": "Bronze Warhammer", + "xp": 37.5 + }, + { + "level": 10, + "icon": 1375, + "name": "Bronze Battleaxe", + "xp": 37.5 + }, + { + "level": 11, + "icon": 1103, + "name": "Bronze Chainbody", + "xp": 37.5 + }, + { + "level": 12, + "icon": 1189, + "name": "Bronze Kiteshield", + "xp": 37.5 + }, + { + "level": 13, + "icon": 3095, + "name": "Bronze Claws", + "xp": 25 + }, + { + "level": 14, + "icon": 1307, + "name": "Bronze 2h Sword", + "xp": 37.5 + }, + { + "level": 15, + "icon": 2351, + "name": "Iron Bar", + "xp": 12.5 + }, + { + "level": 15, + "icon": 1203, + "name": "Iron Dagger", + "xp": 25 + }, + { + "level": 16, + "icon": 1349, + "name": "Iron Axe", + "xp": 25 + }, + { + "level": 16, + "icon": 1075, + "name": "Bronze Platelegs", + "xp": 37.5 + }, + { + "level": 16, + "icon": 1087, + "name": "Bronze Plateskirt", + "xp": 37.5 + }, + { + "level": 17, + "icon": 7225, + "name": "Iron Spit", + "xp": 25 + }, + { + "level": 17, + "icon": 1420, + "name": "Iron Mace", + "xp": 25 + }, + { + "level": 18, + "icon": 9377, + "name": "Iron Bolts (Unf)", + "xp": 25 + }, + { + "level": 18, + "icon": 1117, + "name": "Bronze Platebody", + "xp": 62.5 + }, + { + "level": 18, + "icon": 1137, + "name": "Iron Med Helm", + "xp": 25 + }, + { + "level": 19, + "icon": 4820, + "name": "Iron Nails", + "xp": 25 + }, + { + "level": 19, + "icon": 820, + "name": "Iron Dart Tip", + "xp": 25 + }, + { + "level": 19, + "icon": 1279, + "name": "Iron Sword", + "xp": 25 + }, + { + "level": 20, + "icon": 2355, + "name": "Silver Bar", + "xp": 13.7 + }, + { + "level": 20, + "icon": 40, + "name": "Iron Arrowtips", + "xp": 25 + }, + { + "level": 20, + "icon": 1323, + "name": "Iron Scimitar", + "xp": 50 + }, + { + "level": 21, + "icon": 1293, + "name": "Iron Longsword", + "xp": 50 + }, + { + "level": 21, + "icon": 19572, + "name": "Iron Javelin Heads", + "xp": 25 + }, + { + "level": 22, + "icon": 1153, + "name": "Iron Full Helm", + "xp": 50 + }, + { + "level": 22, + "icon": 863, + "name": "Iron Knife", + "xp": 25 + }, + { + "level": 23, + "icon": 9423, + "name": "Iron Limbs", + "xp": 25 + }, + { + "level": 23, + "icon": 1175, + "name": "Iron Sq Shield", + "xp": 50 + }, + { + "level": 24, + "icon": 1335, + "name": "Iron Warhammer", + "xp": 75 + }, + { + "level": 25, + "icon": 1363, + "name": "Iron Battleaxe", + "xp": 75 + }, + { + "level": 26, + "icon": 4540, + "name": "Oil Lantern Frame", + "xp": 25 + }, + { + "level": 26, + "icon": 1101, + "name": "Iron Chainbody", + "xp": 75 + }, + { + "level": 27, + "icon": 1191, + "name": "Iron Kiteshield", + "xp": 75 + }, + { + "level": 28, + "icon": 3096, + "name": "Iron Claws", + "xp": 50 + }, + { + "level": 29, + "icon": 1309, + "name": "Iron 2h Sword", + "xp": 75 + }, + { + "level": 30, + "icon": 2353, + "name": "Steel Bar (Blast Furnace)", + "xp": 17.5 + }, + { + "level": 30, + "icon": 1207, + "name": "Steel Dagger", + "xp": 27 + }, + { + "level": 30, + "icon": 2353, + "name": "Steel Bar", + "xp": 17.5 + }, + { + "level": 31, + "icon": 1081, + "name": "Iron Plateskirt", + "xp": 75 + }, + { + "level": 31, + "icon": 1067, + "name": "Iron Platelegs", + "xp": 75 + }, + { + "level": 31, + "icon": 1353, + "name": "Steel Axe", + "xp": 37 + }, + { + "level": 32, + "icon": 1424, + "name": "Steel Mace", + "xp": 37 + }, + { + "level": 33, + "icon": 1115, + "name": "Iron Platebody", + "xp": 125 + }, + { + "level": 33, + "icon": 1141, + "name": "Steel Med Helm", + "xp": 37 + }, + { + "level": 33, + "icon": 9378, + "name": "Steel Bolts (Unf)", + "xp": 37 + }, + { + "level": 34, + "icon": 821, + "name": "Steel Dart Tip", + "xp": 37 + }, + { + "level": 34, + "icon": 1539, + "name": "Steel Nails", + "xp": 37 + }, + { + "level": 34, + "icon": 1281, + "name": "Steel Sword", + "xp": 37 + }, + { + "level": 35, + "icon": 2, + "name": "Cannonball", + "xp": 25.6 + }, + { + "level": 35, + "icon": 1325, + "name": "Steel Scimitar", + "xp": 75 + }, + { + "level": 35, + "icon": 41, + "name": "Steel Arrowtips", + "xp": 37 + }, + { + "level": 36, + "icon": 9425, + "name": "Steel Limbs", + "xp": 37 + }, + { + "level": 36, + "icon": 2370, + "name": "Steel Studs", + "xp": 37 + }, + { + "level": 36, + "icon": 1295, + "name": "Steel Longsword", + "xp": 75 + }, + { + "level": 36, + "icon": 19574, + "name": "Steel Javelin Heads", + "xp": 37.5 + }, + { + "level": 37, + "icon": 865, + "name": "Steel Knife", + "xp": 37.5 + }, + { + "level": 37, + "icon": 1157, + "name": "Steel Full Helm", + "xp": 75 + }, + { + "level": 38, + "icon": 1177, + "name": "Steel Sq Shield", + "xp": 75 + }, + { + "level": 39, + "icon": 1339, + "name": "Steel Warhammer", + "xp": 112 + }, + { + "level": 40, + "icon": 1365, + "name": "Steel Battleaxe", + "xp": 112 + }, + { + "level": 40, + "icon": 2357, + "name": "Gold Bar (Goldsmith Gauntlets)", + "xp": 56.2 + }, + { + "level": 40, + "icon": 2357, + "name": "Gold Bar", + "xp": 22.5 + }, + { + "level": 41, + "icon": 1105, + "name": "Steel Chainbody", + "xp": 112 + }, + { + "level": 42, + "icon": 1193, + "name": "Steel Kiteshield", + "xp": 112 + }, + { + "level": 43, + "icon": 3097, + "name": "Steel Claws", + "xp": 75 + }, + { + "level": 44, + "icon": 1311, + "name": "Steel 2h Sword", + "xp": 112 + }, + { + "level": 46, + "icon": 1069, + "name": "Steel Platelegs", + "xp": 112 + }, + { + "level": 46, + "icon": 1083, + "name": "Steel Plateskirt", + "xp": 112 + }, + { + "level": 48, + "icon": 1119, + "name": "Steel Platebody", + "xp": 187.5 + }, + { + "level": 49, + "icon": 4544, + "name": "Bullseye Lantern (Unf)", + "xp": 37 + }, + { + "level": 50, + "icon": 1209, + "name": "Mithril Dagger", + "xp": 50 + }, + { + "level": 50, + "icon": 2359, + "name": "Mithril Bar (Blast Furnace)", + "xp": 30 + }, + { + "level": 50, + "icon": 2359, + "name": "Mithril Bar", + "xp": 30 + }, + { + "level": 51, + "icon": 1355, + "name": "Mithril Axe", + "xp": 50 + }, + { + "level": 52, + "icon": 1428, + "name": "Mithril Mace", + "xp": 50 + }, + { + "level": 53, + "icon": 1143, + "name": "Mithril Med Helm", + "xp": 50 + }, + { + "level": 53, + "icon": 9379, + "name": "Mithril Bolts (Unf)", + "xp": 50 + }, + { + "level": 54, + "icon": 1285, + "name": "Mithril Sword", + "xp": 50 + }, + { + "level": 54, + "icon": 822, + "name": "Mithril Dart Tip", + "xp": 50 + }, + { + "level": 54, + "icon": 4822, + "name": "Mithril Nails", + "xp": 50 + }, + { + "level": 55, + "icon": 42, + "name": "Mithril Arrowtips", + "xp": 50 + }, + { + "level": 55, + "icon": 1329, + "name": "Mithril Scimitar", + "xp": 100 + }, + { + "level": 56, + "icon": 1299, + "name": "Mithril Longsword", + "xp": 100 + }, + { + "level": 56, + "icon": 19576, + "name": "Mithril Javelin Heads", + "xp": 50 + }, + { + "level": 56, + "icon": 9427, + "name": "Mithril Limbs", + "xp": 50 + }, + { + "level": 57, + "icon": 1159, + "name": "Mithril Full Helm", + "xp": 100 + }, + { + "level": 57, + "icon": 866, + "name": "Mithril Knife", + "xp": 50 + }, + { + "level": 58, + "icon": 1181, + "name": "Mithril Sq Shield", + "xp": 100 + }, + { + "level": 59, + "icon": 9416, + "name": "Mith Grapple Tip", + "xp": 50 + }, + { + "level": 59, + "icon": 1343, + "name": "Mithril Warhammer", + "xp": 150 + }, + { + "level": 60, + "icon": 1187, + "name": "Dragon Sq Shield", + "xp": 75 + }, + { + "level": 60, + "icon": 1369, + "name": "Mithril Battleaxe", + "xp": 150 + }, + { + "level": 61, + "icon": 1109, + "name": "Mithril Chainbody", + "xp": 150 + }, + { + "level": 62, + "icon": 1197, + "name": "Mithril Kiteshield", + "xp": 150 + }, + { + "level": 63, + "icon": 3099, + "name": "Mithril Claws", + "xp": 100 + }, + { + "level": 64, + "icon": 1315, + "name": "Mithril 2h Sword", + "xp": 150 + }, + { + "level": 66, + "icon": 1085, + "name": "Mithril Plateskirt", + "xp": 150 + }, + { + "level": 66, + "icon": 1071, + "name": "Mithril Platelegs", + "xp": 150 + }, + { + "level": 68, + "icon": 1121, + "name": "Mithril Platebody", + "xp": 250 + }, + { + "level": 70, + "icon": 2361, + "name": "Adamantite Bar (Blast Furnace)", + "xp": 37.5 + }, + { + "level": 70, + "icon": 1211, + "name": "Adamant Dagger", + "xp": 62.5 + }, + { + "level": 70, + "icon": 2361, + "name": "Adamantite Bar", + "xp": 37.5 + }, + { + "level": 71, + "icon": 1357, + "name": "Adamant Axe", + "xp": 62.5 + }, + { + "level": 72, + "icon": 1430, + "name": "Adamant Mace", + "xp": 62.5 + }, + { + "level": 73, + "icon": 9380, + "name": "Adamant Bolts (Unf)", + "xp": 62.5 + }, + { + "level": 73, + "icon": 1145, + "name": "Adamant Med Helm", + "xp": 62.5 + }, + { + "level": 74, + "icon": 823, + "name": "Adamant Dart Tip", + "xp": 62.5 + }, + { + "level": 74, + "icon": 1287, + "name": "Adamant Sword", + "xp": 62.5 + }, + { + "level": 74, + "icon": 4823, + "name": "Adamantite Nails", + "xp": 62.5 + }, + { + "level": 75, + "icon": 43, + "name": "Adamant Arrowtips", + "xp": 62.5 + }, + { + "level": 75, + "icon": 1331, + "name": "Adamant Scimitar", + "xp": 125 + }, + { + "level": 76, + "icon": 9429, + "name": "Adamantite Limbs", + "xp": 62.5 + }, + { + "level": 76, + "icon": 1301, + "name": "Adamant Longsword", + "xp": 125 + }, + { + "level": 76, + "icon": 19578, + "name": "Adamant Javelin Heads", + "xp": 62.5 + }, + { + "level": 77, + "icon": 1161, + "name": "Adamant Full Helm", + "xp": 125 + }, + { + "level": 77, + "icon": 867, + "name": "Adamant Knife", + "xp": 62.5 + }, + { + "level": 78, + "icon": 1183, + "name": "Adamant Sq Shield", + "xp": 125 + }, + { + "level": 79, + "icon": 1345, + "name": "Adamant Warhammer", + "xp": 187.5 + }, + { + "level": 80, + "icon": 1371, + "name": "Adamant Battleaxe", + "xp": 187.5 + }, + { + "level": 81, + "icon": 1111, + "name": "Adamant Chainbody", + "xp": 187.5 + }, + { + "level": 82, + "icon": 1199, + "name": "Adamant Kiteshield", + "xp": 187.5 + }, + { + "level": 83, + "icon": 3100, + "name": "Adamant Claws", + "xp": 125 + }, + { + "level": 84, + "icon": 1317, + "name": "Adamant 2h Sword", + "xp": 187.5 + }, + { + "level": 85, + "icon": 2363, + "name": "Runite Bar", + "xp": 50 + }, + { + "level": 85, + "icon": 2363, + "name": "Runite Bar (Blast Furnace)", + "xp": 50 + }, + { + "level": 85, + "icon": 1213, + "name": "Rune Dagger", + "xp": 75 + }, + { + "level": 86, + "icon": 1359, + "name": "Rune Axe", + "xp": 75 + }, + { + "level": 86, + "icon": 1091, + "name": "Adamant Plateskirt", + "xp": 187.5 + }, + { + "level": 86, + "icon": 1073, + "name": "Adamant Platelegs", + "xp": 187.5 + }, + { + "level": 87, + "icon": 1432, + "name": "Rune Mace", + "xp": 75 + }, + { + "level": 88, + "icon": 9381, + "name": "Runite Bolts (Unf)", + "xp": 75 + }, + { + "level": 88, + "icon": 1147, + "name": "Rune Med Helm", + "xp": 75 + }, + { + "level": 88, + "icon": 1123, + "name": "Adamant Platebody", + "xp": 312 + }, + { + "level": 89, + "icon": 1289, + "name": "Rune Sword", + "xp": 75 + }, + { + "level": 89, + "icon": 4824, + "name": "Rune Nails", + "xp": 75 + }, + { + "level": 89, + "icon": 824, + "name": "Rune Dart Tip", + "xp": 75 + }, + { + "level": 90, + "icon": 44, + "name": "Rune Arrowtips", + "xp": 75 + }, + { + "level": 90, + "icon": 1333, + "name": "Rune Scimitar", + "xp": 150 + }, + { + "level": 90, + "icon": 11283, + "name": "Dragonfire Shield", + "xp": 2000 + }, + { + "level": 91, + "icon": 1303, + "name": "Rune Longsword", + "xp": 150 + }, + { + "level": 91, + "icon": 19580, + "name": "Rune Javelin Heads", + "xp": 75 + }, + { + "level": 91, + "icon": 9431, + "name": "Runite Limbs", + "xp": 75 + }, + { + "level": 92, + "icon": 868, + "name": "Rune Knife", + "xp": 75 + }, + { + "level": 92, + "icon": 1163, + "name": "Rune Full Helm", + "xp": 150 + }, + { + "level": 93, + "icon": 1185, + "name": "Rune Sq Shield", + "xp": 150 + }, + { + "level": 94, + "icon": 1347, + "name": "Rune Warhammer", + "xp": 225 + }, + { + "level": 95, + "icon": 1373, + "name": "Rune Battleaxe", + "xp": 225 + }, + { + "level": 96, + "icon": 1113, + "name": "Rune Chainbody", + "xp": 225 + }, + { + "level": 97, + "icon": 1201, + "name": "Rune Kiteshield", + "xp": 225 + }, + { + "level": 98, + "icon": 3101, + "name": "Rune Claws", + "xp": 150 + }, + { + "level": 99, + "icon": 1127, + "name": "Rune Platebody", + "xp": 375 + }, + { + "level": 99, + "icon": 1093, + "name": "Rune Plateskirt", + "xp": 225 + }, + { + "level": 99, + "icon": 1079, + "name": "Rune Platelegs", + "xp": 225 + }, + { + "level": 99, + "icon": 1319, + "name": "Rune 2h Sword", + "xp": 225 + } + ] +} \ No newline at end of file diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_thieving.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_thieving.json new file mode 100644 index 0000000000..54b62200b8 --- /dev/null +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_thieving.json @@ -0,0 +1,232 @@ +{ + "actions": [ + { + "level": 1, + "icon": 3241, + "name": "Man / Woman", + "xp": 8 + }, + { + "level": 2, + "icon": 1965, + "name": "Vegetable Stall", + "xp": 10 + }, + { + "level": 5, + "icon": 1891, + "name": "Cake Stall", + "xp": 16 + }, + { + "level": 5, + "icon": 4242, + "name": "Tea Stall", + "xp": 16 + }, + { + "level": 5, + "icon": 5601, + "name": "Crafting Stall", + "xp": 16 + }, + { + "level": 5, + "icon": 1963, + "name": "Monkey Food Stall", + "xp": 16 + }, + { + "level": 10, + "icon": 3243, + "name": "Farmer", + "xp": 14.5 + }, + { + "level": 15, + "icon": 4295, + "name": "Female H.A.M. Member", + "xp": 18.5 + }, + { + "level": 20, + "icon": 950, + "name": "Silk Stall", + "xp": 24 + }, + { + "level": 20, + "icon": 4297, + "name": "Male H.A.M. Member", + "xp": 22.5 + }, + { + "level": 22, + "icon": 7919, + "name": "Wine Stall", + "xp": 27 + }, + { + "level": 25, + "icon": 3245, + "name": "Warrior Women / Al-Kharid Warrior", + "xp": 26 + }, + { + "level": 25, + "icon": 464, + "name": "Fruit Stall", + "xp": 28 + }, + { + "level": 27, + "icon": 5318, + "name": "Seed Stall", + "xp": 10 + }, + { + "level": 32, + "icon": 3247, + "name": "Rogue", + "xp": 35.5 + }, + { + "level": 35, + "icon": 958, + "name": "Fur Stall", + "xp": 36 + }, + { + "level": 36, + "icon": 10998, + "name": "Cave Goblin", + "xp": 40 + }, + { + "level": 38, + "icon": 5068, + "name": "Master Farmer", + "xp": 43 + }, + { + "level": 40, + "icon": 3249, + "name": "Guard", + "xp": 46.8 + }, + { + "level": 42, + "icon": 331, + "name": "Fish Stall", + "xp": 42 + }, + { + "level": 45, + "icon": 6782, + "name": "Bearded Pollnivnian Bandit", + "xp": 65 + }, + { + "level": 45, + "icon": 3686, + "name": "Fremennik Citizen", + "xp": 65 + }, + { + "level": 49, + "icon": 837, + "name": "Crossbow Stall", + "xp": 52 + }, + { + "level": 50, + "icon": 2355, + "name": "Silver Stall", + "xp": 54 + }, + { + "level": 53, + "icon": 4625, + "name": "Desert Bandit", + "xp": 79.5 + }, + { + "level": 55, + "icon": 3251, + "name": "Knight", + "xp": 84.3 + }, + { + "level": 55, + "icon": 6781, + "name": "Pollnivnian Bandit", + "xp": 84.3 + }, + { + "level": 65, + "icon": 6422, + "name": "Magic Stall", + "xp": 100 + }, + { + "level": 65, + "icon": 1325, + "name": "Scimitar Stall", + "xp": 100 + }, + { + "level": 65, + "icon": 6780, + "name": "Menaphite Thug", + "xp": 137.5 + }, + { + "level": 65, + "icon": 2007, + "name": "Spices Stall", + "xp": 81 + }, + { + "level": 65, + "icon": 3253, + "name": "Yanille Watchman", + "xp": 137.5 + }, + { + "level": 70, + "icon": 3255, + "name": "Paladin", + "xp": 151.8 + }, + { + "level": 75, + "icon": 3257, + "name": "Gnome", + "xp": 198.5 + }, + { + "level": 75, + "icon": 1607, + "name": "Gems Stall", + "xp": 160 + }, + { + "level": 80, + "icon": 3259, + "name": "Hero", + "xp": 275 + }, + { + "level": 85, + "icon": 6105, + "name": "Elf", + "xp": 353 + }, + { + "level": 90, + "icon": 21278, + "name": "TzHaar-Hur", + "xp": 103.4 + } + ] +} \ No newline at end of file diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_woodcutting.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_woodcutting.json new file mode 100644 index 0000000000..18643d93c8 --- /dev/null +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_woodcutting.json @@ -0,0 +1,79 @@ +{ + "bonuses": [ + { "name": "Lumberjack Outfit (+2.5%)", "value": 0.025 } + ], + "actions": [ + { + "level": 1, + "icon": 1511, + "name": "Logs", + "xp": 25 + }, + { + "level": 1, + "icon": 2862, + "name": "Achey Tree Logs", + "xp": 25 + }, + { + "level": 15, + "icon": 1521, + "name": "Oak Logs", + "xp": 37.5 + }, + { + "level": 30, + "icon": 1519, + "name": "Willow Logs", + "xp": 67.5 + }, + { + "level": 35, + "icon": 6333, + "name": "Teak Logs", + "xp": 85 + }, + { + "level": 45, + "icon": 3239, + "name": "Bark", + "xp": 82.5 + }, + { + "level": 45, + "icon": 1517, + "name": "Maple Logs", + "xp": 100 + }, + { + "level": 50, + "icon": 6332, + "name": "Mahogany Logs", + "xp": 125 + }, + { + "level": 54, + "icon": 10810, + "name": "Arctic Pine Logs", + "xp": 140.2 + }, + { + "level": 60, + "icon": 1515, + "name": "Yew Logs", + "xp": 175 + }, + { + "level": 75, + "icon": 1513, + "name": "Magic Logs", + "xp": 250 + }, + { + "level": 90, + "icon": 19669, + "name": "Redwood Logs", + "xp": 380 + } + ] +} \ No newline at end of file