Implement Skill Calculator plug-in

This commit is contained in:
Kruithne
2018-04-23 17:40:32 +01:00
committed by Adam
parent 0acde2bd06
commit b923335ed1
29 changed files with 7537 additions and 0 deletions

View File

@@ -0,0 +1,51 @@
/*
* Copyright (c) 2018, Kruithne <kruithne@gmail.com>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.runelite.client.plugins.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<String, SkillData> 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;
}
}

View File

@@ -0,0 +1,55 @@
/*
* Copyright (c) 2018, Kruithne <kruithne@gmail.com>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.runelite.client.plugins.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;
}

View File

@@ -0,0 +1,295 @@
/*
* Copyright (c) 2018, Kruithne <kruithne@gmail.com>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.runelite.client.plugins.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<UIActionSlot> uiActionSlots = new ArrayList<>();
private UICalculatorInputArea uiInput;
private CacheSkillData cacheSkillData = new CacheSkillData();
static SpriteManager spriteManager;
static ItemManager itemManager;
private UICombinedActionSlot combinedActionSlot = new UICombinedActionSlot();
private ArrayList<UIActionSlot> 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));
}
}

View File

@@ -0,0 +1,116 @@
/*
* Copyright (c) 2018, Kruithne <kruithne@gmail.com>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.runelite.client.plugins.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();
}
}

View File

@@ -0,0 +1,87 @@
/*
* Copyright (c) 2018, Kruithne <kruithne@gmail.com>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.runelite.client.plugins.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);
}
}

View File

@@ -0,0 +1,110 @@
/*
* Copyright (c) 2018, Kruithne <kruithne@gmail.com>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.runelite.client.plugins.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());
}
}

View File

@@ -0,0 +1,141 @@
/*
* Copyright (c) 2018, Kruithne <kruithne@gmail.com>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.runelite.client.plugins.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;
}
}

View File

@@ -0,0 +1,85 @@
/*
* Copyright (c) 2018, Kruithne <kruithne@gmail.com>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.runelite.client.plugins.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);
}
}

View File

@@ -0,0 +1,31 @@
/*
* Copyright (c) 2018, Kruithne <kruithne@gmail.com>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.runelite.client.plugins.skillcalculator.beans;
public class SkillData
{
public SkillDataEntry[] actions;
public SkillDataBonus[] bonuses;
}

View File

@@ -0,0 +1,31 @@
/*
* Copyright (c) 2018, Kruithne <kruithne@gmail.com>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.runelite.client.plugins.skillcalculator.beans;
public class SkillDataBonus
{
public String name;
public float value;
}

View File

@@ -0,0 +1,34 @@
/*
* Copyright (c) 2018, Kruithne <kruithne@gmail.com>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.runelite.client.plugins.skillcalculator.beans;
public class SkillDataEntry
{
public String name;
public int level;
public double xp;
public Integer icon;
public Integer sprite;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 799 B

View File

@@ -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
}
]
}

View File

@@ -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
}
]
}

View File

@@ -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
}
]
}

View File

@@ -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
}
]
}

View File

@@ -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
}
]
}

View File

@@ -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
}
]
}

View File

@@ -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
}
]
}

View File

@@ -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
}
]
}

View File

@@ -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
}
]
}

View File

@@ -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
}
]
}

View File

@@ -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
}
]
}

View File

@@ -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
}
]
}

View File

@@ -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
}
]
}

View File

@@ -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
}
]
}

View File

@@ -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
}
]
}