diff --git a/runelite-api/src/main/java/net/runelite/api/AnimationID.java b/runelite-api/src/main/java/net/runelite/api/AnimationID.java
index 9596f7b667..32d59d9c7f 100644
--- a/runelite-api/src/main/java/net/runelite/api/AnimationID.java
+++ b/runelite-api/src/main/java/net/runelite/api/AnimationID.java
@@ -360,4 +360,7 @@ public final class AnimationID
public static final int SURGE_SPELL_ANIMATION = 7855;
public static final int HIGH_ALCH_ANIMATION = 713;
public static final int LUNAR_HUMIDIFY = 6294;
+ public static final int PRAY_AT_ALTAR = 645;
+ public static final int ENSOULED_HEADS_ANIMATION = 7198;
+
}
\ No newline at end of file
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/suppliestracker/ItemType.java b/runelite-client/src/main/java/net/runelite/client/plugins/suppliestracker/ItemType.java
index aead4eb52e..8b5f105093 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/suppliestracker/ItemType.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/suppliestracker/ItemType.java
@@ -44,7 +44,9 @@ public enum ItemType
TELEPORT("Teleports"),
COINS("Coins"),
JEWELLERY("Jewellery"),
- CHARGES("Charges");
+ CHARGES("Charges"),
+ FARMING("Farming"),
+ PRAYER("Prayer");
@Getter(AccessLevel.PUBLIC)
private String label;
@@ -63,34 +65,44 @@ public enum ItemType
{
return ItemType.POTION;
}
- if (item.getName().toLowerCase().contains("bolt") || item.getName().toLowerCase().contains("dart")
- || item.getName().toLowerCase().contains(" arrow") || item.getName().toLowerCase().contains("javelin")
- || item.getName().toLowerCase().contains("knive") || item.getName().toLowerCase().contains("throwing")
- || item.getName().toLowerCase().contains("zulrah's scale") || item.getName().toLowerCase().contains("cannonball")
- || item.getName().toLowerCase().contains("knife") || item.getName().toLowerCase().contains("chinchompa"))
+ else if ((item.getName().toLowerCase().contains("bones") && !item.getName().toLowerCase().contains(" to ")) ||
+ item.getName().toLowerCase().contains("ensouled"))
+ {
+ return ItemType.PRAYER;
+ }
+ else if (item.getName().toLowerCase().contains("bolt") || item.getName().toLowerCase().contains("dart")
+ || item.getName().toLowerCase().contains(" arrow") || item.getName().toLowerCase().contains("javelin")
+ || item.getName().toLowerCase().contains("knive") || item.getName().toLowerCase().contains("throwing")
+ || item.getName().toLowerCase().contains("zulrah's scale") || item.getName().toLowerCase().contains("cannonball")
+ || item.getName().toLowerCase().contains("knife"))
{
return ItemType.AMMO;
}
- if (item.getName().toLowerCase().contains("rune"))
+ else if (item.getName().toLowerCase().contains("rune"))
{
return ItemType.RUNE;
}
- if (item.getName().toLowerCase().contains("teleport"))
+ else if (item.getName().toLowerCase().contains("teleport"))
{
return ItemType.TELEPORT;
}
- if (item.getId() == COINS_995)
+ else if (item.getId() == COINS_995)
{
return ItemType.COINS;
}
- if (item.getName().toLowerCase().contains("ring of") || item.getName().toLowerCase().contains("amulet") ||
- item.getName().toLowerCase().contains("bracelet") || item.getName().toLowerCase().contains("necklace"))
+ else if (item.getName().toLowerCase().contains("ring of") || item.getName().toLowerCase().contains("amulet") ||
+ item.getName().toLowerCase().contains("bracelet") || item.getName().toLowerCase().contains("necklace"))
{
return ItemType.JEWELLERY;
}
- if (item.getId() == SCYTHE_OF_VITUR || item.getId() == SANGUINESTI_STAFF ||
- item.getId() == TRIDENT_OF_THE_SEAS || item.getId() == TRIDENT_OF_THE_SWAMP ||
- item.getId() == BLADE_OF_SAELDOR)
+ else if (item.getName().toLowerCase().contains(" sapling") || item.getName().toLowerCase().contains(" seed") ||
+ item.getName().toLowerCase().contains("compost") || item.getName().toLowerCase().contains("plant cure"))
+ {
+ return ItemType.FARMING;
+ }
+ else if (item.getId() == SCYTHE_OF_VITUR || item.getId() == SANGUINESTI_STAFF ||
+ item.getId() == TRIDENT_OF_THE_SEAS || item.getId() == TRIDENT_OF_THE_SWAMP ||
+ item.getId() == BLADE_OF_SAELDOR)
{
return ItemType.CHARGES;
}
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/suppliestracker/SuppliesTrackerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/suppliestracker/SuppliesTrackerPlugin.java
index 083ce8bf75..dc10b1104c 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/suppliestracker/SuppliesTrackerPlugin.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/suppliestracker/SuppliesTrackerPlugin.java
@@ -68,6 +68,8 @@ import net.runelite.client.plugins.Plugin;
import net.runelite.client.plugins.PluginDescriptor;
import net.runelite.client.plugins.PluginType;
import static net.runelite.client.plugins.suppliestracker.ActionType.*;
+import net.runelite.client.plugins.suppliestracker.skills.Farming;
+import net.runelite.client.plugins.suppliestracker.skills.Prayer;
import net.runelite.client.plugins.suppliestracker.ui.SuppliesTrackerPanel;
import net.runelite.client.ui.ClientToolbar;
import net.runelite.client.ui.NavigationButton;
@@ -123,8 +125,8 @@ public class SuppliesTrackerPlugin extends Plugin
//Hold Supply Data
private final Map suppliesEntry = new HashMap<>();
-
private final Deque actionStack = new ArrayDeque<>();
+
//Item arrays
private final String[] RAIDS_CONSUMABLES = new String[]{"xeric's", "elder", "twisted", "revitalisation", "overload", "prayer enhance", "pysk", "suphi", "leckish", "brawk", "mycil", "roqed", "kyren", "guanic", "prael", "giral", "phluxia", "kryket", "murng", "psykk", "egniol"};
private final int[] TRIDENT_OF_THE_SEAS_IDS = new int[]{TRIDENT_OF_THE_SEAS, TRIDENT_OF_THE_SEAS_E, TRIDENT_OF_THE_SEAS_FULL};
@@ -156,8 +158,22 @@ public class SuppliesTrackerPlugin extends Plugin
private int amountused3 = 0;
private boolean magicXpChanged = false;
private boolean skipTick = false;
+ private boolean noXpCast = false;
private int magicXp = 0;
+ //prayer stuff
+ private Prayer prayer;
+ private boolean prayerAltarAnimationCheck = false;
+ private int prayerXp = 0;
+ private int boneId = 0;
+ private boolean skipBone = false;
+ private int longTickWait = 0;
+ private int ensouledHeadId = 0;
+
+ //farming stuff
+ private Farming farming;
+
+
private ItemContainer old;
private int ammoId = 0;
private int ammoAmount = 0;
@@ -181,7 +197,6 @@ public class SuppliesTrackerPlugin extends Plugin
private SuppliesTrackerConfig config;
@Inject
private Client client;
- private boolean noXpCast = false;
/**
* Checks if item name is potion
@@ -218,6 +233,8 @@ public class SuppliesTrackerPlugin extends Plugin
{
panel = new SuppliesTrackerPanel(itemManager, this);
+ farming = new Farming(this, itemManager);
+ prayer = new Prayer(this, itemManager);
final BufferedImage header = ImageUtil.getResourceStreamFromClass(getClass(), "panel_icon.png");
panel.loadHeaderIcon(header);
final BufferedImage icon = ImageUtil.getResourceStreamFromClass(getClass(), "panel_icon.png");
@@ -256,6 +273,20 @@ public class SuppliesTrackerPlugin extends Plugin
magicXp = event.getXp();
}
}
+ if (event.getSkill().name().toLowerCase().equals("prayer"))
+ {
+ if (prayerXp != event.getXp())
+ {
+ if (prayerAltarAnimationCheck)
+ {
+ if (!skipBone)
+ {
+ prayer.build();
+ }
+ }
+ prayerXp = event.getXp();
+ }
+ }
}
@Subscribe
@@ -282,6 +313,21 @@ public class SuppliesTrackerPlugin extends Plugin
ticks = 0;
}
+ //reset skip bone for dark altar
+ skipBone = false;
+
+ //Waits to reset prayer animation check. needed for 1 ticking or
+ //in case animation gets interrupted
+ if (longTickWait > 0)
+ {
+ longTickWait = longTickWait - 1;
+ }
+ else if (prayerAltarAnimationCheck)
+ {
+ prayerAltarAnimationCheck = false;
+ }
+
+
if (skipTick)
{
skipTick = false;
@@ -576,7 +622,19 @@ public class SuppliesTrackerPlugin extends Plugin
break;
case ONEHAND_SLASH_SWORD_ANIMATION:
case ONEHAND_STAB_SWORD_ANIMATION:
- buildChargesEntries(BLADE_OF_SAELDOR);
+ if (mainHand == BLADE_OF_SAELDOR) buildChargesEntries(BLADE_OF_SAELDOR);
+ break;
+ case USING_GILDED_ALTAR:
+ case PRAY_AT_ALTAR:
+ prayerAltarAnimationCheck = true;
+ longTickWait = 5;
+ break;
+ case ENSOULED_HEADS_ANIMATION:
+ if (ensouledHeadId != 0)
+ {
+ buildEntries(ensouledHeadId);
+ ensouledHeadId = 0;
+ }
break;
}
}
@@ -738,25 +796,7 @@ public class SuppliesTrackerPlugin extends Plugin
@Subscribe
private void onMenuOptionClicked(final MenuOptionClicked event)
{
- // Fix for house pool
- switch (event.getMenuOpcode())
- {
- case ITEM_FIRST_OPTION:
- case ITEM_SECOND_OPTION:
- case ITEM_THIRD_OPTION:
- case ITEM_FOURTH_OPTION:
- case ITEM_FIFTH_OPTION:
- case EXAMINE_ITEM_BANK_EQ:
- case WIDGET_FIRST_OPTION:
- case WIDGET_SECOND_OPTION:
- case WIDGET_THIRD_OPTION:
- case WIDGET_FOURTH_OPTION:
- case WIDGET_FIFTH_OPTION:
- case WIDGET_DEFAULT:
- break;
- default:
- return;
- }
+
// Uses stacks to push/pop for tick eating
// Create pattern to find eat/drink at beginning
Pattern eatPattern = Pattern.compile(EAT_PATTERN);
@@ -772,6 +812,24 @@ public class SuppliesTrackerPlugin extends Plugin
return false;
}))
{
+ switch (event.getMenuOpcode())
+ {
+ case ITEM_FIRST_OPTION:
+ case ITEM_SECOND_OPTION:
+ case ITEM_THIRD_OPTION:
+ case ITEM_FOURTH_OPTION:
+ case ITEM_FIFTH_OPTION:
+ case EXAMINE_ITEM_BANK_EQ:
+ case WIDGET_FIRST_OPTION:
+ case WIDGET_SECOND_OPTION:
+ case WIDGET_THIRD_OPTION:
+ case WIDGET_FOURTH_OPTION:
+ case WIDGET_FIFTH_OPTION:
+ case WIDGET_DEFAULT:
+ break;
+ default:
+ return;
+ }
old = client.getItemContainer(InventoryID.INVENTORY);
int slot = event.getParam0();
if (old.getItems() != null)
@@ -818,6 +876,33 @@ public class SuppliesTrackerPlugin extends Plugin
}
+ if (event.getTarget().toLowerCase().equals("use"))
+ {
+ if (itemManager.getItemDefinition(event.getIdentifier()).getName().toLowerCase().contains("compost"))
+ {
+ farming.setBucketId(event.getIdentifier());
+ }
+ else
+ {
+ farming.setPlantId(event.getIdentifier());
+ }
+
+ }
+
+ if (event.getTarget().equals("Use") || event.getOption().toLowerCase().contains("bury"))
+ {
+ if (itemManager.getItemDefinition(event.getIdentifier()).getName().toLowerCase().contains("bones"))
+ {
+ prayer.setBonesId(event.getIdentifier());
+ boneId = event.getIdentifier();
+ }
+ }
+
+ if (event.getOption().equals("Reanimate") && event.getMenuOpcode().name().equals("ITEM_USE_ON_WIDGET"))
+ {
+ ensouledHeadId = event.getIdentifier();
+ }
+
//Adds tracking to Master Scroll Book
if (event.getOption().toLowerCase().equals("activate"))
{
@@ -879,9 +964,27 @@ public class SuppliesTrackerPlugin extends Plugin
void onChatMessage(ChatMessage event)
{
String message = event.getMessage();
+
if (event.getType() == ChatMessageType.GAMEMESSAGE || event.getType() == ChatMessageType.SPAM)
{
- if (message.toLowerCase().contains("your amulet has") ||
+ if (message.toLowerCase().contains("you plant "))
+ {
+ farming.OnChatPlant(message.toLowerCase());
+ }
+ else if (message.toLowerCase().contains("you treat "))
+ {
+ farming.setEndlessBucket(message);
+ farming.OnChatTreat(message.toLowerCase());
+ }
+ else if (message.toLowerCase().contains("you bury the bones"))
+ {
+ prayer.OnChat(message);
+ }
+ else if (message.toLowerCase().contains("dark lord"))
+ {
+ skipBone = true;
+ }
+ else if (message.toLowerCase().contains("your amulet has") ||
message.toLowerCase().contains("your amulet's last charge"))
{
buildChargesEntries(AMULET_OF_GLORY6);
@@ -957,7 +1060,7 @@ public class SuppliesTrackerPlugin extends Plugin
*
* @param itemId the id of the item
*/
- private void buildEntries(int itemId)
+ public void buildEntries(int itemId)
{
buildEntries(itemId, 1);
}
@@ -968,7 +1071,7 @@ public class SuppliesTrackerPlugin extends Plugin
* @param itemId the id of the item
* @param count the amount of the item to add to the tracker
*/
- private void buildEntries(int itemId, int count)
+ public void buildEntries(int itemId, int count)
{
final ItemDefinition itemComposition = itemManager.getItemDefinition(itemId);
String name = itemComposition.getName();
@@ -1219,18 +1322,19 @@ public class SuppliesTrackerPlugin extends Plugin
{
if (magicXpChanged || noXpCast)
{
- if (amountused1 != 0)
+ if (amountused1 != 0 && amountused1 < 20)
{
buildEntries(Runes.getRune(rune1).getItemId(), amountused1);
}
- if (amountused2 != 0)
+ if (amountused2 != 0 && amountused2 < 20)
{
buildEntries(Runes.getRune(rune2).getItemId(), amountused2);
}
- if (amountused3 != 0)
+ if (amountused3 != 0 && amountused3 < 20)
{
buildEntries(Runes.getRune(rune3).getItemId(), amountused3);
}
}
+
}
}
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/suppliestracker/skills/Farming.java b/runelite-client/src/main/java/net/runelite/client/plugins/suppliestracker/skills/Farming.java
new file mode 100644
index 0000000000..4bc0b7e95a
--- /dev/null
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/suppliestracker/skills/Farming.java
@@ -0,0 +1,95 @@
+package net.runelite.client.plugins.suppliestracker.skills;
+
+
+import net.runelite.client.game.ItemManager;
+import net.runelite.client.plugins.suppliestracker.SuppliesTrackerPlugin;
+import javax.inject.Singleton;
+import static net.runelite.api.ItemID.*;
+
+@Singleton
+public class Farming
+{
+ private SuppliesTrackerPlugin plugin;
+ private ItemManager itemManager;
+ private int plantId = 0;
+ private int compostId = 0;
+ private int bucketId = 0;
+ private final int[] ALLOTMENT_SEEDS = new int[]{POTATO_SEED, ONION_SEED, CABBAGE_SEED, TOMATO_SEED, SWEETCORN_SEED, STRAWBERRY_SEED, WATERMELON_SEED, SNAPE_GRASS_SEED};
+
+
+ public Farming(SuppliesTrackerPlugin plugin, ItemManager itemManager)
+ {
+ this.plugin = plugin;
+ this.itemManager = itemManager;
+ }
+
+ public void OnChatPlant(String message)
+ {
+ if (plantId <= 0)
+ {
+ return;
+ }
+ String name = itemManager.getItemDefinition(plantId).getName().toLowerCase();
+ if ( name.contains(" seed") || name.contains(" sapling"))
+ {
+ for (int seedId: ALLOTMENT_SEEDS)
+ {
+ if (plantId == seedId)
+ {
+ plugin.buildEntries(plantId, 3);
+ return;
+ }
+ }
+ plugin.buildEntries(plantId);
+ }
+ }
+
+ public void OnChatTreat(String message)
+ {
+ if (bucketId <= 0)
+ {
+ return;
+ }
+ String name = itemManager.getItemDefinition(bucketId).getName().toLowerCase();
+
+ if (name.contains(" compost") || name.contains("plant cure"))
+ {
+ if (bucketId == BOTTOMLESS_COMPOST_BUCKET || bucketId == BOTTOMLESS_COMPOST_BUCKET_22997)
+ {
+ plugin.buildEntries(compostId);
+ }
+ else
+ {
+ plugin.buildEntries(bucketId);
+ }
+ }
+ }
+
+
+
+ public void setPlantId(int plantId)
+ {
+ this.plantId = plantId;
+ }
+
+ public void setBucketId(int bucketId)
+ {
+ this.bucketId = bucketId;
+ }
+
+ public void setEndlessBucket(String message)
+ {
+ if (message.toLowerCase().contains("ultracompost"))
+ {
+ compostId = ULTRACOMPOST;
+ }
+ else if (message.toLowerCase().contains("supercompost"))
+ {
+ compostId = SUPERCOMPOST;
+ }
+ else
+ {
+ compostId = COMPOST;
+ }
+ }
+}
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/suppliestracker/skills/Prayer.java b/runelite-client/src/main/java/net/runelite/client/plugins/suppliestracker/skills/Prayer.java
new file mode 100644
index 0000000000..b6e289f3e3
--- /dev/null
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/suppliestracker/skills/Prayer.java
@@ -0,0 +1,43 @@
+package net.runelite.client.plugins.suppliestracker.skills;
+
+import net.runelite.client.game.ItemManager;
+import net.runelite.client.plugins.suppliestracker.SuppliesTrackerPlugin;
+import javax.inject.Singleton;
+
+@Singleton
+public class Prayer
+{
+ private SuppliesTrackerPlugin plugin;
+ private ItemManager itemManager;
+ private int bonesId = 0;
+
+ public Prayer(SuppliesTrackerPlugin plugin, ItemManager itemManager)
+ {
+ this.plugin = plugin;
+ this.itemManager = itemManager;
+ }
+
+ public void OnChat(String message)
+ {
+ String name = itemManager.getItemDefinition(bonesId).getName().toLowerCase();
+
+ if (bonesId <= 0 || !name.contains("bones"))
+ {
+ return;
+ }
+ if (message.toLowerCase().contains("you bury the bones"))
+ {
+ plugin.buildEntries(bonesId);
+ }
+ }
+
+ public void build()
+ {
+ plugin.buildEntries(bonesId);
+ }
+
+ public void setBonesId(int bonesId)
+ {
+ this.bonesId = bonesId;
+ }
+}
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/suppliestracker/ui/SuppliesBox.java b/runelite-client/src/main/java/net/runelite/client/plugins/suppliestracker/ui/SuppliesBox.java
index dc3a70650b..eec57f7183 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/suppliestracker/ui/SuppliesBox.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/suppliestracker/ui/SuppliesBox.java
@@ -334,10 +334,11 @@ public abstract class SuppliesBox extends JPanel
if (name.toLowerCase().contains("glory"))
{
+ long price = (((itemManager.getItemPrice(AMULET_OF_GLORY6) - (itemManager.getItemPrice(AMULET_OF_GLORY))) * qty) / 6);
tooltip.append("Amulet of Glory(6) x ")
.append(qty)
.append("/6 (")
- .append(QuantityFormatter.quantityToStackSize((itemManager.getItemPrice(AMULET_OF_GLORY6) * qty) / 6))
+ .append(QuantityFormatter.quantityToStackSize(price))
.append("gp)");
}
else if (name.toLowerCase().contains("dueling"))
@@ -350,18 +351,20 @@ public abstract class SuppliesBox extends JPanel
}
else if (name.toLowerCase().contains("wealth"))
{
+ long price = (((itemManager.getItemPrice(RING_OF_WEALTH_5) - (itemManager.getItemPrice(RING_OF_WEALTH))) * qty) / 5);
tooltip.append("Ring of Wealth(5) x ")
.append(qty)
.append("/5 (")
- .append(QuantityFormatter.quantityToStackSize((itemManager.getItemPrice(RING_OF_WEALTH_5) * qty) / 5))
+ .append(QuantityFormatter.quantityToStackSize(price))
.append("gp)");
}
else if (name.toLowerCase().contains("combat"))
{
+ long price = (((itemManager.getItemPrice(COMBAT_BRACELET6) - (itemManager.getItemPrice(COMBAT_BRACELET))) * qty) / 6);
tooltip.append("Combat Bracelet(6) x ")
.append(qty)
.append("/6 (")
- .append(QuantityFormatter.quantityToStackSize((itemManager.getItemPrice(COMBAT_BRACELET6) * qty) / 6))
+ .append(QuantityFormatter.quantityToStackSize(price))
.append("gp)");
}
else if (name.toLowerCase().contains("games"))
@@ -374,10 +377,11 @@ public abstract class SuppliesBox extends JPanel
}
else if (name.toLowerCase().contains("skills"))
{
+ long price = (((itemManager.getItemPrice(SKILLS_NECKLACE6) - (itemManager.getItemPrice(SKILLS_NECKLACE))) * qty) / 6);
tooltip.append("Skills Necklace(6) x ")
.append(qty)
.append("/6 (")
- .append(QuantityFormatter.quantityToStackSize((itemManager.getItemPrice(SKILLS_NECKLACE6) * qty) / 6))
+ .append(QuantityFormatter.quantityToStackSize(price))
.append("gp)");
}
else if (name.toLowerCase().contains("passage"))
diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/suppliestracker/ui/Info.html b/runelite-client/src/main/resources/net/runelite/client/plugins/suppliestracker/ui/Info.html
index be66ffcecc..bcab291d76 100644
--- a/runelite-client/src/main/resources/net/runelite/client/plugins/suppliestracker/ui/Info.html
+++ b/runelite-client/src/main/resources/net/runelite/client/plugins/suppliestracker/ui/Info.html
@@ -5,17 +5,16 @@
Uses a formula to estimate usage since there is no way to get info from blowpipe automatically.
Weapon charges:
-(Default disabled to enable check box in configs) Weapons charges groups items used in weapons charged in a box with
- the weapons icon. Tooltip shows the items used.
+(Default disabled to enable check box in configs) Weapons charges groups items used in weapons charged in a box with the weapons icon. Tooltip shows the items used.
Current supported weapons:
- Scythe
- Tridents
- Sang staff
+ - Blade of Saeldor
-Supplies tracker may not be 100% accurate. Tick eating with Karambwan can be missed if they aren't eaten the same tick as other food.
-
+Supplies tracker may not be 100% accurate. Tick eating with Karambwan can be missed if they aren't eaten the same tick as other food.
Current tracking capabilities:
Supplies (food, potions, teleport tablets, teleport scrolls)
@@ -23,7 +22,31 @@
Runes (Rune Pouch support added in 1.5)
Jewellery
Weapons charges
+Farming (saplings, seeds, compost, and plant cure)
+Prayer (bones and ensouled heads. Chaos altar, gilded altar, and burying bones)
Changelog
+1.8
+Prayer added:
+
POH altar
+Chaos Altar
+Ensouled heads
+Bury bones
+Fixed bottomless buckets showing in farming supplies
+Small bugs with prices
+Changed dragonstone jewellery to only add cost of charges [(cost of full - cost of empty)/number of max charges]
+1.7
+Added farming:
+
-Saplings
+
-Seeds
+
-Compost
+
-and plant cure
+fixed one handed swords showing as Blade of Saeldor
+Added check to rune pouch to help with bugs
+1.6
+Added standard spell tracking
+Auto cast tracking
+Chinchompas no longer steal food
+Runes now properly used when player gets no xp
1.5
Added Rune pouch support!
Null items shouldn't show anymore