From 4b7597019bea3fdc6628172473d0d3496e762b49 Mon Sep 17 00:00:00 2001 From: Dozer Date: Thu, 2 Jan 2020 04:26:01 -0600 Subject: [PATCH] SuppliesTracker: Prayer, farming, and bug fixes (#2167) * Farming, prayer, bug fixes * Fix jewellery tooltip * rename Skills to skills --- .../java/net/runelite/api/AnimationID.java | 3 + .../plugins/suppliestracker/ItemType.java | 40 +++-- .../SuppliesTrackerPlugin.java | 160 +++++++++++++++--- .../suppliestracker/skills/Farming.java | 95 +++++++++++ .../suppliestracker/skills/Prayer.java | 43 +++++ .../suppliestracker/ui/SuppliesBox.java | 12 +- .../plugins/suppliestracker/ui/Info.html | 31 +++- 7 files changed, 334 insertions(+), 50 deletions(-) create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/suppliestracker/skills/Farming.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/suppliestracker/skills/Prayer.java diff --git a/runelite-api/src/main/java/net/runelite/api/AnimationID.java b/runelite-api/src/main/java/net/runelite/api/AnimationID.java index 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:

  1. Scythe
  2. Tridents
  3. Sang staff
  4. +
  5. 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