Repository: runelite/runelite
Pull request #17713 (2024-04-10 19:23:56)

Skill Calc Improvements
### Consistent Ordering of Skilling Actions
- [x] Add test case for ordering of Skilling Actions & reorder skilling actions to pass test (Lvl low to high -> Xp low to high -> Alphabetical)

### Skilling Bonus Changes
- [x] Add Felling axe + rations (110%)
- [x] Change Goldsmith Gauntlets from Smithing Action to Smithing Bonus
- [x] Standardise the % bonus to remove the +
- [x] Add Wilderness Agility Ticket Bonuses (105%, 110%, 115%) 
- [x] Reorder Prayer Bonuses to have all "Bone" related bonuses at the top in order of smallest to largest bonus
- [x] Fix which Prayer Bonus options can be selected at the same time  

### Varlamore
- [x] Add Varlamore Skilling Actions 
    - [x] Add Civitas Illa Fortis Teleport to Magic Skilling Action
- [x] Add Blessed Sunfire Wine Prayer Bonus

### Misc Fixes & Additions to Skilling Actions
- [x] Update Rogues chest xp to be 701.7 in line with Update:Poll 80 Wilderness Changes & More (7th February 2024)
- [x] Fix MITH_CROSSBOW enum to be MITHRIL_CROSSBOW
- [x] Add Magic Skilling Action - Kourend Castle Teleport
- [x] Add Woodcutting Skilling Action - Juniper Tree
- [x] Fix Construction Skilling Action MAHOGANY_EAGLE_LECTERN  to have proper Item.ID
- [x] Add Agility Skilling Action -  Wilderness Agility Course Lap 
- [x] Add Agility Skilling Action - Wilderness Agility Course Ticket
    - [x] Update Wilderness Agility Ticket Icon



DapperMickie: All of the necessary changes should be done, the only thing that we need to do some extra testing on is the rounding change.
As shown [here](https://github.com/runelite/runelite/pull/17713/commits/3b4d975e5450970581782e888d922634b29decf7#diff-d069100d03e9c0748d794285d138e1767a7299612710d61909dfe74c0a3be5d9R411)
DapperMickie: Oh and we still have to add Civitas Illa Fortis Teleport to Magic Skilling Action and Update Wilderness Agility Ticket Icon as soon as we get an update for the cache.
DapperMickie: We've tested the rounding change by fishing lobsters with a full anglers outfit (92.25xp if you do 1.025 * 90). 
In the old version it showed up as 92.3xp in the new one it shows 92.2xp.

Every 5th lobster caught in our tests gave 93xp, which means the current math should be correct.

We still might want to test this for more things.
Nightfirecat: This branch needs rebase, the diff here is showing unrelated changes.
DapperMickie: I did the rebase, should be fine now.

Patch:
diff --git a/runelite-api/src/main/java/net/runelite/api/SpriteID.java b/runelite-api/src/main/java/net/runelite/api/SpriteID.java
index 3300aad14..bd3ac22ae 100644
--- a/runelite-api/src/main/java/net/runelite/api/SpriteID.java
+++ b/runelite-api/src/main/java/net/runelite/api/SpriteID.java
@@ -380,7 +380,9 @@ public final class SpriteID
 	public static final int SPELL_WATER_SURGE = 363;
 	public static final int SPELL_EARTH_SURGE = 364;
 	public static final int SPELL_FIRE_SURGE = 365;
-	/* Unmapped: 366, 367, 368 */
+	/* Unmapped: 366 */
+	public static final int SPELL_CIVITAS_ILLA_FORTIS_TELEPORT = 367;
+	/* Unmapped: 368 */
 	public static final int SPELL_BIND_DISABLED = 369;
 	public static final int SPELL_SNARE_DISABLED = 370;
 	public static final int SPELL_ENTANGLE_DISABLED = 371;
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/CalculatorType.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/CalculatorType.java
index 8c27d8a50..43bb5f599 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/CalculatorType.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/CalculatorType.java
@@ -35,8 +35,8 @@ import net.runelite.client.plugins.skillcalculator.skills.*;
 enum CalculatorType
 {
 	MINING(Skill.MINING, MiningBonus.values(), MiningAction.values()),
-	AGILITY(Skill.AGILITY, null, AgilityAction.values()),
-	SMITHING(Skill.SMITHING, null, SmithingAction.values()),
+	AGILITY(Skill.AGILITY, AgilityBonus.values(), AgilityAction.values()),
+	SMITHING(Skill.SMITHING, SmithingBonus.values(), SmithingAction.values()),
 	HERBLORE(Skill.HERBLORE, null, HerbloreAction.values()),
 	FISHING(Skill.FISHING, FishingBonus.values(), FishingAction.values()),
 	THIEVING(Skill.THIEVING, null, ThievingAction.values()),
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculator.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculator.java
index 2b0143c10..6fa9f9aed 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculator.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculator.java
@@ -25,6 +25,7 @@
  */
 package net.runelite.client.plugins.skillcalculator;
 
+import com.google.common.annotations.VisibleForTesting;
 import java.awt.BorderLayout;
 import java.awt.Color;
 import java.awt.Dimension;
@@ -272,7 +273,7 @@ class SkillCalculator extends JPanel
 	private JPanel buildCheckboxPanel(SkillBonus bonus)
 	{
 		JPanel uiOption = new JPanel(new BorderLayout());
-		JLabel uiLabel = new JLabel(bonus.getName());
+		JLabel uiLabel = new JLabel(generateDisplayNameForBonus(bonus));
 		JCheckBox uiCheckbox = new JCheckBox();
 
 		uiLabel.setForeground(Color.WHITE);
@@ -290,6 +291,28 @@ class SkillCalculator extends JPanel
 		return uiOption;
 	}
 
+	private static String generateDisplayNameForBonus(SkillBonus bonus)
+	{
+		return bonus.getName() + " (" + formatBonusPercentage(bonus.getValue()) + "%)";
+	}
+
+	@VisibleForTesting
+	static String formatBonusPercentage(float bonus)
+	{
+		final int bonusValue = Math.round(10_000 * bonus);
+		final float bonusPercent = bonusValue / 100f;
+		final int bonusPercentInt = (int) bonusPercent;
+
+		if (bonusPercent == bonusPercentInt)
+		{
+			return String.valueOf(bonusPercentInt);
+		}
+		else
+		{
+			return String.valueOf(bonusPercent);
+		}
+	}
+
 	private void adjustCheckboxes(JCheckBox target, SkillBonus bonus)
 	{
 		// Check if target is stackable with any other bonuses
@@ -408,7 +431,7 @@ class SkillCalculator extends JPanel
 					bonus *= skillBonus.getValue();
 				}
 			}
-			final int xp = Math.round(action.getXp() * bonus * 10f);
+			final int xp = (int) Math.floor(action.getXp() * 10f * bonus);
 
 			if (neededXP > 0)
 			{
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/AgilityAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/AgilityAction.java
index f4b32eaf6..4c31032db 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/AgilityAction.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/AgilityAction.java
@@ -24,10 +24,15 @@
  */
 package net.runelite.client.plugins.skillcalculator.skills;
 
+import java.util.EnumSet;
+import java.util.Set;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
 import net.runelite.api.ItemID;
 import net.runelite.client.game.ItemManager;
+import static net.runelite.client.plugins.skillcalculator.skills.AgilityBonus.WILDERNESS_AGILITY_TICKET_101_PLUS;
+import static net.runelite.client.plugins.skillcalculator.skills.AgilityBonus.WILDERNESS_AGILITY_TICKET_11_TO_50;
+import static net.runelite.client.plugins.skillcalculator.skills.AgilityBonus.WILDERNESS_AGILITY_TICKET_51_TO_100;
 
 @AllArgsConstructor
 @Getter
@@ -38,16 +43,17 @@ public enum AgilityAction implements NamedSkillAction
 	DRAYNOR_VILLAGE_ROOFTOP("Draynor Village Rooftop", 10, 120, ItemID.MARK_OF_GRACE),
 	LEAPING_TROUT("Leaping trout", 15, 5, ItemID.LEAPING_TROUT),
 	AL_KHARID_ROOFTOP("Al Kharid Rooftop", 20, 180, ItemID.MARK_OF_GRACE),
+	LEAPING_SALMON("Leaping salmon", 30, 6, ItemID.LEAPING_SALMON),
 	VARROCK_ROOFTOP("Varrock Rooftop", 30, 238, ItemID.MARK_OF_GRACE),
 	PENGUIN_AGILITY_COURSE("Penguin Agility Course", 30, 540, ItemID.CLOCKWORK_SUIT),
-	LEAPING_SALMON("Leaping salmon", 30, 6, ItemID.LEAPING_SALMON),
 	BARBARIAN_OUTPOST("Barbarian Outpost", 35, 152.5f, ItemID.STEEL_BATTLEAXE),
 	CANIFIS_ROOFTOP("Canifis Rooftop", 40, 240, ItemID.MARK_OF_GRACE),
 	LEAPING_STURGEON("Leaping sturgeon", 45, 7, ItemID.LEAPING_STURGEON),
-	APE_ATOLL_COURSE("Ape Atoll", 48, 580, ItemID.GORILLA_GREEGREE),
 	SHAYZIEN_ADVANCED_COURSE("Shayzien Advanced Course", 48, 474.3f, ItemID.SHAYZIEN_HELM_5),
+	APE_ATOLL_COURSE("Ape Atoll", 48, 580, ItemID.GORILLA_GREEGREE),
 	FALADOR_ROOFTOP("Falador Rooftop", 50, 440, ItemID.MARK_OF_GRACE),
-	WILDERNESS_AGILITY_COURSE("Wilderness Agility Course", 52, 571, ItemID.SKULL),
+	WILDERNESS_AGILITY_COURSE_TICKET("Wilderness Agility Ticket", 52, 200, ItemID.WILDERNESS_AGILITY_TICKET),
+	WILDERNESS_AGILITY_COURSE("Wilderness Agility Course", 52, 571.4f, ItemID.SKULL),
 	HALLOWED_SEPULCHRE_FLOOR_1("Hallowed Sepulchre Floor 1", 52, 575, ItemID.RING_OF_ENDURANCE),
 	SEERS_VILLAGE_ROOFTOP("Seers' Village Rooftop", 60, 570, ItemID.MARK_OF_GRACE),
 	WEREWOLF_AGILITY_COURSE("Werewolf Agility Course", 60, 730, ItemID.STICK),
@@ -72,4 +78,19 @@ public enum AgilityAction implements NamedSkillAction
 	{
 		return true;
 	}
+
+	@Override
+	public Set<AgilityBonus> getExcludedSkillBonuses()
+	{
+		final EnumSet<AgilityBonus> others = EnumSet.allOf(AgilityBonus.class);
+
+		if (this == WILDERNESS_AGILITY_COURSE_TICKET)
+		{
+			others.remove(WILDERNESS_AGILITY_TICKET_11_TO_50);
+			others.remove(WILDERNESS_AGILITY_TICKET_51_TO_100);
+			others.remove(WILDERNESS_AGILITY_TICKET_101_PLUS);
+		}
+
+		return others;
+	}
 }
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/AgilityBonus.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/AgilityBonus.java
new file mode 100644
index 000000000..d84b78f7b
--- /dev/null
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/AgilityBonus.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2024, DapperMickie <rustenhovenmick@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.skills;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@AllArgsConstructor
+@Getter(onMethod_ = @Override)
+public enum AgilityBonus implements SkillBonus
+{
+	WILDERNESS_AGILITY_TICKET_11_TO_50("11-50 Wilderness Tickets", 1.05f),
+	WILDERNESS_AGILITY_TICKET_51_TO_100("51-100 Wilderness Tickets", 1.1f),
+	WILDERNESS_AGILITY_TICKET_101_PLUS("101+ Wilderness Tickets", 1.15f),
+	;
+
+	private final String name;
+	private final float value;
+}
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/ConstructionAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/ConstructionAction.java
index 9e0665e2b..8f0197d78 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/ConstructionAction.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/ConstructionAction.java
@@ -33,71 +33,69 @@ import net.runelite.client.game.ItemManager;
 @Getter
 public enum ConstructionAction implements NamedSkillAction
 {
-	EXIT_PORTAL("Exit Portal", 1, 100, ItemID.EXIT_PORTAL),
 	PLANK("Plank", 1, 29, ItemID.PLANK),
-	OAK_PLANK("Oak Plank", 1, 60, ItemID.OAK_PLANK),
-	TEAK_PLANK("Teak Plank", 1, 90, ItemID.TEAK_PLANK),
-	MAHOGANY_PLANK("Mahogany Plank", 1, 140, ItemID.MAHOGANY_PLANK),
-	PLANT("Plant", 1, 31, ItemID.PLANT),
+	DOCK_LEAF("Dock Leaf", 1, 31, ItemID.DOCK_LEAF),
 	FERN_BIG_PLANT("Fern (big plant)", 1, 31, ItemID.FERN_8186),
+	PLANT("Plant", 1, 31, ItemID.PLANT),
 	SHORT_PLANT("Short Plant", 1, 31, ItemID.SHORT_PLANT),
-	DOCK_LEAF("Dock Leaf", 1, 31, ItemID.DOCK_LEAF),
 	CRUDE_WOODEN_CHAIR("Crude Wooden Chair", 1, 58, ItemID.CRUDE_WOODEN_CHAIR),
+	EXIT_PORTAL("Exit Portal", 1, 100, ItemID.EXIT_PORTAL),
 	BROWN_RUG("Brown Rug", 2, 30, ItemID.BROWN_RUG),
 	TORN_CURTAINS("Torn Curtains", 2, 132, ItemID.TORN_CURTAINS),
 	CLAY_FIREPLACE("Clay Fireplace", 3, 30, ItemID.CLAY_FIREPLACE),
 	WOODEN_BOOKCASE("Wooden Bookcase", 4, 115, ItemID.WOODEN_BOOKCASE),
-	FIREPIT("Firepit", 5, 40, ItemID.FIREPIT),
 	CAT_BLANKET("Cat Blanket", 5, 15, ItemID.CAT_BLANKET),
-	DECORATIVE_ROCK("Decorative Rock", 5, 100, ItemID.DECORATIVE_ROCK),
 	TREE("Tree", 5, 31, ItemID.TREE),
-	SMALL_FERN("Small Fern", 6, 70, ItemID.SMALL_FERN),
-	THISTLE("Thistle", 6, 70, ItemID.THISTLE),
+	FIREPIT("Firepit", 5, 40, ItemID.FIREPIT),
+	DECORATIVE_ROCK("Decorative Rock", 5, 100, ItemID.DECORATIVE_ROCK),
 	BUSH("Bush", 6, 70, ItemID.BUSH),
 	LARGE_LEAF_BUSH("Large Leaf Bush", 6, 70, ItemID.LARGELEAF_PLANT),
+	SMALL_FERN("Small Fern", 6, 70, ItemID.SMALL_FERN),
+	THISTLE("Thistle", 6, 70, ItemID.THISTLE),
 	WOODEN_SHELVES_1("Wooden Shelves 1", 6, 87, ItemID.WOODEN_SHELVES_1),
-	PUMP_AND_DRAIN("Pump and Drain", 7, 100, ItemID.PUMP_AND_DRAIN),
 	BEER_BARREL("Beer Barrel", 7, 87, ItemID.BEER_BARREL),
+	PUMP_AND_DRAIN("Pump and Drain", 7, 100, ItemID.PUMP_AND_DRAIN),
 	WOODEN_CHAIR("Wooden Chair", 8, 87, ItemID.WOODEN_CHAIR),
 	WOODEN_LARDER("Wooden Larder", 9, 228, ItemID.WOODEN_LARDER),
-	WOOD_DINING_TABLE("Wood Dining Table", 10, 115, ItemID.WOOD_DINING_TABLE),
-	POND("Pond", 10, 100, ItemID.POND),
 	NICE_TREE("Nice Tree", 10, 44, ItemID.NICE_TREE),
+	POND("Pond", 10, 100, ItemID.POND),
 	WOODEN_BENCH("Wooden Bench", 10, 115, ItemID.WOODEN_BENCH),
+	WOOD_DINING_TABLE("Wood Dining Table", 10, 115, ItemID.WOOD_DINING_TABLE),
 	FIREPIT_WITH_HOOK("Firepit with Hook", 11, 60, ItemID.FIREPIT_WITH_HOOK),
-	REEDS("Reeds", 12, 100, ItemID.REEDS),
-	FERN_SMALL_PLANT("Fern (small plant)", 12, 100, ItemID.FERN),
-	CIDER_BARREL("Cider Barrel", 12, 91, ItemID.CIDER_BARREL),
-	WOODEN_SHELVES_2("Wooden Shelves 2", 12, 147, ItemID.WOODEN_SHELVES_2),
 	WOOD_TABLE("Wood Table", 12, 87, ItemID.WOOD_DINING_TABLE),
+	CIDER_BARREL("Cider Barrel", 12, 91, ItemID.CIDER_BARREL),
+	FERN_SMALL_PLANT("Fern (small plant)", 12, 100, ItemID.FERN),
 	HUGE_PLANT("Huge Plant", 12, 100, ItemID.HUGE_PLANT),
+	REEDS("Reeds", 12, 100, ItemID.REEDS),
 	TALL_PLANT("Tall Plant", 12, 100, ItemID.TALL_PLANT),
+	WOODEN_SHELVES_2("Wooden Shelves 2", 12, 147, ItemID.WOODEN_SHELVES_2),
 	RUG("Rug", 13, 60, ItemID.RUG),
 	ROCKING_CHAIR("Rocking Chair", 14, 87, ItemID.ROCKING_CHAIR),
-	IMP_STATUE("Imp Statue", 15, 150, ItemID.IMP_STATUE),
+	OAK_PLANK("Oak Plank", 15, 60, ItemID.OAK_PLANK),
 	OAK_TREE("Oak Tree", 15, 70, ItemID.OAK_TREE),
+	IMP_STATUE("Imp Statue", 15, 150, ItemID.IMP_STATUE),
 	OAK_DECORATION("Oak Decoration", 16, 120, ItemID.OAK_DECORATION),
 	FIREPIT_WITH_POT("Firepit with Pot", 17, 80, ItemID.FIREPIT_WITH_POT),
-	CURTAINS("Curtains", 18, 225, ItemID.CURTAINS),
 	ASGARNIAN_ALE("Asgarnian Ale", 18, 184, ItemID.ASGARNIAN_ALE),
+	CURTAINS("Curtains", 18, 225, ItemID.CURTAINS),
 	CAT_BASKET("Cat Basket", 19, 58, ItemID.CAT_BASKET),
 	OAK_CHAIR("Oak Chair", 19, 120, ItemID.OAK_CHAIR),
-	WOODEN_BED("Wooden Bed", 20, 117, ItemID.WOODEN_BED),
 	SHOE_BOX("Shoe Box", 20, 58, ItemID.SHOE_BOX),
+	WOODEN_BED("Wooden Bed", 20, 117, ItemID.WOODEN_BED),
 	SHAVING_STAND("Shaving Stand", 21, 30, ItemID.SHAVING_STAND),
-	OAK_DINING_TABLE("Oak Dining Table", 22, 240, ItemID.OAK_DINING_TABLE),
 	OAK_BENCH("Oak Bench", 22, 240, ItemID.OAK_BENCH),
+	OAK_DINING_TABLE("Oak Dining Table", 22, 240, ItemID.OAK_DINING_TABLE),
 	WOODEN_SHELVES_3("Wooden Shelves 3", 23, 147, ItemID.WOODEN_SHELVES_3),
 	SMALL_OVEN("Small Oven", 24, 80, ItemID.SMALL_OVEN),
 	OAK_CLOCK("Oak Clock", 25, 142, ItemID.OAK_CLOCK),
-	GREENMANS_ALE("Greenman's Ale", 26, 184, ItemID.GREENMANS_ALE),
-	OAK_ARMCHAIR("Oak Armchair", 26, 180, ItemID.OAK_ARMCHAIR),
 	ROPE_BELL_PULL("Rope Bell-Pull", 26, 64, ItemID.ROPE_BELLPULL),
-	PUMP_AND_TUB("Pump and Tub", 27, 200, ItemID.PUMP_AND_TUB),
+	OAK_ARMCHAIR("Oak Armchair", 26, 180, ItemID.OAK_ARMCHAIR),
+	GREENMANS_ALE("Greenman's Ale", 26, 184, ItemID.GREENMANS_ALE),
 	OAK_DRAWERS("Oak Drawers", 27, 120, ItemID.OAK_DRAWERS),
-	OAK_BOOKCASE("Oak Bookcase", 29, 180, ItemID.OAK_BOOKCASE),
-	LARGE_OVEN("Large Oven", 29, 100, ItemID.LARGE_OVEN),
+	PUMP_AND_TUB("Pump and Tub", 27, 200, ItemID.PUMP_AND_TUB),
 	OAK_SHAVING_STAND("Oak Shaving Stand", 29, 61, ItemID.OAK_SHAVING_STAND),
+	LARGE_OVEN("Large Oven", 29, 100, ItemID.LARGE_OVEN),
+	OAK_BOOKCASE("Oak Bookcase", 29, 180, ItemID.OAK_BOOKCASE),
 	WILLOW_TREE("Willow Tree", 30, 100, ItemID.WILLOW_TREE),
 	OAK_BED("Oak Bed", 30, 210, ItemID.OAK_BED),
 	LONG_BONE("Long Bone", 30, 4500, ItemID.LONG_BONE),
@@ -106,27 +104,29 @@ public enum ConstructionAction implements NamedSkillAction
 	CARVED_OAK_TABLE("Carved Oak Table", 31, 360, ItemID.CARVED_OAK_TABLE),
 	OAK_KITCHEN_TABLE("Oak Kitchen Table", 32, 180, ItemID.TEAK_TABLE),
 	BOXING_RING("Boxing Ring", 32, 420, ItemID.BOXING_RING),
-	OAK_LARDER("Oak Larder", 33, 480, ItemID.OAK_LARDER),
-	CUSHIONED_BASKET("Cushioned Basket", 33, 58, ItemID.CUSHIONED_BASKET),
 	STONE_FIREPLACE("Stone Fireplace", 33, 40, ItemID.STONE_FIREPLACE),
+	CUSHIONED_BASKET("Cushioned Basket", 33, 58, ItemID.CUSHIONED_BASKET),
+	OAK_LARDER("Oak Larder", 33, 480, ItemID.OAK_LARDER),
+	GLOVE_RACK("Glove Rack", 34, 120, ItemID.GLOVE_RACK),
 	STEEL_RANGE("Steel Range", 34, 120, ItemID.STEEL_RANGE),
 	OAK_SHELVES_1("Oak Shelves 1", 34, 240, ItemID.OAK_SHELVES_1),
-	GLOVE_RACK("Glove Rack", 34, 120, ItemID.GLOVE_RACK),
 	LARGE_OAK_BED("Large Oak Bed", 34, 330, ItemID.LARGE_OAK_BED),
+	TEAK_PLANK("Teak Plank", 35, 90, ItemID.TEAK_PLANK),
 	TEAK_ARMCHAIR("Teak Armchair", 35, 180, ItemID.TEAK_ARMCHAIR),
-	DRAGON_BITTER("Dragon Bitter", 36, 224, ItemID.DRAGON_BITTER),
 	TEAK_DECORATION("Teak Decoration", 36, 180, ItemID.TEAK_DECORATION),
+	DRAGON_BITTER("Dragon Bitter", 36, 224, ItemID.DRAGON_BITTER),
 	BELL_PULL("Bell-Pull", 37, 120, ItemID.BELLPULL),
 	OAK_DRESSER("Oak Dresser", 37, 121, ItemID.OAK_DRESSER),
 	TEAK_BENCH("Teak Bench", 38, 360, ItemID.CARVED_TEAK_BENCH),
 	TEAK_TABLE("Teak Table", 38, 360, ItemID.TEAK_TABLE),
 	OAK_WARDROBE("Oak Wardrobe", 39, 180, ItemID.OAK_WARDROBE),
-	TEAK_BED("Teak Bed", 40, 300, ItemID.TEAK_BED),
-	MAHOGANY_BOOKCASE("Mahogany Bookcase", 40, 420, ItemID.MAHOGANY_BOOKCASE),
 	OAK_LECTERN("Oak Lectern", 40, 60, ItemID.OAK_LECTERN),
+	MAHOGANY_PLANK("Mahogany Plank", 40, 140, ItemID.MAHOGANY_PLANK),
+	TEAK_BED("Teak Bed", 40, 300, ItemID.TEAK_BED),
 	OPULENT_CURTAINS("Opulent Curtains", 40, 315, ItemID.OPULENT_CURTAINS),
-	FENCING_RING("Fencing Ring", 41, 570, ItemID.FENCING_RING),
+	MAHOGANY_BOOKCASE("Mahogany Bookcase", 40, 420, ItemID.MAHOGANY_BOOKCASE),
 	GLOBE("Globe", 41, 180, ItemID.GLOBE),
+	FENCING_RING("Fencing Ring", 41, 570, ItemID.FENCING_RING),
 	FANCY_RANGE("Fancy Range", 42, 160, ItemID.FANCY_RANGE),
 	CRYSTAL_BALL("Crystal Ball", 42, 280, ItemID.CRYSTAL_BALL),
 	ALCHEMICAL_CHART("Alchemical Chart", 43, 30, ItemID.ALCHEMICAL_CHART),
@@ -134,20 +134,20 @@ public enum ConstructionAction implements NamedSkillAction
 	WOODEN_TELESCOPE("Wooden Telescope", 44, 121, ItemID.OAK_TELESCOPE),
 	WEAPONS_RACK("Weapons Rack", 44, 180, ItemID.WEAPONS_RACK),
 	CARVED_TEAK_BENCH("Carved Teak Bench", 44, 360, ItemID.CARVED_TEAK_BENCH),
+	MAPLE_TREE("Maple Tree", 45, 122, ItemID.MAPLE_TREE),
 	OAK_SHELVES_2("Oak Shelves 2", 45, 240, ItemID.OAK_SHELVES_2),
-	CARVED_TEAK_TABLE("Carved Teak Table", 45, 600, ItemID.CARVED_TEAK_TABLE),
 	LARGE_TEAK_BED("Large Teak Bed", 45, 480, ItemID.LARGE_TEAK_BED),
-	MAPLE_TREE("Maple Tree", 45, 122, ItemID.MAPLE_TREE),
+	CARVED_TEAK_TABLE("Carved Teak Table", 45, 600, ItemID.CARVED_TEAK_TABLE),
 	TEAK_DRESSER("Teak Dresser", 46, 181, ItemID.TEAK_DRESSER),
-	SINK("Sink", 47, 300, ItemID.SINK),
-	EAGLE_LECTERN("Eagle Lectern", 47, 120, ItemID.EAGLE_LECTERN),
 	DEMON_LECTERN("Demon Lectern", 47, 120, ItemID.DEMON_LECTERN),
+	EAGLE_LECTERN("Eagle Lectern", 47, 120, ItemID.EAGLE_LECTERN),
+	SINK("Sink", 47, 300, ItemID.SINK),
 	MOUNTED_MYTHICAL_CAPE("Mounted Mythical Cape", 47, 370, ItemID.MYTHICAL_CAPE),
 	CHEFS_DELIGHT("Chef's Delight", 48, 224, ItemID.CHEFS_DELIGHT),
+	TELEPORT_FOCUS("Teleport Focus", 50, 40, ItemID.TELEPORT_FOCUS),
+	ORNAMENTAL_GLOBE("Ornamental Globe", 50, 270, ItemID.ORNAMENTAL_GLOBE),
 	TEAK_PORTAL("Teak Portal", 50, 270, ItemID.TEAK_PORTAL),
 	MAHOGANY_ARMCHAIR("Mahogany Armchair", 50, 280, ItemID.MAHOGANY_ARMCHAIR),
-	ORNAMENTAL_GLOBE("Ornamental Globe", 50, 270, ItemID.ORNAMENTAL_GLOBE),
-	TELEPORT_FOCUS("Teleport Focus", 50, 40, ItemID.TELEPORT_FOCUS),
 	TEAK_DRAWERS("Teak Drawers", 51, 180, ItemID.TEAK_DRAWERS),
 	COMBAT_RING("Combat Ring", 51, 630, ItemID.COMBAT_RING),
 	TEAK_KITCHEN_TABLE("Teak Kitchen Table", 52, 270, ItemID.TEAK_TABLE),
@@ -157,41 +157,41 @@ public enum ConstructionAction implements NamedSkillAction
 	EXTRA_WEAPONS_RACK("Extra Weapons Rack", 54, 440, ItemID.EXTRA_WEAPONS_RACK),
 	ELEMENTAL_SPHERE("Elemental Sphere", 54, 580, ItemID.ELEMENTAL_SPHERE),
 	TEAK_CLOCK("Teak Clock", 55, 202, ItemID.TEAK_CLOCK),
-	GILDED_DECORATION("Gilded Decoration", 56, 1020, ItemID.GILDED_DECORATION),
 	FANCY_TEAK_DRESSER("Fancy Teak Dresser", 56, 182, ItemID.FANCY_TEAK_DRESSER),
 	TEAK_SHELVES_1("Teak Shelves 1", 56, 330, ItemID.TEAK_SHELVES_1),
-	TEAK_EAGLE_LECTERN("Teak Eagle Lectern", 57, 180, ItemID.TEAK_EAGLE_LECTERN),
+	GILDED_DECORATION("Gilded Decoration", 56, 1020, ItemID.GILDED_DECORATION),
 	TEAK_DEMON_LECTERN("Teak Demon Lectern", 57, 180, ItemID.TEAK_DEMON_LECTERN),
+	TEAK_EAGLE_LECTERN("Teak Eagle Lectern", 57, 180, ItemID.TEAK_EAGLE_LECTERN),
 	LIMESTONE_ATTACK_STONE("Limestone attack stone", 59, 200, ItemID.ATTACK_STONE),
 	LUNAR_GLOBE("Lunar Globe", 59, 570, ItemID.LUNAR_GLOBE),
-	GILDED_FOUR_POSTER_BED("Gilded 4-Poster Bed", 60, 1330, ItemID.GILDED_4POSTER),
-	POSH_BELL_PULL("Posh Bell-Pull", 60, 420, ItemID.POSH_BELLPULL),
-	SPICE_RACK("Spice Rack", 60, 374, ItemID.SPICE_RACK),
 	YEW_TREE("Yew Tree", 60, 141, ItemID.YEW_TREE),
+	SPICE_RACK("Spice Rack", 60, 374, ItemID.SPICE_RACK),
+	POSH_BELL_PULL("Posh Bell-Pull", 60, 420, ItemID.POSH_BELLPULL),
+	GILDED_FOUR_POSTER_BED("Gilded 4-Poster Bed", 60, 1330, ItemID.GILDED_4POSTER),
 	GILDED_BENCH("Gilded Bench", 61, 1760, ItemID.GILDED_BENCH),
+	ASTRONOMICAL_CHART("Astronomical Chart", 63, 45, ItemID.ASTRONOMICAL_CHART),
 	TEAK_WARDROBE("Teak Wardrobe", 63, 270, ItemID.TEAK_WARDROBE),
 	MARBLE_FIREPLACE("Marble Fireplace", 63, 500, ItemID.MARBLE_FIREPLACE),
-	ASTRONOMICAL_CHART("Astronomical Chart", 63, 45, ItemID.ASTRONOMICAL_CHART),
 	TEAK_TELESCOPE("Teak Telescope", 64, 181, ItemID.TEAK_TELESCOPE),
 	MAHOGANY_DRESSER("Mahogany Dresser", 64, 281, ItemID.MAHOGANY_DRESSER),
+	OPULENT_RUG("Opulent Rug", 65, 360, ItemID.OPULENT_RUG),
 	MAHOGANY_PORTAL("Mahogany Portal", 65, 420, ItemID.MAHOGANY_PORTAL),
 	GREATER_FOCUS("Greater Focus", 65, 500, ItemID.GREATER_FOCUS),
-	OPULENT_RUG("Opulent Rug", 65, 360, ItemID.OPULENT_RUG),
 	TEAK_GARDEN_BENCH("Teak Garden Bench", 66, 540, ItemID.TEAK_GARDEN_BENCH),
 	CRYSTAL_OF_POWER("Crystal of Power", 66, 890, ItemID.CRYSTAL_OF_POWER),
+	MAHOGANY_DEMON_LECTERN("Mahogany Demon Lectern", 67, 580, ItemID.MAHOGANY_DEMON),
+	MAHOGANY_EAGLE_LECTERN("Mahogany Eagle Lectern", 67, 580, ItemID.MAHOGANY_EAGLE),
 	TEAK_SHELVES_2("Teak Shelves 2", 67, 930, ItemID.TEAK_SHELVES_2),
-	MAHOGANY_DEMON_LECTERN("Mahogany Demon Lectern", 67, 580, ItemID.TEAK_DEMON_LECTERN),
-	MAHOGANY_EAGLE_LECTERN("Mahogany Eagle Lectern", 67, 580, ItemID.TEAK_DEMON_LECTERN),
 	CELESTIAL_GLOBE("Celestial Globe", 68, 570, ItemID.CELESTIAL_GLOBE),
 	DUNGEON_ENTRANCE("Dungeon Entrance", 70, 500, ItemID.DUNGEON_ENTRANCE),
 	RANGING_PEDESTALS("Ranging Pedestals", 71, 720, ItemID.RANGING_PEDESTALS),
 	OPULENT_TABLE("Opulent Table", 72, 3100, ItemID.OPULENT_TABLE),
-	OAK_DOOR("Oak Door", 74, 600, ItemID.OAK_DOOR),
 	GILDED_DRESSER("Gilded Dresser", 74, 582, ItemID.GILDED_DRESSER),
-	MAHOGANY_WARDROBE("Mahogany Wardrobe", 75, 420, ItemID.MAHOGANY_WARDROBE),
+	OAK_DOOR("Oak Door", 74, 600, ItemID.OAK_DOOR),
 	MAGIC_TREE("Magic Tree", 75, 223, ItemID.MAGIC_TREE),
-	ARMILLARY_GLOBE("Armillary Globe", 77, 960, ItemID.GLOBE),
+	MAHOGANY_WARDROBE("Mahogany Wardrobe", 75, 420, ItemID.MAHOGANY_WARDROBE),
 	GNOME_BENCH("Gnome Bench", 77, 840, ItemID.GNOME_BENCH),
+	ARMILLARY_GLOBE("Armillary Globe", 77, 960, ItemID.GLOBE),
 	MARBLE_PORTAL("Marble Portal", 80, 1500, ItemID.MARBLE_PORTAL),
 	SCRYING_POOL("Scrying Pool", 80, 2000, ItemID.SCRYING_POOL),
 	BALANCE_BEAM("Balance Beam", 81, 1000, ItemID.BALANCE_BEAM),
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/ConstructionBonus.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/ConstructionBonus.java
index e5d1ca54d..477cbb0e2 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/ConstructionBonus.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/ConstructionBonus.java
@@ -31,7 +31,7 @@ import lombok.Getter;
 @Getter(onMethod_ = @Override)
 public enum ConstructionBonus implements SkillBonus
 {
-	CARPENTERS_OUTFIT("Carpenter's Outfit (+2.5%)", 1.025f),
+	CARPENTERS_OUTFIT("Carpenter's Outfit", 1.025f),
 	;
 
 	private final String name;
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/CookingAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/CookingAction.java
index 1613e7b46..97803716f 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/CookingAction.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/CookingAction.java
@@ -34,19 +34,19 @@ import net.runelite.client.game.ItemManager;
 public enum CookingAction implements ItemSkillAction
 {
 	SINEW(ItemID.SINEW, 1, 3),
-	SHRIMPS(ItemID.SHRIMPS, 1, 30),
+	ANCHOVIES(ItemID.ANCHOVIES, 1, 30),
 	COOKED_CHICKEN(ItemID.COOKED_CHICKEN, 1, 30),
 	COOKED_MEAT(ItemID.COOKED_MEAT, 1, 30),
 	COOKED_RABBIT(ItemID.COOKED_RABBIT, 1, 30),
-	ANCHOVIES(ItemID.ANCHOVIES, 1, 30),
+	SHRIMPS(ItemID.SHRIMPS, 1, 30),
+	BREAD(ItemID.BREAD, 1, 40),
 	SARDINE(ItemID.SARDINE, 1, 40),
-	POISON_KARAMBWAN(ItemID.POISON_KARAMBWAN, 1, 80),
 	UGTHANKI_MEAT(ItemID.UGTHANKI_MEAT, 1, 40),
-	BREAD(ItemID.BREAD, 1, 40),
+	POISON_KARAMBWAN(ItemID.POISON_KARAMBWAN, 1, 80),
 	HERRING(ItemID.HERRING, 5, 50),
 	FRUIT_BLAST(ItemID.FRUIT_BLAST, 6, 50),
-	BAKED_POTATO(ItemID.BAKED_POTATO, 7, 15),
 	GUPPY(ItemID.GUPPY, 7, 12),
+	BAKED_POTATO(ItemID.BAKED_POTATO, 7, 15),
 	PINEAPPLE_PUNCH(ItemID.PINEAPPLE_PUNCH, 8, 70),
 	SPICY_SAUCE(ItemID.SPICY_SAUCE, 9, 25),
 	MACKEREL(ItemID.MACKEREL, 10, 60),
@@ -57,104 +57,114 @@ public enum CookingAction implements ItemSkillAction
 	THIN_SNAIL_MEAT(ItemID.THIN_SNAIL_MEAT, 12, 70),
 	SPICY_CRUNCHIES(ItemID.SPICY_CRUNCHIES, 12, 100),
 	SCRAMBLED_EGG(ItemID.SCRAMBLED_EGG, 13, 50),
-	CIDER(ItemID.CIDER, 14, 182),
 	WORM_CRUNCHIES(ItemID.WORM_CRUNCHIES, 14, 104),
+	CIDER(ItemID.CIDER, 14, 182),
 	TROUT(ItemID.TROUT, 15, 70),
-	SPIDER_ON_STICK(ItemID.SPIDER_ON_STICK, 16, 80),
-	SPIDER_ON_SHAFT(ItemID.SPIDER_ON_SHAFT, 16, 80),
 	ROAST_RABBIT(ItemID.ROAST_RABBIT, 16, 72.5f),
+	SPIDER_ON_SHAFT(ItemID.SPIDER_ON_SHAFT, 16, 80),
+	SPIDER_ON_STICK(ItemID.SPIDER_ON_STICK, 16, 80),
 	CHOCCHIP_CRUNCHIES(ItemID.CHOCCHIP_CRUNCHIES, 16, 100),
 	LEAN_SNAIL_MEAT(ItemID.LEAN_SNAIL_MEAT, 17, 80),
 	COD(ItemID.COD, 18, 75),
 	WIZARD_BLIZZARD(ItemID.WIZARD_BLIZZARD, 18, 110),
 	DWARVEN_STOUT(ItemID.DWARVEN_STOUT, 19, 215, true),
-	SHORT_GREEN_GUY(ItemID.SHORT_GREEN_GUY, 20, 120),
-	MEAT_PIE(ItemID.MEAT_PIE, 20, 110),
-	PIKE(ItemID.PIKE, 20, 80),
-	CUP_OF_TEA(ItemID.CUP_OF_TEA, 20, 52),
 	CAVEFISH(ItemID.CAVEFISH, 20, 23),
+	CUP_OF_TEA(ItemID.CUP_OF_TEA, 20, 52),
+	PIKE(ItemID.PIKE, 20, 80),
+	MEAT_PIE(ItemID.MEAT_PIE, 20, 110),
+	SHORT_GREEN_GUY(ItemID.SHORT_GREEN_GUY, 20, 120),
+	POT_OF_CREAM(ItemID.POT_OF_CREAM, 21, 18),
 	ROAST_BEAST_MEAT(ItemID.ROAST_BEAST_MEAT, 21, 82.5f),
 	COOKED_CRAB_MEAT(ItemID.COOKED_CRAB_MEAT, 21, 100),
-	POT_OF_CREAM(ItemID.POT_OF_CREAM, 21, 18),
 	FAT_SNAIL_MEAT(ItemID.FAT_SNAIL_MEAT, 22, 95),
 	EGG_AND_TOMATO(ItemID.EGG_AND_TOMATO, 23, 50),
+	COOKED_WILD_KEBBIT(ItemID.COOKED_WILD_KEBBIT, 23, 73),
 	ASGARNIAN_ALE(ItemID.ASGARNIAN_ALE, 24, 248, true),
 	SALMON(ItemID.SALMON, 25, 90),
 	STEW(ItemID.STEW, 25, 117),
 	FRUIT_BATTA(ItemID.FRUIT_BATTA, 25, 150),
 	TOAD_BATTA(ItemID.TOAD_BATTA, 26, 152),
 	WORM_BATTA(ItemID.WORM_BATTA, 27, 154),
-	VEGETABLE_BATTA(ItemID.VEGETABLE_BATTA, 28, 156),
-	SWEETCORN(ItemID.COOKED_SWEETCORN, 28, 104),
 	COOKED_SLIMY_EEL(ItemID.COOKED_SLIMY_EEL, 28, 95),
+	SWEETCORN(ItemID.COOKED_SWEETCORN, 28, 104),
+	VEGETABLE_BATTA(ItemID.VEGETABLE_BATTA, 28, 156),
 	MUD_PIE(ItemID.MUD_PIE, 29, 128),
-	GREENMANS_ALE(ItemID.GREENMANS_ALE, 29, 281),
 	CHEESE_AND_TOMATO_BATTA(ItemID.CHEESETOM_BATTA, 29, 158),
+	GREENMANS_ALE(ItemID.GREENMANS_ALE, 29, 281),
+	COOKED_BREAM(ItemID.COOKED_BREAM, 30, 45),
+	COOKED_MOSS_LIZARD(ItemID.COOKED_MOSS_LIZARD, 30, 60),
+	ROASTED_CHOMPY(ItemID.COOKED_CHOMPY, 30, 100),
 	TUNA(ItemID.TUNA, 30, 100),
 	APPLE_PIE(ItemID.APPLE_PIE, 30, 130),
 	WORM_HOLE(ItemID.WORM_HOLE, 30, 170),
 	COOKED_KARAMBWAN(ItemID.COOKED_KARAMBWAN, 30, 190),
-	ROASTED_CHOMPY(ItemID.COOKED_CHOMPY, 30, 100),
+	COOKED_LARUPIA(ItemID.COOKED_LARUPIA, 31, 92),
 	FISHCAKE(ItemID.COOKED_FISHCAKE, 31, 100),
+	COOKED_BARBTAILED_KEBBIT(ItemID.COOKED_BARBTAILED_KEBBIT, 32, 106),
 	DRUNK_DRAGON(ItemID.DRUNK_DRAGON, 32, 160),
-	CHOC_SATURDAY(ItemID.CHOC_SATURDAY, 33, 170),
 	TETRA(ItemID.TETRA, 33, 31),
+	CHOC_SATURDAY(ItemID.CHOC_SATURDAY, 33, 170),
 	GARDEN_PIE(ItemID.GARDEN_PIE, 34, 138),
 	WIZARDS_MIND_BOMB(ItemID.WIZARDS_MIND_BOMB, 34, 314, true),
-	JUG_OF_WINE(ItemID.JUG_OF_WINE, 35, 200),
-	PLAIN_PIZZA(ItemID.PLAIN_PIZZA, 35, 143),
 	RAINBOW_FISH(ItemID.RAINBOW_FISH, 35, 110),
+	PLAIN_PIZZA(ItemID.PLAIN_PIZZA, 35, 143),
 	VEG_BALL(ItemID.VEG_BALL, 35, 175),
+	JUG_OF_WINE(ItemID.JUG_OF_WINE, 35, 200),
 	BLURBERRY_SPECIAL(ItemID.BLURBERRY_SPECIAL, 37, 180),
-	CAVE_EEL(ItemID.CAVE_EEL, 38, 115),
 	PAT_OF_BUTTER(ItemID.PAT_OF_BUTTER, 38, 40.5f),
-	DRAGON_BITTER(ItemID.DRAGON_BITTER, 39, 347),
+	CAVE_EEL(ItemID.CAVE_EEL, 38, 115),
 	POTATO_WITH_BUTTER(ItemID.POTATO_WITH_BUTTER, 39, 40),
+	DRAGON_BITTER(ItemID.DRAGON_BITTER, 39, 347),
 	LOBSTER(ItemID.LOBSTER, 40, 120),
 	CAKE(ItemID.CAKE, 40, 180),
 	TANGLED_TOADS_LEGS(ItemID.TANGLED_TOADS_LEGS, 40, 185),
-	CHILLI_POTATO(ItemID.CHILLI_POTATO, 41, 165.5f),
+	COOKED_GRAAHK(ItemID.COOKED_GRAAHK, 41, 124),
 	COOKED_JUBBLY(ItemID.COOKED_JUBBLY, 41, 160),
-	CHOCOLATE_BOMB(ItemID.CHOCOLATE_BOMB, 42, 190),
+	CHILLI_POTATO(ItemID.CHILLI_POTATO, 41, 165.5f),
 	FRIED_ONIONS(ItemID.FRIED_ONIONS, 42, 60),
+	CHOCOLATE_BOMB(ItemID.CHOCOLATE_BOMB, 42, 190),
 	BASS(ItemID.BASS, 43, 130),
 	MOONLIGHT_MEAD(ItemID.MOONLIGHT_MEAD, 44, 380),
 	SWORDFISH(ItemID.SWORDFISH, 45, 140),
 	MEAT_PIZZA(ItemID.MEAT_PIZZA, 45, 169),
-	FRIED_MUSHROOMS(ItemID.FRIED_MUSHROOMS, 46, 60),
 	CATFISH(ItemID.CATFISH, 46, 43),
-	FISH_PIE(ItemID.FISH_PIE, 47, 164),
+	FRIED_MUSHROOMS(ItemID.FRIED_MUSHROOMS, 46, 60),
 	POTATO_WITH_CHEESE(ItemID.POTATO_WITH_CHEESE, 47, 40),
+	FISH_PIE(ItemID.FISH_PIE, 47, 164),
 	CHEESE(ItemID.CHEESE, 48, 64, true),
 	AXEMANS_FOLLY(ItemID.AXEMANS_FOLLY, 49, 413),
 	COOKED_OOMLIE_WRAP(ItemID.COOKED_OOMLIE_WRAP, 50, 30),
 	CHOCOLATE_CAKE(ItemID.CHOCOLATE_CAKE, 50, 210),
+	COOKED_KYATT(ItemID.COOKED_KYATT, 51, 143),
 	EGG_POTATO(ItemID.EGG_POTATO, 51, 195.5f),
 	BOTANICAL_PIE(ItemID.BOTANICAL_PIE, 52, 180),
 	LAVA_EEL(ItemID.LAVA_EEL, 53, 30),
 	CHEFS_DELIGHT(ItemID.CHEFS_DELIGHT, 54, 446),
 	ANCHOVY_PIZZA(ItemID.ANCHOVY_PIZZA, 55, 182),
 	MUSHROOM_AND_ONION(ItemID.MUSHROOM__ONION, 57, 120),
-	UGTHANKI_KEBAB_FRESH(ItemID.UGTHANKI_KEBAB, 58, 80),
 	PITTA_BREAD(ItemID.PITTA_BREAD, 58, 40),
+	UGTHANKI_KEBAB_FRESH(ItemID.UGTHANKI_KEBAB, 58, 80),
 	SLAYERS_RESPITE(ItemID.SLAYERS_RESPITE, 59, 479),
-	CURRY(ItemID.CURRY, 60, 280),
 	MUSHROOM_PIE(ItemID.MUSHROOM_PIE, 60, 200),
+	CURRY(ItemID.CURRY, 60, 280),
 	MONKFISH(ItemID.MONKFISH, 62, 150),
 	MUSHROOM_POTATO(ItemID.MUSHROOM_POTATO, 64, 270.5f),
 	PINEAPPLE_PIZZA(ItemID.PINEAPPLE_PIZZA, 65, 188),
 	WINE_OF_ZAMORAK(ItemID.WINE_OF_ZAMORAK, 65, 200, true),
 	TUNA_AND_CORN(ItemID.TUNA_AND_CORN, 67, 204),
+	COOKED_SUNLIGHT_ANTELOPE(ItemID.COOKED_SUNLIGHT_ANTELOPE, 68, 175),
 	TUNA_POTATO(ItemID.TUNA_POTATO, 68, 309.5f),
 	ADMIRAL_PIE(ItemID.ADMIRAL_PIE, 70, 210),
 	SACRED_EEL(ItemID.SACRED_EEL, 72, 109),
 	DRAGONFRUIT_PIE(ItemID.DRAGONFRUIT_PIE, 73, 220),
 	SHARK(ItemID.SHARK, 80, 210),
 	SEA_TURTLE(ItemID.SEA_TURTLE, 82, 211.3f),
+	COOKED_DASHING_KEBBIT(ItemID.COOKED_DASHING_KEBBIT, 82, 215),
 	ANGLERFISH(ItemID.ANGLERFISH, 84, 230),
 	WILD_PIE(ItemID.WILD_PIE, 85, 240),
 	DARK_CRAB(ItemID.DARK_CRAB, 90, 215),
 	MANTA_RAY(ItemID.MANTA_RAY, 91, 216.3f),
+	COOKED_MOONLIGHT_ANTELOPE(ItemID.COOKED_MOONLIGHT_ANTELOPE, 92, 220),
 	SUMMER_PIE(ItemID.SUMMER_PIE, 95, 260),
 	;
 
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/CraftingAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/CraftingAction.java
index 5f3618468..9806fa02e 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/CraftingAction.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/CraftingAction.java
@@ -34,27 +34,27 @@ import net.runelite.client.game.ItemManager;
 public enum CraftingAction implements ItemSkillAction
 {
 	BALL_OF_WOOL(ItemID.BALL_OF_WOOL, 1, 2.5f),
-	UNFIRED_POT(ItemID.UNFIRED_POT, 1, 6.3f),
 	POT(ItemID.POT, 1, 6.3f),
+	UNFIRED_POT(ItemID.UNFIRED_POT, 1, 6.3f),
+	OPAL_RING(ItemID.OPAL_RING, 1, 10),
 	LEATHER_GLOVES(ItemID.LEATHER_GLOVES, 1, 13.8f),
 	OPAL(ItemID.OPAL, 1, 15),
-	OPAL_RING(ItemID.OPAL_RING, 1, 10),
-	MOLTEN_GLASS(ItemID.MOLTEN_GLASS, 1, 20),
 	BEER_GLASS(ItemID.BEER_GLASS, 1, 17.5f, true),
+	MOLTEN_GLASS(ItemID.MOLTEN_GLASS, 1, 20),
 	EMPTY_CANDLE_LANTERN(ItemID.EMPTY_CANDLE_LANTERN, 4, 19),
-	GOLD_RING(ItemID.GOLD_RING, 5, 15),
 	BIRD_HOUSE(ItemID.BIRD_HOUSE, 5, 15),
+	GOLD_RING(ItemID.GOLD_RING, 5, 15),
 	GOLD_NECKLACE(ItemID.GOLD_NECKLACE, 6, 20),
-	LEATHER_BOOTS(ItemID.LEATHER_BOOTS, 7, 16.3f),
-	UNFIRED_PIE_DISH(ItemID.UNFIRED_PIE_DISH, 7, 15),
 	PIE_DISH(ItemID.PIE_DISH, 7, 10),
+	UNFIRED_PIE_DISH(ItemID.UNFIRED_PIE_DISH, 7, 15),
+	LEATHER_BOOTS(ItemID.LEATHER_BOOTS, 7, 16.3f),
 	GOLD_BRACELET(ItemID.GOLD_BRACELET_11069, 7, 25),
-	UNFIRED_BOWL(ItemID.UNFIRED_BOWL, 8, 18),
 	BOWL(ItemID.BOWL, 8, 15),
+	UNFIRED_BOWL(ItemID.UNFIRED_BOWL, 8, 18),
 	GOLD_AMULET_U(ItemID.GOLD_AMULET_U, 8, 30),
 	COWL(ItemID.LEATHER_COWL, 9, 18.5f),
-	CROSSBOW_STRING(ItemID.CROSSBOW_STRING, 10, 15),
 	BOW_STRING(ItemID.BOW_STRING, 10, 15),
+	CROSSBOW_STRING(ItemID.CROSSBOW_STRING, 10, 15),
 	LEATHER_VAMBRACES(ItemID.LEATHER_VAMBRACES, 11, 22),
 	EMPTY_OIL_LAMP(ItemID.EMPTY_OIL_LAMP, 12, 25),
 	JADE(ItemID.JADE, 13, 20),
@@ -62,79 +62,79 @@ public enum CraftingAction implements ItemSkillAction
 	LEATHER_BODY(ItemID.LEATHER_BODY, 14, 25),
 	OAK_BIRD_HOUSE(ItemID.OAK_BIRD_HOUSE, 15, 20),
 	RED_TOPAZ(ItemID.RED_TOPAZ, 16, 25),
+	OPAL_NECKLACE(ItemID.OPAL_NECKLACE, 16, 35),
 	TOPAZ_RING(ItemID.TOPAZ_RING, 16, 35),
 	HOLY_SYMBOL(ItemID.HOLY_SYMBOL, 16, 50),
-	OPAL_NECKLACE(ItemID.OPAL_NECKLACE, 16, 35),
 	UNHOLY_SYMBOL(ItemID.UNHOLY_SYMBOL, 17, 50),
 	LEATHER_CHAPS(ItemID.LEATHER_CHAPS, 18, 27),
-	UNFIRED_PLANT_POT(ItemID.UNFIRED_PLANT_POT, 19, 20),
 	EMPTY_PLANT_POT(ItemID.EMPTY_PLANT_POT, 19, 17.5f),
+	UNFIRED_PLANT_POT(ItemID.UNFIRED_PLANT_POT, 19, 20),
 	MAGIC_STRING(ItemID.MAGIC_STRING, 19, 30),
-	SAPPHIRE(ItemID.SAPPHIRE, 20, 50),
 	SAPPHIRE_RING(ItemID.SAPPHIRE_RING, 20, 40),
+	SAPPHIRE(ItemID.SAPPHIRE, 20, 50),
 	EMPTY_SACK(ItemID.EMPTY_SACK, 21, 38),
-	SAPPHIRE_NECKLACE(ItemID.SAPPHIRE_NECKLACE, 22, 55),
 	OPAL_BRACELET(ItemID.OPAL_BRACELET, 22, 45),
-	SAPPHIRE_BRACELET(ItemID.SAPPHIRE_BRACELET_11072, 23, 60),
+	SAPPHIRE_NECKLACE(ItemID.SAPPHIRE_NECKLACE, 22, 55),
 	TIARA(ItemID.TIARA, 23, 52.5f),
+	SAPPHIRE_BRACELET(ItemID.SAPPHIRE_BRACELET_11072, 23, 60),
 	SAPPHIRE_AMULET_U(ItemID.SAPPHIRE_AMULET_U, 24, 65),
-	UNFIRED_POT_LID(ItemID.UNFIRED_POT_LID, 25, 20),
 	POT_LID(ItemID.POT_LID, 25, 20),
-	JADE_NECKLACE(ItemID.JADE_NECKLACE, 25, 54),
+	UNFIRED_POT_LID(ItemID.UNFIRED_POT_LID, 25, 20),
 	WILLOW_BIRD_HOUSE(ItemID.WILLOW_BIRD_HOUSE, 25, 25),
+	JADE_NECKLACE(ItemID.JADE_NECKLACE, 25, 54),
 	DRIFT_NET(ItemID.DRIFT_NET, 26, 55),
-	EMERALD(ItemID.EMERALD, 27, 67.5f),
 	EMERALD_RING(ItemID.EMERALD_RING, 27, 55),
 	OPAL_AMULET_U(ItemID.OPAL_AMULET_U, 27, 55),
+	EMERALD(ItemID.EMERALD, 27, 67.5f),
 	HARDLEATHER_BODY(ItemID.HARDLEATHER_BODY, 28, 35),
 	EMERALD_NECKLACE(ItemID.EMERALD_NECKLACE, 29, 60),
 	JADE_BRACELET(ItemID.JADE_BRACELET, 29, 60),
-	EMERALD_BRACELET(ItemID.EMERALD_BRACELET, 30, 65),
 	ROPE(ItemID.ROPE, 30, 25, true),
+	EMERALD_BRACELET(ItemID.EMERALD_BRACELET, 30, 65),
 	EMERALD_AMULET_U(ItemID.EMERALD_AMULET_U, 31, 70),
 	SPIKY_VAMBRACES(ItemID.SPIKY_VAMBRACES, 32, 6),
 	TOPAZ_NECKLACE(ItemID.TOPAZ_NECKLACE, 32, 70),
 	VIAL(ItemID.VIAL, 33, 35, true),
-	RUBY(ItemID.RUBY, 34, 85),
-	RUBY_RING(ItemID.RUBY_RING, 34, 70),
 	JADE_AMULET_U(ItemID.JADE_AMULET_U, 34, 70),
-	BROODOO_SHIELD(ItemID.BROODOO_SHIELD, 35, 100),
+	RUBY_RING(ItemID.RUBY_RING, 34, 70),
+	RUBY(ItemID.RUBY, 34, 85),
 	TEAK_BIRD_HOUSE(ItemID.TEAK_BIRD_HOUSE, 35, 30),
+	BROODOO_SHIELD(ItemID.BROODOO_SHIELD, 35, 100),
 	BASKET(ItemID.BASKET, 36, 56),
 	COIF(ItemID.COIF, 38, 37, true),
 	TOPAZ_BRACELET(ItemID.TOPAZ_BRACELET, 38, 75),
 	RUBY_NECKLACE(ItemID.RUBY_NECKLACE, 40, 75),
 	HARD_LEATHER_SHIELD(ItemID.HARD_LEATHER_SHIELD, 41, 70),
-	RUBY_BRACELET(ItemID.RUBY_BRACELET, 42, 80),
 	FISHBOWL(ItemID.FISHBOWL, 42, 42.5f),
-	DIAMOND(ItemID.DIAMOND, 43, 107.5f),
+	RUBY_BRACELET(ItemID.RUBY_BRACELET, 42, 80),
 	DIAMOND_RING(ItemID.DIAMOND_RING, 43, 85),
-	TOPAZ_AMULET_U(ItemID.TOPAZ_AMULET_U, 45, 80),
+	DIAMOND(ItemID.DIAMOND, 43, 107.5f),
 	SNAKESKIN_BOOTS(ItemID.SNAKESKIN_BOOTS, 45, 30),
 	MAPLE_BIRD_HOUSE(ItemID.MAPLE_BIRD_HOUSE, 45, 35),
+	TOPAZ_AMULET_U(ItemID.TOPAZ_AMULET_U, 45, 80),
 	UNPOWERED_ORB(ItemID.UNPOWERED_ORB, 46, 52.5f),
 	SNAKESKIN_VAMBRACES(ItemID.SNAKESKIN_VAMBRACES, 47, 35),
 	SNAKESKIN_BANDANA(ItemID.SNAKESKIN_BANDANA, 48, 45),
 	LANTERN_LENS(ItemID.LANTERN_LENS, 49, 55),
-	RUBY_AMULET_U(ItemID.RUBY_AMULET_U, 50, 85),
 	MAHOGANY_BIRD_HOUSE(ItemID.MAHOGANY_BIRD_HOUSE, 50, 40),
+	RUBY_AMULET_U(ItemID.RUBY_AMULET_U, 50, 85),
 	SNAKESKIN_CHAPS(ItemID.SNAKESKIN_CHAPS, 51, 50),
 	SNAKESKIN_BODY(ItemID.SNAKESKIN_BODY, 53, 55),
 	WATER_BATTLESTAFF(ItemID.WATER_BATTLESTAFF, 54, 100),
-	DRAGONSTONE(ItemID.DRAGONSTONE, 55, 137.5f),
 	DRAGONSTONE_RING(ItemID.DRAGONSTONE_RING, 55, 100),
+	DRAGONSTONE(ItemID.DRAGONSTONE, 55, 137.5f),
 	DIAMOND_NECKLACE(ItemID.DIAMOND_NECKLACE, 56, 90),
 	SNAKESKIN_SHIELD(ItemID.SNAKESKIN_SHIELD, 56, 100),
 	GREEN_DHIDE_VAMB(ItemID.GREEN_DHIDE_VAMBRACES, 57, 62, true),
 	DIAMOND_BRACELET(ItemID.DIAMOND_BRACELET, 58, 95),
 	EARTH_BATTLESTAFF(ItemID.EARTH_BATTLESTAFF, 58, 112.5f),
-	GREEN_DHIDE_CHAPS(ItemID.GREEN_DHIDE_CHAPS, 60, 124, true),
 	YEW_BIRD_HOUSE(ItemID.YEW_BIRD_HOUSE, 60, 45),
-	FIRE_BATTLESTAFF(ItemID.FIRE_BATTLESTAFF, 62, 125),
+	GREEN_DHIDE_CHAPS(ItemID.GREEN_DHIDE_CHAPS, 60, 124, true),
 	GREEN_DHIDE_SHIELD(ItemID.GREEN_DHIDE_SHIELD, 62, 124),
+	FIRE_BATTLESTAFF(ItemID.FIRE_BATTLESTAFF, 62, 125),
 	GREEN_DHIDE_BODY(ItemID.GREEN_DHIDE_BODY, 63, 186, true),
-	AIR_BATTLESTAFF(ItemID.AIR_BATTLESTAFF, 66, 137.5f),
 	BLUE_DHIDE_VAMB(ItemID.BLUE_DHIDE_VAMBRACES, 66, 70),
+	AIR_BATTLESTAFF(ItemID.AIR_BATTLESTAFF, 66, 137.5f),
 	ONYX_RING(ItemID.ONYX_RING, 67, 115),
 	ONYX(ItemID.ONYX, 67, 167.5f),
 	BLUE_DHIDE_CHAPS(ItemID.BLUE_DHIDE_CHAPS, 68, 140),
@@ -144,26 +144,26 @@ public enum CraftingAction implements ItemSkillAction
 	DRAGONSTONE_NECKLACE(ItemID.DRAGON_NECKLACE, 72, 105),
 	RED_DHIDE_VAMB(ItemID.RED_DHIDE_VAMBRACES, 73, 78),
 	DRAGONSTONE_BRACELET(ItemID.DRAGONSTONE_BRACELET, 74, 110),
-	RED_DHIDE_CHAPS(ItemID.RED_DHIDE_CHAPS, 75, 156),
 	MAGIC_BIRD_HOUSE(ItemID.MAGIC_BIRD_HOUSE, 75, 50),
+	RED_DHIDE_CHAPS(ItemID.RED_DHIDE_CHAPS, 75, 156),
 	RED_DHIDE_SHIELD(ItemID.RED_DHIDE_SHIELD, 76, 156),
 	RED_DHIDE_BODY(ItemID.RED_DHIDE_BODY, 77, 234),
 	BLACK_DHIDE_VAMB(ItemID.BLACK_DHIDE_VAMBRACES, 79, 86),
 	DRAGONSTONE_AMULET_U(ItemID.DRAGONSTONE_AMULET_U, 80, 150),
-	BLACK_DHIDE_CHAPS(ItemID.BLACK_DHIDE_CHAPS, 82, 172),
 	ONYX_NECKLACE(ItemID.ONYX_NECKLACE, 82, 120),
+	BLACK_DHIDE_CHAPS(ItemID.BLACK_DHIDE_CHAPS, 82, 172),
 	AMETHYST_BOLT_TIPS(ItemID.AMETHYST_BOLT_TIPS, 83, 4),
 	BLACK_DHIDE_SHIELD(ItemID.BLACK_DHIDE_SHIELD, 83, 172),
-	BLACK_DHIDE_BODY(ItemID.BLACK_DHIDE_BODY, 84, 258),
 	ONYX_BRACELET(ItemID.ONYX_BRACELET, 84, 125),
+	BLACK_DHIDE_BODY(ItemID.BLACK_DHIDE_BODY, 84, 258),
 	AMETHYST_ARROWTIPS(ItemID.AMETHYST_ARROWTIPS, 85, 4),
 	AMETHYST_JAVELIN_HEADS(ItemID.AMETHYST_JAVELIN_HEADS, 87, 12),
 	LIGHT_ORB(ItemID.LIGHT_ORB, 87, 70),
 	AMETHYST_DART_TIP(ItemID.AMETHYST_DART_TIP, 89, 7.5f),
-	ZENYTE(ItemID.ZENYTE, 89, 200),
 	ZENYTE_RING(ItemID.ZENYTE_RING, 89, 150),
-	ONYX_AMULET_U(ItemID.ONYX_AMULET_U, 90, 165),
+	ZENYTE(ItemID.ZENYTE, 89, 200),
 	REDWOOD_BIRD_HOUSE(ItemID.REDWOOD_BIRD_HOUSE, 90, 55),
+	ONYX_AMULET_U(ItemID.ONYX_AMULET_U, 90, 165),
 	ZENYTE_NECKLACE(ItemID.ZENYTE_NECKLACE, 92, 165),
 	ZENYTE_BRACELET(ItemID.ZENYTE_BRACELET_19532, 95, 180),
 	ZENYTE_AMULET_U(ItemID.ZENYTE_AMULET_U, 98, 200),
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FarmingAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FarmingAction.java
index 2ce70b1cc..24ff6014a 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FarmingAction.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FarmingAction.java
@@ -34,23 +34,23 @@ import net.runelite.client.game.ItemManager;
 @Getter
 public enum FarmingAction implements NamedSkillAction
 {
-	PLANT("Plant", 1, 31, ItemID.PLANT),
+	POTATOES("Potatoes", 1, 8, ItemID.POTATO),
+	WINTER_SQIRK("Winter Sq'irk", 1, 30, ItemID.WINTER_SQIRK),
+	DOCK_LEAF("Dock Leaf", 1, 31, ItemID.DOCK_LEAF),
 	FERN_BIG_PLANT("Fern (big plant)", 1, 31, ItemID.FERN_8186),
+	PLANT("Plant", 1, 31, ItemID.PLANT),
 	SHORT_PLANT("Short Plant", 1, 31, ItemID.SHORT_PLANT),
-	DOCK_LEAF("Dock Leaf", 1, 31, ItemID.DOCK_LEAF),
-	SMALL_FERN("Small Fern", 1, 70, ItemID.SMALL_FERN),
-	THISTLE("Thistle", 1, 70, ItemID.THISTLE),
+	SPRING_SQIRK("Spring Sq'irk", 1, 40, ItemID.SPRING_SQIRK),
+	AUTUMN_SQIRK("Autumn Sq'irk", 1, 50, ItemID.AUTUMN_SQIRK),
+	SUMMER_SQIRK("Summer Sq'irk", 1, 60, ItemID.SUMMER_SQIRK),
 	BUSH("Bush", 1, 70, ItemID.BUSH),
 	LARGE_LEAF_BUSH("Large Leaf Bush", 1, 70, ItemID.LARGELEAF_PLANT),
+	SMALL_FERN("Small Fern", 1, 70, ItemID.SMALL_FERN),
+	THISTLE("Thistle", 1, 70, ItemID.THISTLE),
+	FERN_SMALL_PLANT("Fern (small plant)", 1, 100, ItemID.FERN),
 	HUGE_PLANT("Huge Plant", 1, 100, ItemID.HUGE_PLANT),
-	TALL_PLANT("Tall Plant", 1, 100, ItemID.TALL_PLANT),
 	REEDS("Reeds", 1, 100, ItemID.REEDS),
-	FERN_SMALL_PLANT("Fern (small plant)", 1, 100, ItemID.FERN),
-	WINTER_SQIRK("Winter Sq'irk", 1, 30, ItemID.WINTER_SQIRK),
-	SPRING_SQIRK("Spring Sq'irk", 1, 40, ItemID.SPRING_SQIRK),
-	AUTUMN_SQIRK("Autumn Sq'irk", 1, 50, ItemID.AUTUMN_SQIRK),
-	SUMMER_SQIRK("Summer Sq'irk", 1, 60, ItemID.SUMMER_SQIRK),
-	POTATOES("Potatoes", 1, 8, ItemID.POTATO),
+	TALL_PLANT("Tall Plant", 1, 100, ItemID.TALL_PLANT),
 	ONIONS("Onions", 5, 10, ItemID.ONION),
 	CABBAGES("Cabbages", 7, 10, ItemID.CABBAGE),
 	GUAM_LEAF("Guam Leaf", 9, 11, ItemID.GUAM_LEAF),
@@ -94,8 +94,8 @@ public enum FarmingAction implements NamedSkillAction
 	DWARF_WEED("Dwarf Weed", 79, 170.5f, ItemID.DWARF_WEED),
 	DRAGONFRUIT_TREE("Dragonfruit Tree", 81, 17895, ItemID.DRAGONFRUIT),
 	SPIRIT_TREE("Spirit Tree", 83, 19501.3f, ItemID.SPIRIT_TREE),
-	CELASTRUS_TREE("Celastrus Tree", 85, 14334, ItemID.CELASTRUS_BARK),
 	TORSTOL("Torstol", 85, 199.5f, ItemID.TORSTOL),
+	CELASTRUS_TREE("Celastrus Tree", 85, 14334, ItemID.CELASTRUS_BARK),
 	REDWOOD_TREE("Redwood Tree", 90, 22680, ItemID.REDWOOD_LOGS),
 	;
 
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FarmingBonus.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FarmingBonus.java
index 732877207..e29ae4fa4 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FarmingBonus.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FarmingBonus.java
@@ -31,7 +31,7 @@ import lombok.Getter;
 @Getter(onMethod_ = @Override)
 public enum FarmingBonus implements SkillBonus
 {
-	FARMERS_OUTFIT("Farmer's Outfit (+2.5%)", 1.025f),
+	FARMERS_OUTFIT("Farmer's Outfit", 1.025f),
 	;
 
 	private final String name;
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FiremakingAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FiremakingAction.java
index 424fb851a..f75baa737 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FiremakingAction.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FiremakingAction.java
@@ -32,8 +32,8 @@ import net.runelite.api.ItemID;
 @Getter
 public enum FiremakingAction implements ItemSkillAction
 {
-	LOGS(ItemID.LOGS, 1, 40),
 	ACHEY_TREE_LOGS(ItemID.ACHEY_TREE_LOGS, 1, 40),
+	LOGS(ItemID.LOGS, 1, 40),
 	OAK_LOGS(ItemID.OAK_LOGS, 15, 60),
 	WILLOW_LOGS(ItemID.WILLOW_LOGS, 30, 90),
 	TEAK_LOGS(ItemID.TEAK_LOGS, 35, 105),
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FiremakingBonus.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FiremakingBonus.java
index c153a2fea..b20f6fca8 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FiremakingBonus.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FiremakingBonus.java
@@ -33,8 +33,8 @@ import lombok.Getter;
 @Getter(onMethod_ = @Override)
 public enum FiremakingBonus implements SkillBonus
 {
-	PYROMANCER_OUTFIT("Pyromancer Outfit (+2.5%)", 1.025f),
-	FORESTERS_CAMPFIRE("Forester's Campfire (33%)", 0.33333333f),
+	PYROMANCER_OUTFIT("Pyromancer Outfit", 1.025f),
+	FORESTERS_CAMPFIRE("Forester's Campfire", 0.33333333f),
 	;
 
 	private final String name;
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FishingAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FishingAction.java
index 386ec964c..ba20354c8 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FishingAction.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FishingAction.java
@@ -33,25 +33,26 @@ import net.runelite.api.ItemID;
 public enum FishingAction implements ItemSkillAction
 {
 	RAW_SHRIMPS(ItemID.RAW_SHRIMPS, 1, 10),
-	RAW_SARDINE(ItemID.RAW_SARDINE, 5, 20),
 	RAW_KARAMBWANJI(ItemID.RAW_KARAMBWANJI, 5, 5),
+	RAW_SARDINE(ItemID.RAW_SARDINE, 5, 20),
 	RAW_GUPPY(ItemID.RAW_GUPPY, 7, 8),
 	RAW_HERRING(ItemID.RAW_HERRING, 10, 30),
 	RAW_ANCHOVIES(ItemID.RAW_ANCHOVIES, 15, 40),
 	RAW_MACKEREL(ItemID.RAW_MACKEREL, 16, 20),
-	RAW_TROUT(ItemID.RAW_TROUT, 20, 50),
 	RAW_CAVEFISH(ItemID.RAW_CAVEFISH, 20, 16),
+	RAW_BREAM(ItemID.RAW_BREAM, 20, 20),
+	RAW_TROUT(ItemID.RAW_TROUT, 20, 50),
 	RAW_COD(ItemID.RAW_COD, 23, 45),
 	RAW_PIKE(ItemID.RAW_PIKE, 25, 60),
 	RAW_SLIMY_EEL(ItemID.RAW_SLIMY_EEL, 28, 80),
 	RAW_SALMON(ItemID.RAW_SALMON, 30, 70),
 	RAW_TETRA(ItemID.RAW_TETRA, 33, 24),
 	RAW_TUNA(ItemID.RAW_TUNA, 35, 80),
-	RAW_RAINBOW_FISH(ItemID.RAW_RAINBOW_FISH, 38, 80),
 	RAW_CAVE_EEL(ItemID.RAW_CAVE_EEL, 38, 80),
+	RAW_RAINBOW_FISH(ItemID.RAW_RAINBOW_FISH, 38, 80),
 	RAW_LOBSTER(ItemID.RAW_LOBSTER, 40, 90),
-	RAW_BASS(ItemID.RAW_BASS, 46, 100),
 	RAW_CATFISH(ItemID.RAW_CATFISH, 46, 33),
+	RAW_BASS(ItemID.RAW_BASS, 46, 100),
 	LEAPING_TROUT(ItemID.LEAPING_TROUT, 48, 50),
 	RAW_SWORDFISH(ItemID.RAW_SWORDFISH, 50, 100),
 	LEAPING_SALMON(ItemID.LEAPING_SALMON, 58, 70),
@@ -62,8 +63,8 @@ public enum FishingAction implements ItemSkillAction
 	RAW_SEA_TURTLE(ItemID.RAW_SEA_TURTLE, 79, 38),
 	INFERNAL_EEL(ItemID.INFERNAL_EEL, 80, 95),
 	RAW_MANTA_RAY(ItemID.RAW_MANTA_RAY, 81, 46),
-	RAW_ANGLERFISH(ItemID.RAW_ANGLERFISH, 82, 120),
 	MINNOW(ItemID.MINNOW, 82, 26.5f),
+	RAW_ANGLERFISH(ItemID.RAW_ANGLERFISH, 82, 120),
 	RAW_DARK_CRAB(ItemID.RAW_DARK_CRAB, 85, 130),
 	SACRED_EEL(ItemID.SACRED_EEL, 87, 105),
 	;
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FishingBonus.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FishingBonus.java
index 832e7ff44..b3b756722 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FishingBonus.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FishingBonus.java
@@ -31,7 +31,7 @@ import lombok.Getter;
 @Getter(onMethod_ = @Override)
 public enum FishingBonus implements SkillBonus
 {
-	ANGLERS_OUTFIT("Angler's Outfit (+2.5%)", 1.025f),
+	ANGLERS_OUTFIT("Angler's Outfit", 1.025f),
 	;
 
 	private final String name;
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FletchingAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FletchingAction.java
index 2e8726ee5..f30e06e7d 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FletchingAction.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/FletchingAction.java
@@ -38,81 +38,82 @@ public enum FletchingAction implements ItemSkillAction
 	BRONZE_ARROW(ItemID.BRONZE_ARROW, 1, 1.3f),
 	BRONZE_JAVELIN(ItemID.BRONZE_JAVELIN, 3, 1),
 	OGRE_ARROW(ItemID.OGRE_ARROW, 5, 1),
-	SHORTBOW_U(ItemID.SHORTBOW_U, 5, 5),
 	SHORTBOW(ItemID.SHORTBOW, 5, 5),
+	SHORTBOW_U(ItemID.SHORTBOW_U, 5, 5),
 	BRONZE_BOLTS(ItemID.BRONZE_BOLTS, 9, 0.5f),
+	BRONZE_CROSSBOW(ItemID.BRONZE_CROSSBOW, 9, 6),
 	WOODEN_STOCK(ItemID.WOODEN_STOCK, 9, 6),
 	BRONZE_CROSSBOW_U(ItemID.BRONZE_CROSSBOW_U, 9, 12),
-	BRONZE_CROSSBOW(ItemID.BRONZE_CROSSBOW, 9, 6),
 	BRONZE_DART(ItemID.BRONZE_DART, 10, 1.8f),
 	LONGBOW(ItemID.LONGBOW, 10, 10),
 	LONGBOW_U(ItemID.LONGBOW_U, 10, 10),
 	OPAL_BOLTS(ItemID.OPAL_BOLTS, 11, 1.6f),
 	IRON_ARROW(ItemID.IRON_ARROW, 15, 2.5f),
 	IRON_JAVELIN(ItemID.IRON_JAVELIN, 17, 2),
-	OAK_SHORTBOW_U(ItemID.OAK_SHORTBOW_U, 20, 16.5f),
 	OAK_SHORTBOW(ItemID.OAK_SHORTBOW, 20, 16.5f),
+	OAK_SHORTBOW_U(ItemID.OAK_SHORTBOW_U, 20, 16.5f),
 	IRON_DART(ItemID.IRON_DART, 22, 3.8f),
+	BLURITE_CROSSBOW(ItemID.BLURITE_CROSSBOW, 24, 16),
 	OAK_STOCK(ItemID.OAK_STOCK, 24, 16),
 	BLURITE_CROSSBOW_U(ItemID.BLURITE_CROSSBOW_U, 24, 32),
-	BLURITE_CROSSBOW(ItemID.BLURITE_CROSSBOW, 24, 16),
-	OAK_LONGBOW_U(ItemID.OAK_LONGBOW_U, 25, 25),
 	OAK_LONGBOW(ItemID.OAK_LONGBOW, 25, 25),
+	OAK_LONGBOW_U(ItemID.OAK_LONGBOW_U, 25, 25),
 	OAK_SHIELD(ItemID.OAK_SHIELD, 27, 50),
 	STEEL_ARROW(ItemID.STEEL_ARROW, 30, 5),
-	STEEL_JAVELIN(ItemID.STEEL_JAVELIN, 32, 5),
 	KEBBIT_BOLTS(ItemID.KEBBIT_BOLTS, 32, 1),
-	WILLOW_SHORTBOW_U(ItemID.WILLOW_SHORTBOW_U, 35, 33.3f),
+	STEEL_JAVELIN(ItemID.STEEL_JAVELIN, 32, 5),
 	WILLOW_SHORTBOW(ItemID.WILLOW_SHORTBOW, 35, 33.3f),
+	WILLOW_SHORTBOW_U(ItemID.WILLOW_SHORTBOW_U, 35, 33.3f),
 	STEEL_DART(ItemID.STEEL_DART, 37, 7.5f),
 	IRON_BOLTS(ItemID.IRON_BOLTS, 39, 1.5f),
+	IRON_CROSSBOW(ItemID.IRON_CROSSBOW, 39, 22),
 	WILLOW_STOCK(ItemID.WILLOW_STOCK, 39, 22),
 	IRON_CROSSBOW_U(ItemID.IRON_CROSSBOW_U, 39, 44),
-	IRON_CROSSBOW(ItemID.IRON_CROSSBOW, 39, 22),
-	WILLOW_LONGBOW_U(ItemID.WILLOW_LONGBOW_U, 40, 41.5f),
 	WILLOW_LONGBOW(ItemID.WILLOW_LONGBOW, 40, 41.5f),
+	WILLOW_LONGBOW_U(ItemID.WILLOW_LONGBOW_U, 40, 41.5f),
 	BATTLESTAFF(ItemID.BATTLESTAFF, 40, 80),
 	PEARL_BOLTS(ItemID.PEARL_BOLTS, 41, 3.2f),
-	WILLOW_SHIELD(ItemID.WILLOW_SHIELD, 42, 83),
 	LONG_KEBBIT_BOLTS(ItemID.LONG_KEBBIT_BOLTS, 42, 1.3f),
+	WILLOW_SHIELD(ItemID.WILLOW_SHIELD, 42, 83),
 	SILVER_BOLTS(ItemID.SILVER_BOLTS, 43, 2.5f),
 	MITHRIL_ARROW(ItemID.MITHRIL_ARROW, 45, 7.5f),
 	STEEL_BOLTS(ItemID.STEEL_BOLTS, 46, 3.5f),
+	STEEL_CROSSBOW(ItemID.STEEL_CROSSBOW, 46, 27),
 	TEAK_STOCK(ItemID.TEAK_STOCK, 46, 27),
 	STEEL_CROSSBOW_U(ItemID.STEEL_CROSSBOW_U, 46, 54),
-	STEEL_CROSSBOW(ItemID.STEEL_CROSSBOW, 46, 27),
 	MITHRIL_JAVELIN(ItemID.MITHRIL_JAVELIN, 47, 8),
-	MAPLE_SHORTBOW_U(ItemID.MAPLE_SHORTBOW_U, 50, 50),
 	MAPLE_SHORTBOW(ItemID.MAPLE_SHORTBOW, 50, 50),
+	MAPLE_SHORTBOW_U(ItemID.MAPLE_SHORTBOW_U, 50, 50),
 	BARBED_BOLTS(ItemID.BARBED_BOLTS, 51, 9.5f),
-	MITHRIL_DART(ItemID.MITHRIL_DART, 52, 11.2f),
 	BROAD_ARROWS(ItemID.BROAD_ARROWS, 52, 10),
+	MITHRIL_DART(ItemID.MITHRIL_DART, 52, 11.2f),
 	TOXIC_BLOWPIPE(ItemID.TOXIC_BLOWPIPE, 53, 120),
-	MITH_CROSSBOW(ItemID.MITHRIL_CROSSBOW, 54, 32),
-	MAPLE_STOCK(ItemID.MAPLE_STOCK, 54, 32),
 	MITHRIL_BOLTS(ItemID.MITHRIL_BOLTS, 54, 5),
+	MAPLE_STOCK(ItemID.MAPLE_STOCK, 54, 32),
+	MITHRIL_CROSSBOW(ItemID.MITHRIL_CROSSBOW, 54, 32),
 	MITHRIL_CROSSBOW_U(ItemID.MITHRIL_CROSSBOW_U, 54, 64),
-	MAPLE_LONGBOW_U(ItemID.MAPLE_LONGBOW_U, 55, 58.3f),
 	BROAD_BOLTS(ItemID.BROAD_BOLTS, 55, 3),
-	MAPLE_LONGBOW(ItemID.MAPLE_LONGBOW, 55, 58),
+	MAPLE_LONGBOW(ItemID.MAPLE_LONGBOW, 55, 58.2f),
+	MAPLE_LONGBOW_U(ItemID.MAPLE_LONGBOW_U, 55, 58.3f),
 	SAPPHIRE_BOLTS(ItemID.SAPPHIRE_BOLTS, 56, 4.7f),
 	MAPLE_SHIELD(ItemID.MAPLE_SHIELD, 57, 116.5f),
 	EMERALD_BOLTS(ItemID.EMERALD_BOLTS, 58, 5.5f),
+	HUNTERS_SPEAR(ItemID.HUNTERS_SPEAR, 60, 9.5f),
 	ADAMANT_ARROW(ItemID.ADAMANT_ARROW, 60, 10),
 	ADAMANT_BOLTS(ItemID.ADAMANT_BOLTS, 61, 7),
+	ADAMANT_CROSSBOW(ItemID.ADAMANT_CROSSBOW, 61, 41),
 	MAHOGANY_STOCK(ItemID.MAHOGANY_STOCK, 61, 41),
 	ADAMANT_CROSSBOW_U(ItemID.ADAMANT_CROSSBOW_U, 61, 82),
-	ADAMANT_CROSSBOW(ItemID.ADAMANT_CROSSBOW, 61, 41),
 	ADAMANT_JAVELIN(ItemID.ADAMANT_JAVELIN, 62, 10),
 	RUBY_BOLTS(ItemID.RUBY_BOLTS, 63, 6.3f),
 	DIAMOND_BOLTS(ItemID.DIAMOND_BOLTS, 65, 7),
 	YEW_SHORTBOW(ItemID.YEW_SHORTBOW, 65, 67.5f),
 	YEW_SHORTBOW_U(ItemID.YEW_SHORTBOW_U, 65, 67.5f),
 	ADAMANT_DART(ItemID.ADAMANT_DART, 67, 15),
-	RUNITE_CROSSBOW_U(ItemID.RUNITE_CROSSBOW_U, 69, 100),
+	RUNITE_BOLTS(ItemID.RUNITE_BOLTS, 69, 10),
 	RUNE_CROSSBOW(ItemID.RUNE_CROSSBOW, 69, 50),
 	YEW_STOCK(ItemID.YEW_STOCK, 69, 50),
-	RUNITE_BOLTS(ItemID.RUNITE_BOLTS, 69, 10),
+	RUNITE_CROSSBOW_U(ItemID.RUNITE_CROSSBOW_U, 69, 100),
 	YEW_LONGBOW(ItemID.YEW_LONGBOW, 70, 75),
 	YEW_LONGBOW_U(ItemID.YEW_LONGBOW_U, 70, 75),
 	DRAGONSTONE_BOLTS(ItemID.DRAGONSTONE_BOLTS, 71, 8.2f),
@@ -121,9 +122,9 @@ public enum FletchingAction implements ItemSkillAction
 	RUNE_ARROW(ItemID.RUNE_ARROW, 75, 12.5f),
 	AMETHYST_BROAD_BOLTS(ItemID.AMETHYST_BROAD_BOLTS, 76, 10.6f),
 	RUNE_JAVELIN(ItemID.RUNE_JAVELIN, 77, 12.4f),
+	DRAGON_CROSSBOW(ItemID.DRAGON_CROSSBOW, 78, 70),
 	MAGIC_STOCK(ItemID.MAGIC_STOCK, 78, 70),
 	DRAGON_CROSSBOW_U(ItemID.DRAGON_CROSSBOW_U, 78, 135),
-	DRAGON_CROSSBOW(ItemID.DRAGON_CROSSBOW, 78, 70),
 	MAGIC_SHORTBOW(ItemID.MAGIC_SHORTBOW, 80, 83.3f),
 	MAGIC_SHORTBOW_U(ItemID.MAGIC_SHORTBOW_U, 80, 83.3f),
 	RUNE_DART(ItemID.RUNE_DART, 81, 18.8f),
@@ -133,8 +134,8 @@ public enum FletchingAction implements ItemSkillAction
 	MAGIC_LONGBOW(ItemID.MAGIC_LONGBOW, 85, 91.5f),
 	MAGIC_LONGBOW_U(ItemID.MAGIC_LONGBOW_U, 85, 91.5f),
 	MAGIC_SHIELD(ItemID.MAGIC_SHIELD, 87, 183),
-	AMETHYST_DART(ItemID.AMETHYST_DART, 90, 21),
 	DRAGON_ARROW(ItemID.DRAGON_ARROW, 90, 15),
+	AMETHYST_DART(ItemID.AMETHYST_DART, 90, 21),
 	DRAGON_JAVELIN(ItemID.DRAGON_JAVELIN, 92, 15),
 	REDWOOD_SHIELD(ItemID.REDWOOD_SHIELD, 92, 216),
 	DRAGON_DART(ItemID.DRAGON_DART, 95, 25),
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/HerbloreAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/HerbloreAction.java
index 025022ffd..2e1ac43c4 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/HerbloreAction.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/HerbloreAction.java
@@ -33,8 +33,8 @@ import net.runelite.client.game.ItemManager;
 @Getter
 public enum HerbloreAction implements ItemSkillAction
 {
-	ATTACK_POTION_3(ItemID.ATTACK_POTION3, 3, 25),
 	GUAM_LEAF(ItemID.GUAM_LEAF, 3, 2.5f),
+	ATTACK_POTION_3(ItemID.ATTACK_POTION3, 3, 25),
 	MARRENTILL(ItemID.MARRENTILL, 5, 3.8f),
 	ANTIPOISON_3(ItemID.ANTIPOISON3, 5, 37.5f),
 	RELICYMS_BALM_3(ItemID.RELICYMS_BALM3, 8, 40),
@@ -58,8 +58,8 @@ public enum HerbloreAction implements ItemSkillAction
 	IRIT_LEAF(ItemID.IRIT_LEAF, 40, 8.8f),
 	HARRALANDER_TAR(ItemID.HARRALANDER_TAR, 44, 72.5f),
 	SUPER_ATTACK_3(ItemID.SUPER_ATTACK3, 45, 100),
-	SUPERANTIPOISON_3(ItemID.SUPERANTIPOISON3, 48, 106.3f),
 	AVANTOE(ItemID.AVANTOE, 48, 10),
+	SUPERANTIPOISON_3(ItemID.SUPERANTIPOISON3, 48, 106.3f),
 	FISHING_POTION_3(ItemID.FISHING_POTION3, 50, 112.5f),
 	SUPER_ENERGY_3(ItemID.SUPER_ENERGY3, 52, 117.5f),
 	HUNTER_POTION_3(ItemID.HUNTER_POTION3, 53, 120),
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/HunterAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/HunterAction.java
index 4fac817a1..fc2b8d237 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/HunterAction.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/HunterAction.java
@@ -33,8 +33,8 @@ import net.runelite.client.game.ItemManager;
 @Getter
 public enum HunterAction implements NamedSkillAction
 {
-	CRIMSON_SWIFT("Crimson Swift", 1, 34, ItemID.CRIMSON_SWIFT),
 	POLAR_KEBBIT("Polar Kebbit", 1, 30, ItemID.KEBBIT),
+	CRIMSON_SWIFT("Crimson Swift", 1, 34, ItemID.CRIMSON_SWIFT),
 	COMMON_KEBBIT("Common Kebbit", 3, 36, ItemID.KEBBIT_9954),
 	GOLDEN_WARBLER("Golden Warbler", 5, 47, ItemID.GOLDEN_WARBLER),
 	REGULAR_BIRD_HOUSE("Regular Bird House", 5, 280, ItemID.BIRD_HOUSE),
@@ -46,6 +46,7 @@ public enum HunterAction implements NamedSkillAction
 	RUBY_HARVEST("Ruby Harvest", 15, 24, ItemID.BUTTERFLY),
 	BABY_IMPLING("Baby Impling", 17, 18, ItemID.BABY_IMPLING_JAR),
 	TROPICAL_WAGTAIL("Tropical Wagtail", 19, 95, ItemID.TROPICAL_WAGTAIL),
+	MOSS_LIZARD("Moss Lizard", 20, 90, ItemID.RAW_MOSS_LIZARD),
 	YOUNG_IMPLING("Young Impling", 22, 20, ItemID.YOUNG_IMPLING_JAR),
 	WILD_KEBBIT("Wild Kebbit", 23, 128, ItemID.KEBBIT),
 	WILLOW_BIRD_HOUSE("Willow Bird House", 24, 560, ItemID.WILLOW_BIRD_HOUSE),
@@ -60,6 +61,7 @@ public enum HunterAction implements NamedSkillAction
 	SNOWY_KNIGHT("Snowy Knight", 35, 44, ItemID.BUTTERFLY_9972),
 	EARTH_IMPLING("Earth Impling", 36, 25, ItemID.EARTH_IMPLING_JAR),
 	PRICKLY_KEBBIT("Prickly Kebbit", 37, 204, ItemID.KEBBIT_9957),
+	EMBERTAILED_JERBOA("Embertailed Jerboa", 39, 137, ItemID.EMBERTAILED_JERBOA),
 	HORNED_GRAAHK("Horned Graahk", 41, 240, ItemID.GRAAHK_HEADDRESS),
 	ESSENCE_IMPLING("Essence Impling", 42, 27, ItemID.ESSENCE_IMPLING_JAR),
 	SPOTTED_KEBBIT("Spotted Kebbit", 43, 104, ItemID.KEBBIT_9960),
@@ -73,24 +75,30 @@ public enum HunterAction implements NamedSkillAction
 	CHINCHOMPA("Chinchompa", 53, 198.4f, ItemID.CHINCHOMPA),
 	SABRE_TOOTHED_KYATT("Sabre-toothed Kyatt", 55, 300, ItemID.KYATT_HAT),
 	DARK_KEBBIT("Dark Kebbit", 57, 132, ItemID.KEBBIT_9963),
+	PYRE_FOX("Pyre Fox", 57, 222, ItemID.PYRE_FOX),
 	NATURE_IMPLING("Nature Impling", 58, 34, ItemID.NATURE_IMPLING_JAR),
 	RED_SALAMANDER("Red Salamander", 59, 272, ItemID.RED_SALAMANDER),
 	YEW_BIRD_HOUSE("Yew Bird House", 59, 1020, ItemID.YEW_BIRD_HOUSE),
 	MANIACAL_MONKEY("Maniacal Monkey", 60, 1000, ItemID.MONKEY_19556),
 	CARNIVOROUS_CHINCHOMPA("Carnivorous Chinchompa", 63, 265, ItemID.RED_CHINCHOMPA),
 	MAGPIE_IMPLING("Magpie Impling", 65, 44, ItemID.MAGPIE_IMPLING_JAR),
+	SUNLIGHT_MOTH("Sunlight Moth", 65, 74, ItemID.SUNLIGHT_MOTH),
 	MAGPIE_IMPLING_GIELINOR("Magpie Impling (Gielinor)", 65, 216, ItemID.MAGPIE_IMPLING_JAR),
 	BLACK_SALAMANDER("Black Salamander", 67, 319.5f, ItemID.BLACK_SALAMANDER),
 	DASHING_KEBBIT("Dashing Kebbit", 69, 156, ItemID.KEBBIT_9964),
+	SUNLIGHT_ANTELOPE("Sunlight Antelope", 72, 380, ItemID.SUNLIGHT_ANTELOPE),
 	BLACK_CHINCHOMPA("Black Chinchompa", 73, 315, ItemID.BLACK_CHINCHOMPA),
-	MAGIC_BIRD_HOUSE("Magic Bird House", 74, 1140, ItemID.MAGIC_BIRD_HOUSE),
 	NINJA_IMPLING("Ninja Impling", 74, 52, ItemID.NINJA_IMPLING_JAR),
 	NINJA_IMPLING_GIELINOR("Ninja Impling (Gielinor)", 74, 240, ItemID.NINJA_IMPLING_JAR),
+	MAGIC_BIRD_HOUSE("Magic Bird House", 74, 1140, ItemID.MAGIC_BIRD_HOUSE),
+	MOONLIGHT_MOTH("Moonlight Moth", 75, 84, ItemID.MOONLIGHT_MOTH),
+	TECU_SALAMANDER("Tecu Salamander", 79, 344, ItemID.TECU_SALAMANDER),
 	CRYSTAL_IMPLING("Crystal Impling", 80, 280, ItemID.CRYSTAL_IMPLING_JAR),
 	DRAGON_IMPLING("Dragon Impling", 83, 65, ItemID.DRAGON_IMPLING_JAR),
 	DRAGON_IMPLING_GIELINOR("Dragon Impling (Gielinor)", 83, 300, ItemID.DRAGON_IMPLING_JAR),
-	REDWOOD_BIRD_HOUSE("Redwood Bird House", 89, 1200, ItemID.REDWOOD_BIRD_HOUSE),
 	LUCKY_IMPLING("Lucky Impling", 89, 380, ItemID.LUCKY_IMPLING_JAR),
+	REDWOOD_BIRD_HOUSE("Redwood Bird House", 89, 1200, ItemID.REDWOOD_BIRD_HOUSE),
+	MOONLIGHT_ANTELOPE("Moonlight Antelope", 91, 450, ItemID.MOONLIGHT_ANTELOPE),
 	;
 
 	private final String name;
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/MagicAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/MagicAction.java
index bb3547fe7..620107e80 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/MagicAction.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/MagicAction.java
@@ -38,27 +38,27 @@ public enum MagicAction implements SkillAction
 	ENCHANT_OPAL_BOLT("Enchant Opal Bolt", 4, 9, SpriteID.SPELL_ENCHANT_CROSSBOW_BOLT, true),
 	WATER_STRIKE("Water Strike", 5, 7.5f, SpriteID.SPELL_WATER_STRIKE, false),
 	ARCEUUS_LIBRARY_TELEPORT("Arceuus Library Teleport", 6, 10, SpriteID.SPELL_ARCEUUS_LIBRARY_TELEPORT, true),
-	ENCHANT_SAPPHIRE_JEWELLERY("Enchant Sapphire Jewellery", 7, 17.5f, SpriteID.SPELL_LVL_1_ENCHANT, false),
 	ENCHANT_SAPPHIRE_BOLT("Enchant Sapphire Bolt", 7, 17.5f, SpriteID.SPELL_ENCHANT_CROSSBOW_BOLT, true),
+	ENCHANT_SAPPHIRE_JEWELLERY("Enchant Sapphire Jewellery", 7, 17.5f, SpriteID.SPELL_LVL_1_ENCHANT, false),
 	EARTH_STRIKE("Earth Strike", 9, 9.5f, SpriteID.SPELL_EARTH_STRIKE, false),
 	WEAKEN("Weaken", 11, 21, SpriteID.SPELL_WEAKEN, false),
 	FIRE_STRIKE("Fire Strike", 13, 11.5f, SpriteID.SPELL_FIRE_STRIKE, false),
 	ENCHANT_JADE_BOLT("Enchant Jade Bolt", 14, 19, SpriteID.SPELL_ENCHANT_CROSSBOW_BOLT, true),
 	BONES_TO_BANANAS("Bones To Bananas", 15, 25, SpriteID.SPELL_BONES_TO_BANANAS, false),
 	BASIC_REANIMATION("Basic Reanimation", 16, 32, SpriteID.SPELL_BASIC_REANIMATION, true),
-	DRAYNOR_MANOR_TELEPORT("Draynor Manor Teleport", 17, 16, SpriteID.SPELL_DRAYNOR_MANOR_TELEPORT, true),
 	WIND_BOLT("Wind Bolt", 17, 13.5f, SpriteID.SPELL_WIND_BOLT, false),
+	DRAYNOR_MANOR_TELEPORT("Draynor Manor Teleport", 17, 16, SpriteID.SPELL_DRAYNOR_MANOR_TELEPORT, true),
 	CURSE("Curse", 19, 29, SpriteID.SPELL_CURSE, false),
 	BIND("Bind", 20, 30, SpriteID.SPELL_BIND, false),
 	LOW_LEVEL_ALCHEMY("Low Level Alchemy", 21, 31, SpriteID.SPELL_LOW_LEVEL_ALCHEMY, false),
 	WATER_BOLT("Water Bolt", 23, 16.5f, SpriteID.SPELL_WATER_BOLT, false),
 	ENCHANT_PEARL_BOLT("Enchant Pearl Bolt", 24, 29, SpriteID.SPELL_ENCHANT_CROSSBOW_BOLT, true),
 	VARROCK_TELEPORT("Varrock Teleport", 25, 35, SpriteID.SPELL_VARROCK_TELEPORT, false),
-	ENCHANT_EMERALD_JEWELLERY("Enchant Emerald Jewellery", 27, 37, SpriteID.SPELL_LVL_2_ENCHANT, false),
 	ENCHANT_EMERALD_BOLT("Enchant Emerald Bolt", 27, 37, SpriteID.SPELL_ENCHANT_CROSSBOW_BOLT, true),
+	ENCHANT_EMERALD_JEWELLERY("Enchant Emerald Jewellery", 27, 37, SpriteID.SPELL_LVL_2_ENCHANT, false),
 	MIND_ALTAR_TELEPORT("Mind Altar Teleport", 28, 22, SpriteID.SPELL_MIND_ALTAR_TELEPORT, true),
-	ENCHANT_TOPAZ_BOLT("Enchant Topaz Bolt", 29, 33, SpriteID.SPELL_ENCHANT_CROSSBOW_BOLT, true),
 	EARTH_BOLT("Earth Bolt", 29, 19.5f, SpriteID.SPELL_EARTH_BOLT, false),
+	ENCHANT_TOPAZ_BOLT("Enchant Topaz Bolt", 29, 33, SpriteID.SPELL_ENCHANT_CROSSBOW_BOLT, true),
 	LUMBRIDGE_TELEPORT("Lumbridge Teleport", 31, 41, SpriteID.SPELL_LUMBRIDGE_TELEPORT, false),
 	TELEKINETIC_GRAB("Telekinetic Grab", 33, 43, SpriteID.SPELL_TELEKINETIC_GRAB, false),
 	RESPAWN_TELEPORT("Respawn Teleport", 34, 27, SpriteID.SPELL_RESPAWN_TELEPORT, true),
@@ -69,138 +69,140 @@ public enum MagicAction implements SkillAction
 	CRUMBLE_UNDEAD("Crumble Undead", 39, 24.5f, SpriteID.SPELL_CRUMBLE_UNDEAD, false),
 	SALVE_GRAVEYARD_TELEPORT("Salve Graveyard Teleport", 40, 30, SpriteID.SPELL_SALVE_GRAVEYARD_TELEPORT, true),
 	TELEPORT_TO_HOUSE("Teleport To House", 40, 30, SpriteID.SPELL_TELEPORT_TO_HOUSE, true),
-	ADEPT_REANIMATION("Adept Reanimation", 41, 80, SpriteID.SPELL_ADEPT_REANIMATION, true),
 	WIND_BLAST("Wind Blast", 41, 25.5f, SpriteID.SPELL_WIND_BLAST, false),
+	ADEPT_REANIMATION("Adept Reanimation", 41, 80, SpriteID.SPELL_ADEPT_REANIMATION, true),
 	SUPERHEAT_ITEM("Superheat Item", 43, 53, SpriteID.SPELL_SUPERHEAT_ITEM, false),
 	INFERIOR_DEMONBANE("Inferior Demonbane", 44, 27, SpriteID.SPELL_INFERIOR_DEMONBANE, true),
 	CAMELOT_TELEPORT("Camelot Teleport", 45, 55.5f, SpriteID.SPELL_CAMELOT_TELEPORT, true),
 	WATER_BLAST("Water Blast", 47, 28.5f, SpriteID.SPELL_WATER_BLAST, false),
 	SHADOW_VEIL("Shadow Veil", 47, 58, SpriteID.SPELL_SHADOW_VEIL, true),
 	FENKENSTRAINS_CASTLE_TELEPORT("Fenkenstrain's Castle Teleport", 48, 50, SpriteID.SPELL_FENKENSTRAINS_CASTLE_TELEPORT, true),
-	ENCHANT_RUBY_JEWELLERY("Enchant Ruby Jewellery", 49, 59, SpriteID.SPELL_LVL_3_ENCHANT, false),
+	KOUREND_CASTLE_TELEPORT("Kourend Castle Teleport", 48, 58, SpriteID.SPELL_TELEPORT_TO_KOUREND, true),
 	ENCHANT_RUBY_BOLT("Enchant Ruby Bolt", 49, 59, SpriteID.SPELL_ENCHANT_CROSSBOW_BOLT, true),
+	ENCHANT_RUBY_JEWELLERY("Enchant Ruby Jewellery", 49, 59, SpriteID.SPELL_LVL_3_ENCHANT, false),
 	IBAN_BLAST("Iban Blast", 50, 30, SpriteID.SPELL_IBAN_BLAST, true),
-	SMOKE_RUSH("Smoke Rush", 50, 30, SpriteID.SPELL_SMOKE_RUSH, true),
 	MAGIC_DART("Magic Dart", 50, 30, SpriteID.SPELL_MAGIC_DART, true),
-	SNARE("Snare", 50, 60, SpriteID.SPELL_SNARE, false),
+	SMOKE_RUSH("Smoke Rush", 50, 30, SpriteID.SPELL_SMOKE_RUSH, true),
 	DARK_LURE("Dark Lure", 50, 60, SpriteID.SPELL_DARK_LURE, true),
+	SNARE("Snare", 50, 60, SpriteID.SPELL_SNARE, false),
 	ARDOUGNE_TELEPORT("Ardougne Teleport", 51, 61, SpriteID.SPELL_ARDOUGNE_TELEPORT, true),
 	SHADOW_RUSH("Shadow Rush", 52, 31, SpriteID.SPELL_SHADOW_RUSH, true),
 	EARTH_BLAST("Earth Blast", 53, 31.5f, SpriteID.SPELL_EARTH_BLAST, false),
+	CIVITAS_ILLA_FORTIS_TELEPORT("Civitas illa Fortis Teleport", 54, 64, SpriteID.SPELL_CIVITAS_ILLA_FORTIS_TELEPORT, true),
 	PADDEWWA_TELEPORT("Paddewwa Teleport", 54, 64, SpriteID.SPELL_PADDEWWA_TELEPORT, true),
 	HIGH_LEVEL_ALCHEMY("High Level Alchemy", 55, 65, SpriteID.SPELL_HIGH_LEVEL_ALCHEMY, false),
-	CHARGE_WATER_ORB("Charge Water Orb", 56, 66, SpriteID.SPELL_CHARGE_WATER_ORB, true),
 	BLOOD_RUSH("Blood Rush", 56, 33, SpriteID.SPELL_BLOOD_RUSH, true),
 	SKELETAL_GRASP("Skeletal Grasp", 56, 33, SpriteID.SPELL_SKELETAL_GRASP, true),
-	ENCHANT_DIAMOND_JEWELLERY("Enchant Diamond Jewellery", 57, 67, SpriteID.SPELL_LVL_4_ENCHANT, false),
+	CHARGE_WATER_ORB("Charge Water Orb", 56, 66, SpriteID.SPELL_CHARGE_WATER_ORB, true),
 	ENCHANT_DIAMOND_BOLT("Enchant Diamond Bolt", 57, 67, SpriteID.SPELL_ENCHANT_CROSSBOW_BOLT, true),
+	ENCHANT_DIAMOND_JEWELLERY("Enchant Diamond Jewellery", 57, 67, SpriteID.SPELL_LVL_4_ENCHANT, false),
 	RESURRECT_SUPERIOR_THRALL("Resurrect Superior Thrall", 57, 70, SpriteID.SPELL_RESURRECT_SUPERIOR_SKELETON, true),
-	WATCHTOWER_TELEPORT("Watchtower Teleport", 58, 68, SpriteID.SPELL_WATCHTOWER_TELEPORT, true),
 	ICE_RUSH("Ice Rush", 58, 34, SpriteID.SPELL_ICE_RUSH, true),
+	WATCHTOWER_TELEPORT("Watchtower Teleport", 58, 68, SpriteID.SPELL_WATCHTOWER_TELEPORT, true),
 	FIRE_BLAST("Fire Blast", 59, 34.5f, SpriteID.SPELL_FIRE_BLAST, false),
 	MARK_OF_DARKNESS("Mark of Darkness", 59, 70, SpriteID.SPELL_MARK_OF_DARKNESS, true),
-	SENNTISTEN_TELEPORT("Senntisten Teleport", 60, 70, SpriteID.SPELL_SENNTISTEN_TELEPORT, true),
 	CLAWS_OF_GUTHIX("Claws Of Guthix", 60, 35, SpriteID.SPELL_CLAWS_OF_GUTHIX, true),
 	FLAMES_OF_ZAMORAK("Flames Of Zamorak", 60, 35, SpriteID.SPELL_FLAMES_OF_ZAMORAK, true),
 	SARADOMIN_STRIKE("Saradomin Strike", 60, 35, SpriteID.SPELL_SARADOMIN_STRIKE, true),
-	CHARGE_EARTH_ORB("Charge Earth Orb", 60, 70, SpriteID.SPELL_CHARGE_EARTH_ORB, true),
 	BONES_TO_PEACHES("Bones To Peaches", 60, 35.5f, SpriteID.SPELL_BONES_TO_PEACHES, true),
-	WEST_ARDOUGNE_TELEPORT("West Ardougne Teleport", 61, 68, SpriteID.SPELL_WEST_ARDOUGNE_TELEPORT, true),
+	CHARGE_EARTH_ORB("Charge Earth Orb", 60, 70, SpriteID.SPELL_CHARGE_EARTH_ORB, true),
+	SENNTISTEN_TELEPORT("Senntisten Teleport", 60, 70, SpriteID.SPELL_SENNTISTEN_TELEPORT, true),
 	TROLLHEIM_TELEPORT("Trollheim Teleport", 61, 68, SpriteID.SPELL_TROLLHEIM_TELEPORT, true),
+	WEST_ARDOUGNE_TELEPORT("West Ardougne Teleport", 61, 68, SpriteID.SPELL_WEST_ARDOUGNE_TELEPORT, true),
 	SMOKE_BURST("Smoke Burst", 62, 36, SpriteID.SPELL_SMOKE_BURST, true),
-	WIND_WAVE("Wind Wave", 62, 36, SpriteID.SPELL_WIND_WAVE, true),
 	SUPERIOR_DEMONBANE("Superior Demonbane", 62, 36, SpriteID.SPELL_SUPERIOR_DEMONBANE, true),
+	WIND_WAVE("Wind Wave", 62, 36, SpriteID.SPELL_WIND_WAVE, true),
 	CHARGE_FIRE_ORB("Charge Fire Orb", 63, 73, SpriteID.SPELL_CHARGE_FIRE_ORB, true),
 	SHADOW_BURST("Shadow Burst", 64, 37, SpriteID.SPELL_SHADOW_BURST, true),
 	TELEPORT_APE_ATOLL("Teleport Ape Atoll", 64, 74, SpriteID.SPELL_TELEPORT_TO_APE_ATOLL, true),
 	LESSER_CORRUPTION("Lesser Corruption", 64, 75, SpriteID.SPELL_LESSER_CORRUPTION, true),
+	WATER_WAVE("Water Wave", 65, 37.5f, SpriteID.SPELL_WATER_WAVE, true),
 	BAKE_PIE("Bake Pie", 65, 60, SpriteID.SPELL_BAKE_PIE, true),
-	HARMONY_ISLAND_TELEPORT("Harmony Island Teleport", 65, 74, SpriteID.SPELL_HARMONY_ISLAND_TELEPORT, true),
 	GEOMANCY("Geomancy", 65, 60, SpriteID.SPELL_GEOMANCY, true),
-	WATER_WAVE("Water Wave", 65, 37.5f, SpriteID.SPELL_WATER_WAVE, true),
-	CHARGE_AIR_ORB("Charge Air Orb", 66, 76, SpriteID.SPELL_CHARGE_AIR_ORB, true),
+	HARMONY_ISLAND_TELEPORT("Harmony Island Teleport", 65, 74, SpriteID.SPELL_HARMONY_ISLAND_TELEPORT, true),
 	CURE_PLANT("Cure Plant", 66, 60, SpriteID.SPELL_CURE_PLANT, true),
-	KHARYRLL_TELEPORT("Kharyrll Teleport", 66, 76, SpriteID.SPELL_KHARYRLL_TELEPORT, true),
-	VULNERABILITY("Vulnerability", 66, 76, SpriteID.SPELL_VULNERABILITY, true),
 	MONSTER_EXAMINE("Monster Examine", 66, 61, SpriteID.SPELL_MONSTER_EXAMINE, true),
+	CHARGE_AIR_ORB("Charge Air Orb", 66, 76, SpriteID.SPELL_CHARGE_AIR_ORB, true),
+	KHARYRLL_TELEPORT("Kharyrll Teleport", 66, 76, SpriteID.SPELL_KHARYRLL_TELEPORT, true),
 	VILE_VIGOUR("Vile Vigour", 66, 76, SpriteID.SPELL_VILE_VIGOUR, true),
+	VULNERABILITY("Vulnerability", 66, 76, SpriteID.SPELL_VULNERABILITY, true),
 	NPC_CONTACT("Npc Contact", 67, 63, SpriteID.SPELL_NPC_CONTACT, true),
 	BLOOD_BURST("Blood Burst", 68, 39, SpriteID.SPELL_BLOOD_BURST, true),
 	CURE_OTHER("Cure Other", 68, 65, SpriteID.SPELL_CURE_OTHER, true),
-	ENCHANT_DRAGONSTONE_JEWELLERY("Enchant Dragonstone Jewellery", 68, 78, SpriteID.SPELL_LVL_5_ENCHANT, true),
-	ENCHANT_DRAGONSTONE_BOLT("Enchant Dragonstone Bolt", 68, 78, SpriteID.SPELL_ENCHANT_CROSSBOW_BOLT, true),
 	HUMIDIFY("Humidify", 68, 65, SpriteID.SPELL_HUMIDIFY, true),
+	ENCHANT_DRAGONSTONE_BOLT("Enchant Dragonstone Bolt", 68, 78, SpriteID.SPELL_ENCHANT_CROSSBOW_BOLT, true),
+	ENCHANT_DRAGONSTONE_JEWELLERY("Enchant Dragonstone Jewellery", 68, 78, SpriteID.SPELL_LVL_5_ENCHANT, true),
 	MOONCLAN_TELEPORT("Moonclan Teleport", 69, 66, SpriteID.SPELL_MOONCLAN_TELEPORT, true),
 	EARTH_WAVE("Earth Wave", 70, 40, SpriteID.SPELL_EARTH_WAVE, true),
 	ICE_BURST("Ice Burst", 70, 40, SpriteID.SPELL_ICE_BURST, true),
 	TELE_GROUP_MOONCLAN("Tele Group Moonclan", 70, 67, SpriteID.SPELL_TELE_GROUP_MOONCLAN, true),
 	DEGRIME("Degrime", 70, 83, SpriteID.SPELL_DEGRIME, true),
-	OURANIA_TELEPORT("Ourania Teleport", 71, 69, SpriteID.SPELL_OURANIA_TELEPORT, true),
-	CEMETERY_TELEPORT("Cemetery Teleport", 71, 82, SpriteID.SPELL_CEMETERY_TELEPORT, true),
 	CURE_ME("Cure Me", 71, 69, SpriteID.SPELL_CURE_ME, true),
+	OURANIA_TELEPORT("Ourania Teleport", 71, 69, SpriteID.SPELL_OURANIA_TELEPORT, true),
 	HUNTER_KIT("Hunter Kit", 71, 70, SpriteID.SPELL_HUNTER_KIT, true),
-	EXPERT_REANIMATION("Expert Reanimation", 72, 138, SpriteID.SPELL_EXPERT_REANIMATION, true),
-	LASSAR_TELEPORT("Lassar Teleport", 72, 82, SpriteID.SPELL_LASSAR_TELEPORT, true),
+	CEMETERY_TELEPORT("Cemetery Teleport", 71, 82, SpriteID.SPELL_CEMETERY_TELEPORT, true),
 	WATERBIRTH_TELEPORT("Waterbirth Teleport", 72, 71, SpriteID.SPELL_WATERBIRTH_TELEPORT, true),
+	LASSAR_TELEPORT("Lassar Teleport", 72, 82, SpriteID.SPELL_LASSAR_TELEPORT, true),
+	EXPERT_REANIMATION("Expert Reanimation", 72, 138, SpriteID.SPELL_EXPERT_REANIMATION, true),
 	TELE_GROUP_WATERBIRTH("Tele Group Waterbirth", 73, 72, SpriteID.SPELL_TELE_GROUP_WATERBIRTH, true),
 	ENFEEBLE("Enfeeble", 73, 83, SpriteID.SPELL_ENFEEBLE, true),
 	WARD_OF_ARCEUUS("Ward of Arceuus", 73, 83, SpriteID.SPELL_WARD_OF_ARCEUUS, true),
-	TELEOTHER_LUMBRIDGE("Teleother Lumbridge", 74, 84, SpriteID.SPELL_TELEOTHER_LUMBRIDGE, true),
 	SMOKE_BLITZ("Smoke Blitz", 74, 42, SpriteID.SPELL_SMOKE_BLITZ, true),
 	CURE_GROUP("Cure Group", 74, 74, SpriteID.SPELL_CURE_GROUP, true),
-	STAT_SPY("Stat Spy", 75, 76, SpriteID.SPELL_STAT_SPY, true),
-	BARBARIAN_TELEPORT("Barbarian Teleport", 75, 76, SpriteID.SPELL_BARBARIAN_TELEPORT, true),
+	TELEOTHER_LUMBRIDGE("Teleother Lumbridge", 74, 84, SpriteID.SPELL_TELEOTHER_LUMBRIDGE, true),
 	FIRE_WAVE("Fire Wave", 75, 42.5f, SpriteID.SPELL_FIRE_WAVE, true),
-	TELE_GROUP_BARBARIAN("Tele Group Barbarian", 76, 77, SpriteID.SPELL_TELE_GROUP_ICE_PLATEAU, true),
+	BARBARIAN_TELEPORT("Barbarian Teleport", 75, 76, SpriteID.SPELL_BARBARIAN_TELEPORT, true),
+	STAT_SPY("Stat Spy", 75, 76, SpriteID.SPELL_STAT_SPY, true),
 	SHADOW_BLITZ("Shadow Blitz", 76, 43, SpriteID.SPELL_SHADOW_BLITZ, true),
 	SPIN_FLAX("Spin Flax", 76, 75, SpriteID.SPELL_SPIN_FLAX, true),
+	TELE_GROUP_BARBARIAN("Tele Group Barbarian", 76, 77, SpriteID.SPELL_TELE_GROUP_ICE_PLATEAU, true),
 	RESURRECT_GREATER_THRALL("Resurrect Greater Thrall", 76, 88, SpriteID.SPELL_RESURRECT_GREATER_ZOMBIE, true),
 	SUPERGLASS_MAKE("Superglass Make", 77, 78, SpriteID.SPELL_SUPERGLASS_MAKE, true),
-	TAN_LEATHER("Tan Leather", 78, 81, SpriteID.SPELL_TAN_LEATHER, true),
 	KHAZARD_TELEPORT("Khazard Teleport", 78, 80, SpriteID.SPELL_KHAZARD_TELEPORT, true),
+	TAN_LEATHER("Tan Leather", 78, 81, SpriteID.SPELL_TAN_LEATHER, true),
 	DAREEYAK_TELEPORT("Dareeyak Teleport", 78, 88, SpriteID.SPELL_DAREEYAK_TELEPORT, true),
 	RESURRECT_CROPS("Resurrect Crops", 78, 90, SpriteID.SPELL_RESURRECT_CROPS, true),
-	ENTANGLE("Entangle", 79, 89, SpriteID.SPELL_ENTANGLE, true),
+	UNDEAD_GRASP("Undead Grasp", 79, 46.5f, SpriteID.SPELL_UNDEAD_GRASP, true),
 	TELE_GROUP_KHAZARD("Tele Group Khazard", 79, 81, SpriteID.SPELL_TELE_GROUP_KHAZARD, true),
 	DREAM("Dream", 79, 82, SpriteID.SPELL_DREAM, true),
-	UNDEAD_GRASP("Undead Grasp", 79, 46.5f, SpriteID.SPELL_UNDEAD_GRASP, true),
-	CHARGE("Charge", 80, 180, SpriteID.SPELL_CHARGE, true),
+	ENTANGLE("Entangle", 79, 89, SpriteID.SPELL_ENTANGLE, true),
 	BLOOD_BLITZ("Blood Blitz", 80, 45, SpriteID.SPELL_BLOOD_BLITZ, true),
-	STUN("Stun", 80, 90, SpriteID.SPELL_STUN, true),
 	STRING_JEWELLERY("String Jewellery", 80, 83, SpriteID.SPELL_STRING_JEWELLERY, true),
 	DEATH_CHARGE("Death Charge", 80, 90, SpriteID.SPELL_DEATH_CHARGE, true),
-	STAT_RESTORE_POT_SHARE("Stat Restore Pot Share", 81, 84, SpriteID.SPELL_STAT_RESTORE_POT_SHARE, true),
+	STUN("Stun", 80, 90, SpriteID.SPELL_STUN, true),
+	CHARGE("Charge", 80, 180, SpriteID.SPELL_CHARGE, true),
 	WIND_SURGE("Wind Surge", 81, 44, SpriteID.SPELL_WIND_SURGE, true),
-	TELEOTHER_FALADOR("Teleother Falador", 82, 92, SpriteID.SPELL_TELEOTHER_FALADOR, true),
-	MAGIC_IMBUE("Magic Imbue", 82, 86, SpriteID.SPELL_MAGIC_IMBUE, true),
-	ICE_BLITZ("Ice Blitz", 82, 46, SpriteID.SPELL_ICE_BLITZ, true),
+	STAT_RESTORE_POT_SHARE("Stat Restore Pot Share", 81, 84, SpriteID.SPELL_STAT_RESTORE_POT_SHARE, true),
 	DARK_DEMONBANE("Dark Demonbane", 82, 43.5f, SpriteID.SPELL_DARK_DEMONBANE, true),
+	ICE_BLITZ("Ice Blitz", 82, 46, SpriteID.SPELL_ICE_BLITZ, true),
+	MAGIC_IMBUE("Magic Imbue", 82, 86, SpriteID.SPELL_MAGIC_IMBUE, true),
+	TELEOTHER_FALADOR("Teleother Falador", 82, 92, SpriteID.SPELL_TELEOTHER_FALADOR, true),
 	FERTILE_SOIL("Fertile Soil", 83, 87, SpriteID.SPELL_FERTILE_SOIL, true),
 	BARROWS_TELEPORT("Barrows Teleport", 83, 90, SpriteID.SPELL_BARROWS_TELEPORT, true),
 	CARRALLANGER_TELEPORT("Carrallanger Teleport", 84, 82, SpriteID.SPELL_CARRALLANGAR_TELEPORT, true),
 	BOOST_POTION_SHARE("Boost Potion Share", 84, 88, SpriteID.SPELL_BOOST_POTION_SHARE, true),
 	DEMONIC_OFFERING("Demonic Offering", 84, 175, SpriteID.SPELL_DEMONIC_OFFERING, true),
+	TELEPORT_TO_TARGET("Teleport To Target", 85, 45, SpriteID.SPELL_TELEPORT_TO_BOUNTY_TARGET, true),
 	WATER_SURGE("Water Surge", 85, 46, SpriteID.SPELL_WATER_SURGE, true),
-	FISHING_GUILD_TELEPORT("Fishing Guild Teleport", 85, 89, SpriteID.SPELL_FISHING_GUILD_TELEPORT, true),
 	TELE_BLOCK("Tele Block", 85, 80, SpriteID.SPELL_TELE_BLOCK, false),
-	TELEPORT_TO_TARGET("Teleport To Target", 85, 45, SpriteID.SPELL_TELEPORT_TO_BOUNTY_TARGET, true),
+	FISHING_GUILD_TELEPORT("Fishing Guild Teleport", 85, 89, SpriteID.SPELL_FISHING_GUILD_TELEPORT, true),
 	GREATER_CORRUPTION("Greater Corruption", 85, 95, SpriteID.SPELL_GREATER_CORRUPTION, true),
 	SMOKE_BARRAGE("Smoke Barrage", 86, 48, SpriteID.SPELL_SMOKE_BARRAGE, true),
-	TELE_GROUP_FISHING_GUILD("Tele Group Fishing Guild", 86, 90, SpriteID.SPELL_TELE_GROUP_FISHING_GUILD, true),
 	PLANK_MAKE("Plank Make", 86, 90, SpriteID.SPELL_PLANK_MAKE, true),
+	TELE_GROUP_FISHING_GUILD("Tele Group Fishing Guild", 86, 90, SpriteID.SPELL_TELE_GROUP_FISHING_GUILD, true),
 	CATHERBY_TELEPORT("Catherby Teleport", 87, 92, SpriteID.SPELL_CATHERBY_TELEPORT, true),
-	ENCHANT_ONYX_JEWELLERY("Enchant Onyx Jewellery", 87, 97, SpriteID.SPELL_LVL_6_ENCHANT, true),
 	ENCHANT_ONYX_BOLT("Enchant Onyx Bolt", 87, 97, SpriteID.SPELL_ENCHANT_CROSSBOW_BOLT, true),
+	ENCHANT_ONYX_JEWELLERY("Enchant Onyx Jewellery", 87, 97, SpriteID.SPELL_LVL_6_ENCHANT, true),
 	SHADOW_BARRAGE("Shadow Barrage", 88, 48, SpriteID.SPELL_SHADOW_BARRAGE, true),
 	TELE_GROUP_CATHERBY("Tele Group Catherby", 88, 93, SpriteID.SPELL_TELE_GROUP_CATHERBY, true),
 	ICE_PLATEAU_TELEPORT("Ice Plateau Teleport", 89, 96, SpriteID.SPELL_ICE_PLATEAU_TELEPORT, true),
 	RECHARGE_DRAGONSTONE("Recharge Dragonstone", 89, 97.5f, SpriteID.SPELL_RECHARGE_DRAGONSTONE, true),
-	ANNAKARL_TELEPORT("Annakarl Teleport", 90, 100, SpriteID.SPELL_ANNAKARL_TELEPORT, true),
 	EARTH_SURGE("Earth Surge", 90, 48, SpriteID.SPELL_EARTH_SURGE, true),
-	MASTER_REANIMATION("Master Reanimation", 90, 170, SpriteID.SPELL_MASTER_REANIMATION, true),
 	TELE_GROUP_ICE_PLATEAU("Tele Group Ice Plateau", 90, 99, SpriteID.SPELL_TELE_GROUP_ICE_PLATEAU, true),
-	TELEOTHER_CAMELOT("Teleother Camelot", 90, 100, SpriteID.SPELL_TELEOTHER_CAMELOT, true),
+	ANNAKARL_TELEPORT("Annakarl Teleport", 90, 100, SpriteID.SPELL_ANNAKARL_TELEPORT, true),
 	APE_ATOLL_TELEPORT("Ape Atoll Teleport", 90, 100, SpriteID.SPELL_APE_ATOLL_TELEPORT, true),
+	TELEOTHER_CAMELOT("Teleother Camelot", 90, 100, SpriteID.SPELL_TELEOTHER_CAMELOT, true),
+	MASTER_REANIMATION("Master Reanimation", 90, 170, SpriteID.SPELL_MASTER_REANIMATION, true),
 	ENERGY_TRANSFER("Energy Transfer", 91, 100, SpriteID.SPELL_ENERGY_TRANSFER, true),
 	BLOOD_BARRAGE("Blood Barrage", 92, 51, SpriteID.SPELL_BLOOD_BARRAGE, true),
 	HEAL_OTHER("Heal Other", 92, 101, SpriteID.SPELL_HEAL_OTHER, true),
@@ -209,8 +211,8 @@ public enum MagicAction implements SkillAction
 	ENCHANT_ZENYTE_JEWELLERY("Enchant Zenyte Jewellery", 93, 110, SpriteID.SPELL_LVL_7_ENCHANT, true),
 	ICE_BARRAGE("Ice Barrage", 94, 52, SpriteID.SPELL_ICE_BARRAGE, true),
 	VENGEANCE("Vengeance", 94, 112, SpriteID.SPELL_VENGEANCE, true),
-	HEAL_GROUP("Heal Group", 95, 124, SpriteID.SPELL_HEAL_GROUP, true),
 	FIRE_SURGE("Fire Surge", 95, 51, SpriteID.SPELL_FIRE_SURGE, true),
+	HEAL_GROUP("Heal Group", 95, 124, SpriteID.SPELL_HEAL_GROUP, true),
 	GHORROCK_TELEPORT("Ghorrock Teleport", 96, 106, SpriteID.SPELL_GHORROCK_TELEPORT, true),
 	SPELLBOOK_SWAP("Spellbook Swap", 96, 130, SpriteID.SPELL_SPELLBOOK_SWAP, true),
 	;
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/MiningAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/MiningAction.java
index bd6a71f68..18d49f8c3 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/MiningAction.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/MiningAction.java
@@ -64,13 +64,21 @@ public enum MiningAction implements ItemSkillAction
 	SANDSTONE_5KG(ItemID.SANDSTONE_5KG, 35, 50),
 	SANDSTONE_10KG(ItemID.SANDSTONE_10KG, 35, 60),
 	DENSE_ESSENCE_BLOCK(ItemID.DENSE_ESSENCE_BLOCK, 38, 12),
-	GOLD_ORE(ItemID.GOLD_ORE, 40, 65),
 	GEM_ROCKS(ItemID.UNCUT_RED_TOPAZ, 40, 65)
+		{
+			@Override
+			public String getName(final ItemManager itemManager)
+			{
+				return "Gem rocks";
+			}
+		},
+	GOLD_ORE(ItemID.GOLD_ORE, 40, 65),
+	CALCIFIED_ROCKS(ItemID.BLESSED_BONE_SHARDS, 41, 33)
 	{
 		@Override
 		public String getName(final ItemManager itemManager)
 		{
-			return "Gem rocks";
+			return "Calcified Rocks";
 		}
 	},
 	GRANITE_500G(ItemID.GRANITE_500G, 45, 50),
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/MiningBonus.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/MiningBonus.java
index 910237ddc..11d2ce785 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/MiningBonus.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/MiningBonus.java
@@ -31,7 +31,7 @@ import lombok.Getter;
 @Getter(onMethod_ = @Override)
 public enum MiningBonus implements SkillBonus
 {
-	PROSPECTOR_KIT("Prospector Kit (+2.5%)", 1.025f),
+	PROSPECTOR_KIT("Prospector Kit", 1.025f),
 	;
 
 	private final String name;
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/PrayerAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/PrayerAction.java
index 30352c2e1..9d43a1547 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/PrayerAction.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/PrayerAction.java
@@ -29,6 +29,7 @@ import java.util.Set;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
 import net.runelite.api.ItemID;
+import static net.runelite.client.plugins.skillcalculator.skills.PrayerBonus.BLESSED_SUNFIRE_WINE;
 import static net.runelite.client.plugins.skillcalculator.skills.PrayerBonus.DEMONIC_OFFERING;
 import static net.runelite.client.plugins.skillcalculator.skills.PrayerBonus.MORYTANIA_DIARY_3_SHADES;
 import static net.runelite.client.plugins.skillcalculator.skills.PrayerBonus.ZEALOT_ROBES;
@@ -37,7 +38,43 @@ import static net.runelite.client.plugins.skillcalculator.skills.PrayerBonus.ZEA
 @Getter
 public enum PrayerAction implements ItemSkillAction
 {
+	GUPPY(ItemID.GUPPY, 1, 4, PrayerMethod.PREPARED_FISH),
+	BONES(ItemID.BONES, 1, 4.5f, PrayerMethod.BONES),
+	BURNT_BONES(ItemID.BURNT_BONES, 1, 4.5f, PrayerMethod.BONES),
+	WOLF_BONES(ItemID.WOLF_BONES, 1, 4.5f, PrayerMethod.BONES),
+	MONKEY_BONES(ItemID.MONKEY_BONES, 1, 5, PrayerMethod.BONES),
+	BAT_BONES(ItemID.BAT_BONES, 1, 5.3f, PrayerMethod.BONES),
+	CAVEFISH(ItemID.CAVEFISH, 1, 7, PrayerMethod.PREPARED_FISH),
+	FIENDISH_ASHES(ItemID.FIENDISH_ASHES, 1, 10, PrayerMethod.DEMONIC_ASHES),
+	TETRA(ItemID.TETRA, 1, 10, PrayerMethod.PREPARED_FISH),
+	BIG_BONES(ItemID.BIG_BONES, 1, 15, PrayerMethod.BONES),
+	JOGRE_BONES(ItemID.JOGRE_BONES, 1, 15, PrayerMethod.BONES),
+	CATFISH(ItemID.CATFISH, 1, 16, PrayerMethod.PREPARED_FISH),
+	WYRMLING_BONES(ItemID.WYRMLING_BONES, 1, 21, PrayerMethod.BONES),
+	ZOGRE_BONES(ItemID.ZOGRE_BONES, 1, 22.5f, PrayerMethod.BONES),
+	SHAIKAHAN_BONES(ItemID.SHAIKAHAN_BONES, 1, 25, PrayerMethod.BONES),
+	VILE_ASHES(ItemID.VILE_ASHES, 1, 25, PrayerMethod.DEMONIC_ASHES),
+	BABYDRAGON_BONES(ItemID.BABYDRAGON_BONES, 1, 30, PrayerMethod.BONES),
+	LOAR_REMAINS(ItemID.LOAR_REMAINS, 1, 33, PrayerMethod.SHADE_REMAINS),
+	PHRIN_REMAINS(ItemID.PHRIN_REMAINS, 1, 46.5f, PrayerMethod.SHADE_REMAINS),
+	WYRM_BONES(ItemID.WYRM_BONES, 1, 50, PrayerMethod.BONES),
+	RIYL_REMAINS(ItemID.RIYL_REMAINS, 1, 59.5f, PrayerMethod.SHADE_REMAINS),
+	MALICIOUS_ASHES(ItemID.MALICIOUS_ASHES, 1, 65, PrayerMethod.DEMONIC_ASHES),
+	DRAGON_BONES(ItemID.DRAGON_BONES, 1, 72, PrayerMethod.BONES),
+	WYVERN_BONES(ItemID.WYVERN_BONES, 1, 72, PrayerMethod.BONES),
+	DRAKE_BONES(ItemID.DRAKE_BONES, 1, 80, PrayerMethod.BONES),
+	ASYN_REMAINS(ItemID.ASYN_REMAINS, 1, 82.5f, PrayerMethod.SHADE_REMAINS),
+	FAYRG_BONES(ItemID.FAYRG_BONES, 1, 84, PrayerMethod.BONES),
+	FIYR_REMAINS(ItemID.FIYR_REMAINS, 1, 84, PrayerMethod.SHADE_REMAINS),
+	ABYSSAL_ASHES(ItemID.ABYSSAL_ASHES, 1, 85, PrayerMethod.DEMONIC_ASHES),
+	LAVA_DRAGON_BONES(ItemID.LAVA_DRAGON_BONES, 1, 85, PrayerMethod.BONES),
+	RAURG_BONES(ItemID.RAURG_BONES, 1, 96, PrayerMethod.BONES),
+	HYDRA_BONES(ItemID.HYDRA_BONES, 1, 110, PrayerMethod.BONES),
+	INFERNAL_ASHES(ItemID.INFERNAL_ASHES, 1, 110, PrayerMethod.DEMONIC_ASHES),
+	URIUM_REMAINS(ItemID.URIUM_REMAINS, 1, 120, PrayerMethod.SHADE_REMAINS),
+	DAGANNOTH_BONES(ItemID.DAGANNOTH_BONES, 1, 125, PrayerMethod.BONES),
 	ENSOULED_GOBLIN_HEAD(ItemID.ENSOULED_GOBLIN_HEAD, 1, 130, PrayerMethod.ENSOULED_HEAD),
+	OURG_BONES(ItemID.OURG_BONES, 1, 140, PrayerMethod.BONES),
 	ENSOULED_MONKEY_HEAD(ItemID.ENSOULED_MONKEY_HEAD, 1, 182, PrayerMethod.ENSOULED_HEAD),
 	ENSOULED_IMP_HEAD(ItemID.ENSOULED_IMP_HEAD, 1, 286, PrayerMethod.ENSOULED_HEAD),
 	ENSOULED_MINOTAUR_HEAD(ItemID.ENSOULED_MINOTAUR_HEAD, 1, 364, PrayerMethod.ENSOULED_HEAD),
@@ -60,41 +97,7 @@ public enum PrayerAction implements ItemSkillAction
 	ENSOULED_AVIANSIE_HEAD(ItemID.ENSOULED_AVIANSIE_HEAD, 1, 1234, PrayerMethod.ENSOULED_HEAD),
 	ENSOULED_ABYSSAL_HEAD(ItemID.ENSOULED_ABYSSAL_HEAD, 1, 1300, PrayerMethod.ENSOULED_HEAD),
 	ENSOULED_DRAGON_HEAD(ItemID.ENSOULED_DRAGON_HEAD, 1, 1560, PrayerMethod.ENSOULED_HEAD),
-	FIENDISH_ASHES(ItemID.FIENDISH_ASHES, 1, 10, PrayerMethod.DEMONIC_ASHES),
-	VILE_ASHES(ItemID.VILE_ASHES, 1, 25, PrayerMethod.DEMONIC_ASHES),
-	MALICIOUS_ASHES(ItemID.MALICIOUS_ASHES, 1, 65, PrayerMethod.DEMONIC_ASHES),
-	ABYSSAL_ASHES(ItemID.ABYSSAL_ASHES, 1, 85, PrayerMethod.DEMONIC_ASHES),
-	INFERNAL_ASHES(ItemID.INFERNAL_ASHES, 1, 110, PrayerMethod.DEMONIC_ASHES),
-	BONES(ItemID.BONES, 1, 4.5f, PrayerMethod.BONES),
-	WOLF_BONES(ItemID.WOLF_BONES, 1, 4.5f, PrayerMethod.BONES),
-	LOAR_REMAINS(ItemID.LOAR_REMAINS, 1, 33, PrayerMethod.SHADE_REMAINS),
-	BURNT_BONES(ItemID.BURNT_BONES, 1, 4.5f, PrayerMethod.BONES),
-	MONKEY_BONES(ItemID.MONKEY_BONES, 1, 5, PrayerMethod.BONES),
-	BAT_BONES(ItemID.BAT_BONES, 1, 5.3f, PrayerMethod.BONES),
-	JOGRE_BONES(ItemID.JOGRE_BONES, 1, 15, PrayerMethod.BONES),
-	BIG_BONES(ItemID.BIG_BONES, 1, 15, PrayerMethod.BONES),
-	ZOGRE_BONES(ItemID.ZOGRE_BONES, 1, 22.5f, PrayerMethod.BONES),
-	SHAIKAHAN_BONES(ItemID.SHAIKAHAN_BONES, 1, 25, PrayerMethod.BONES),
-	BABYDRAGON_BONES(ItemID.BABYDRAGON_BONES, 1, 30, PrayerMethod.BONES),
-	PHRIN_REMAINS(ItemID.PHRIN_REMAINS, 1, 46.5f, PrayerMethod.SHADE_REMAINS),
-	WYRM_BONES(ItemID.WYRM_BONES, 1, 50, PrayerMethod.BONES),
-	RIYL_REMAINS(ItemID.RIYL_REMAINS, 1, 59.5f, PrayerMethod.SHADE_REMAINS),
-	WYVERN_BONES(ItemID.WYVERN_BONES, 1, 72, PrayerMethod.BONES),
-	DRAGON_BONES(ItemID.DRAGON_BONES, 1, 72, PrayerMethod.BONES),
-	DRAKE_BONES(ItemID.DRAKE_BONES, 1, 80, PrayerMethod.BONES),
-	ASYN_REMAINS(ItemID.ASYN_REMAINS, 1, 82.5f, PrayerMethod.SHADE_REMAINS),
-	FAYRG_BONES(ItemID.FAYRG_BONES, 1, 84, PrayerMethod.BONES),
-	FIYR_REMAINS(ItemID.FIYR_REMAINS, 1, 84, PrayerMethod.SHADE_REMAINS),
-	LAVA_DRAGON_BONES(ItemID.LAVA_DRAGON_BONES, 1, 85, PrayerMethod.BONES),
-	RAURG_BONES(ItemID.RAURG_BONES, 1, 96, PrayerMethod.BONES),
-	HYDRA_BONES(ItemID.HYDRA_BONES, 1, 110, PrayerMethod.BONES),
-	DAGANNOTH_BONES(ItemID.DAGANNOTH_BONES, 1, 125, PrayerMethod.BONES),
-	OURG_BONES(ItemID.OURG_BONES, 1, 140, PrayerMethod.BONES),
-	URIUM_REMAINS(ItemID.URIUM_REMAINS, 1, 120, PrayerMethod.SHADE_REMAINS),
-	GUPPY(ItemID.GUPPY, 1, 4, PrayerMethod.PREPARED_FISH),
-	CAVEFISH(ItemID.CAVEFISH, 1, 7, PrayerMethod.PREPARED_FISH),
-	TETRA(ItemID.TETRA, 1, 10, PrayerMethod.PREPARED_FISH),
-	CATFISH(ItemID.CATFISH, 1, 16, PrayerMethod.PREPARED_FISH),
+	BLESSED_BONE_SHARDS(ItemID.BLESSED_BONE_SHARDS, 30, 5, PrayerMethod.BLESSED_SUNFIRE_WINE),
 	SUPERIOR_DRAGON_BONES(ItemID.SUPERIOR_DRAGON_BONES, 70, 150, PrayerMethod.BONES),
 	;
 
@@ -105,14 +108,17 @@ public enum PrayerAction implements ItemSkillAction
 		ENSOULED_HEAD,
 		PREPARED_FISH,
 		SHADE_REMAINS,
+		BLESSED_SUNFIRE_WINE,
 	}
 
 	private static final Set<PrayerBonus> EXCLUDED_BONUSES_FOR_BONES = EnumSet.of(
 		MORYTANIA_DIARY_3_SHADES,
-		DEMONIC_OFFERING
+		DEMONIC_OFFERING,
+		BLESSED_SUNFIRE_WINE
 	);
 	private static final Set<PrayerBonus> EXCLUDED_BONUSES_FOR_ASHES = EnumSet.complementOf(EnumSet.of(DEMONIC_OFFERING));
 	private static final Set<PrayerBonus> EXCLUDED_BONUSES_FOR_REMAINS = EnumSet.complementOf(EnumSet.of(MORYTANIA_DIARY_3_SHADES));
+	private static final Set<PrayerBonus> EXCLUDED_BONUSES_FOR_BLESSED_SUNFIRE_WINE = EnumSet.complementOf(EnumSet.of(ZEALOT_ROBES, BLESSED_SUNFIRE_WINE));
 	private static final Set<PrayerBonus> EXCLUDE_ALL_EXCEPT_ZEALOT_ROBES = EnumSet.complementOf(EnumSet.of(ZEALOT_ROBES));
 
 	private final int itemId;
@@ -134,6 +140,8 @@ public enum PrayerAction implements ItemSkillAction
 				return EXCLUDE_ALL_EXCEPT_ZEALOT_ROBES;
 			case SHADE_REMAINS:
 				return EXCLUDED_BONUSES_FOR_REMAINS;
+			case BLESSED_SUNFIRE_WINE:
+				return EXCLUDED_BONUSES_FOR_BLESSED_SUNFIRE_WINE;
 			default:
 				return EnumSet.allOf(PrayerBonus.class);
 		}
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/PrayerBonus.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/PrayerBonus.java
index 046f4098f..d512790c7 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/PrayerBonus.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/PrayerBonus.java
@@ -33,15 +33,16 @@ import lombok.Getter;
 @Getter(onMethod_ = @Override)
 public enum PrayerBonus implements SkillBonus
 {
-	LIT_GILDED_ALTAR("Lit Gilded Altar (350%)", 3.5f),
-	ECTOFUNTUS("Ectofuntus (400%)", 4),
-	CHAOS_ALTAR("Chaos Altar (700%)", 7),
-	MORYTANIA_DIARY_3_SHADES("Morytania Diary 3 Shades (150%)", 1.5f),
-	BONECRUSHER("Bonecrusher (50%)", 0.5f),
-	SINISTER_OFFERING("Sinister Offering (300%)", 3),
-	DEMONIC_OFFERING("Demonic Offering (300%)", 3),
-	SACRED_BONE_BURNER("Sacred Bone Burner (300%)", 3),
-	ZEALOT_ROBES("Zealot Robes (105%)", 1.05f),
+	BONECRUSHER("Bonecrusher", 0.5f),
+	SACRED_BONE_BURNER("Sacred Bone Burner", 3),
+	SINISTER_OFFERING("Sinister Offering", 3),
+	LIT_GILDED_ALTAR("Lit Gilded Altar", 3.5f),
+	ECTOFUNTUS("Ectofuntus", 4),
+	CHAOS_ALTAR("Chaos Altar", 7),
+	BLESSED_SUNFIRE_WINE("Blessed Sunfire Wine", 1.2f),
+	DEMONIC_OFFERING("Demonic Offering", 3),
+	MORYTANIA_DIARY_3_SHADES("Morytania Diary 3 Shades", 1.5f),
+	ZEALOT_ROBES("Zealot Robes", 1.05f),
 	;
 
 	private final String name;
@@ -50,38 +51,20 @@ public enum PrayerBonus implements SkillBonus
 	@Override
 	public Set<PrayerBonus> getCanBeStackedWith()
 	{
-		final Set<PrayerBonus> others = EnumSet.noneOf(PrayerBonus.class);
-
 		switch (this)
 		{
 			case ECTOFUNTUS:
 			case LIT_GILDED_ALTAR:
 			case CHAOS_ALTAR:
-				others.add(ZEALOT_ROBES);
-				others.add(DEMONIC_OFFERING);
-				break;
-			case SACRED_BONE_BURNER:
+			case SINISTER_OFFERING:
+				return EnumSet.complementOf(EnumSet.of(ECTOFUNTUS, LIT_GILDED_ALTAR, CHAOS_ALTAR, SINISTER_OFFERING, SACRED_BONE_BURNER, BONECRUSHER));
 			case BONECRUSHER:
-				others.add(DEMONIC_OFFERING);
-				break;
-			case MORYTANIA_DIARY_3_SHADES:
-				others.add(DEMONIC_OFFERING);
-				others.add(SINISTER_OFFERING);
-				break;
+			case SACRED_BONE_BURNER:
+				return EnumSet.complementOf(EnumSet.of(ECTOFUNTUS, LIT_GILDED_ALTAR, CHAOS_ALTAR, SINISTER_OFFERING, SACRED_BONE_BURNER, BONECRUSHER, ZEALOT_ROBES));
 			case ZEALOT_ROBES:
-				others.add(ECTOFUNTUS);
-				others.add(LIT_GILDED_ALTAR);
-				others.add(CHAOS_ALTAR);
-				others.add(DEMONIC_OFFERING);
-				break;
-			case DEMONIC_OFFERING:
-				return EnumSet.complementOf(EnumSet.of(DEMONIC_OFFERING));
-			case SINISTER_OFFERING:
-				others.add(MORYTANIA_DIARY_3_SHADES);
-				others.add(DEMONIC_OFFERING);
-				break;
+				return EnumSet.complementOf(EnumSet.of(BONECRUSHER, SACRED_BONE_BURNER, ZEALOT_ROBES));
+			default:
+				return EnumSet.complementOf(EnumSet.of(this));
 		}
-
-		return others;
 	}
 }
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/RunecraftAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/RunecraftAction.java
index 7d28c26e9..6820a7abc 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/RunecraftAction.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/RunecraftAction.java
@@ -36,6 +36,7 @@ import net.runelite.client.game.ItemManager;
 @Getter
 public enum RunecraftAction implements ItemSkillAction
 {
+	AIR_RUNE(ItemID.AIR_RUNE, 1, 5, false),
 	AIR_TIARA(ItemID.AIR_TIARA, 1, 25, true),
 	MIND_TIARA(ItemID.MIND_TIARA, 1, 27.5f, true),
 	WATER_TIARA(ItemID.WATER_TIARA, 1, 30, true),
@@ -48,7 +49,6 @@ public enum RunecraftAction implements ItemSkillAction
 	LAW_TIARA(ItemID.LAW_TIARA, 1, 47.5f, true),
 	DEATH_TIARA(ItemID.DEATH_TIARA, 1, 50, true),
 	WRATH_TIARA(ItemID.WRATH_TIARA, 1, 52.5f, true),
-	AIR_RUNE(ItemID.AIR_RUNE, 1, 5, false),
 	MIND_RUNE(ItemID.MIND_RUNE, 2, 5.5f, false),
 	MIND_CORE(ItemID.MIND_CORE, 2, 55, true),
 	WATER_RUNE(ItemID.WATER_RUNE, 5, 6, false),
@@ -63,26 +63,27 @@ public enum RunecraftAction implements ItemSkillAction
 	BODY_CORE(ItemID.BODY_CORE, 20, 75, true),
 	LAVA_RUNE(ItemID.LAVA_RUNE, 23, 10.5f, false),
 	COSMIC_RUNE(ItemID.COSMIC_RUNE, 27, 8, false, true),
+	SUNFIRE_RUNE(ItemID.SUNFIRE_RUNE, 33, 9, false),
 	CHAOS_RUNE(ItemID.CHAOS_RUNE, 35, 8.5f, false, true),
 	CHAOS_CORE(ItemID.CHAOS_CORE, 35, 85, true),
 	ASTRAL_RUNE(ItemID.ASTRAL_RUNE, 40, 8.7f, false),
 	NATURE_RUNE(ItemID.NATURE_RUNE, 44, 9, false, true),
 	LAW_RUNE(ItemID.LAW_RUNE, 54, 9.5f, false, true),
 	DEATH_RUNE(ItemID.DEATH_RUNE, 65, 10, false, true),
-	ZEAH_BLOOD_RUNE(ItemID.BLOOD_RUNE, 77, 24.425f, true)
+	TRUE_BLOOD_RUNE(ItemID.BLOOD_RUNE, 77, 10.5f, false)
 	{
 		@Override
 		public String getName(final ItemManager itemManager)
 		{
-			return "Blood rune (Zeah)";
+			return "Blood rune (True Altar)";
 		}
 	},
-	TRUE_BLOOD_RUNE(ItemID.BLOOD_RUNE, 77, 10.5f, false)
+	ZEAH_BLOOD_RUNE(ItemID.BLOOD_RUNE, 77, 24.425f, true)
 	{
 		@Override
 		public String getName(final ItemManager itemManager)
 		{
-			return "Blood rune (True Altar)";
+			return "Blood rune (Zeah)";
 		}
 	},
 	SOUL_RUNE(ItemID.SOUL_RUNE, 90, 30.325f, true),
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/RunecraftBonus.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/RunecraftBonus.java
index 85bd47fac..c64fb1311 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/RunecraftBonus.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/RunecraftBonus.java
@@ -31,7 +31,7 @@ import lombok.Getter;
 @Getter(onMethod_ = @Override)
 public enum RunecraftBonus implements SkillBonus
 {
-	DAEYALT_ESSENCE("Daeyalt essence (+50%)", 1.5f),
+	DAEYALT_ESSENCE("Daeyalt essence", 1.5f),
 	;
 
 	private final String name;
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/SmithingAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/SmithingAction.java
index 46275cc70..a2662c87c 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/SmithingAction.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/SmithingAction.java
@@ -24,10 +24,11 @@
  */
 package net.runelite.client.plugins.skillcalculator.skills;
 
+import java.util.EnumSet;
+import java.util.Set;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
 import net.runelite.api.ItemID;
-import net.runelite.client.game.ItemManager;
 
 @AllArgsConstructor
 @Getter
@@ -37,19 +38,19 @@ public enum SmithingAction implements ItemSkillAction
 	BRONZE_AXE(ItemID.BRONZE_AXE, 1, 12.5f),
 	BRONZE_DAGGER(ItemID.BRONZE_DAGGER, 1, 12.5f),
 	BRONZE_MACE(ItemID.BRONZE_MACE, 2, 12.5f),
-	BRONZE_MED_HELM(ItemID.BRONZE_MED_HELM, 3, 12.5f),
 	BRONZE_BOLTS_UNF(ItemID.BRONZE_BOLTS_UNF, 3, 12.5f),
+	BRONZE_MED_HELM(ItemID.BRONZE_MED_HELM, 3, 12.5f),
+	BRONZE_DART_TIP(ItemID.BRONZE_DART_TIP, 4, 12.5f),
 	BRONZE_NAILS(ItemID.BRONZE_NAILS, 4, 12.5f),
 	BRONZE_SWORD(ItemID.BRONZE_SWORD, 4, 12.5f),
 	BRONZE_WIRE(ItemID.BRONZE_WIRE, 4, 12.5f),
-	BRONZE_DART_TIP(ItemID.BRONZE_DART_TIP, 4, 12.5f),
 	BRONZE_ARROWTIPS(ItemID.BRONZE_ARROWTIPS, 5, 12.5f),
-	BRONZE_SCIMITAR(ItemID.BRONZE_SCIMITAR, 5, 25),
 	BRONZE_HASTA(ItemID.BRONZE_HASTA, 5, 25),
+	BRONZE_SCIMITAR(ItemID.BRONZE_SCIMITAR, 5, 25),
 	BRONZE_SPEAR(ItemID.BRONZE_SPEAR, 5, 25),
 	BRONZE_JAVELIN_HEADS(ItemID.BRONZE_JAVELIN_HEADS, 6, 12.5f),
-	BRONZE_LONGSWORD(ItemID.BRONZE_LONGSWORD, 6, 25),
 	BRONZE_LIMBS(ItemID.BRONZE_LIMBS, 6, 12.5f),
+	BRONZE_LONGSWORD(ItemID.BRONZE_LONGSWORD, 6, 25),
 	BRONZE_KNIFE(ItemID.BRONZE_KNIFE, 7, 12.5f),
 	BRONZE_FULL_HELM(ItemID.BRONZE_FULL_HELM, 7, 25),
 	BRONZE_SQ_SHIELD(ItemID.BRONZE_SQ_SHIELD, 8, 25),
@@ -58,30 +59,30 @@ public enum SmithingAction implements ItemSkillAction
 	BRONZE_CHAINBODY(ItemID.BRONZE_CHAINBODY, 11, 37.5f),
 	BRONZE_KITESHIELD(ItemID.BRONZE_KITESHIELD, 12, 37.5f),
 	BRONZE_CLAWS(ItemID.BRONZE_CLAWS, 13, 25),
-	BRONZE_2H_SWORD(ItemID.BRONZE_2H_SWORD, 14, 37.5f),
 	BARRONITE_DEPOSITS(ItemID.BARRONITE_DEPOSIT, 14, 30),
+	BRONZE_2H_SWORD(ItemID.BRONZE_2H_SWORD, 14, 37.5f),
 	IRON_BAR(ItemID.IRON_BAR, 15, 12.5f),
 	IRON_DAGGER(ItemID.IRON_DAGGER, 15, 25),
 	IRON_AXE(ItemID.IRON_AXE, 16, 25),
 	BRONZE_PLATELEGS(ItemID.BRONZE_PLATELEGS, 16, 37.5f),
 	BRONZE_PLATESKIRT(ItemID.BRONZE_PLATESKIRT, 16, 37.5f),
-	IRON_SPIT(ItemID.IRON_SPIT, 17, 25),
 	IRON_MACE(ItemID.IRON_MACE, 17, 25),
+	IRON_SPIT(ItemID.IRON_SPIT, 17, 25),
 	IRON_BOLTS_UNF(ItemID.IRON_BOLTS_UNF, 18, 25),
-	BRONZE_PLATEBODY(ItemID.BRONZE_PLATEBODY, 18, 62.5f),
 	IRON_MED_HELM(ItemID.IRON_MED_HELM, 18, 25),
-	IRON_NAILS(ItemID.IRON_NAILS, 19, 25),
+	BRONZE_PLATEBODY(ItemID.BRONZE_PLATEBODY, 18, 62.5f),
 	IRON_DART_TIP(ItemID.IRON_DART_TIP, 19, 25),
+	IRON_NAILS(ItemID.IRON_NAILS, 19, 25),
 	IRON_SWORD(ItemID.IRON_SWORD, 19, 25),
 	SILVER_BAR(ItemID.SILVER_BAR, 20, 13.7f),
 	IRON_ARROWTIPS(ItemID.IRON_ARROWTIPS, 20, 25),
-	IRON_SCIMITAR(ItemID.IRON_SCIMITAR, 20, 50),
 	IRON_HASTA(ItemID.IRON_HASTA, 20, 50),
+	IRON_SCIMITAR(ItemID.IRON_SCIMITAR, 20, 50),
 	IRON_SPEAR(ItemID.IRON_SPEAR, 20, 50),
-	IRON_LONGSWORD(ItemID.IRON_LONGSWORD, 21, 50),
 	IRON_JAVELIN_HEADS(ItemID.IRON_JAVELIN_HEADS, 21, 25),
-	IRON_FULL_HELM(ItemID.IRON_FULL_HELM, 22, 50),
+	IRON_LONGSWORD(ItemID.IRON_LONGSWORD, 21, 50),
 	IRON_KNIFE(ItemID.IRON_KNIFE, 22, 25),
+	IRON_FULL_HELM(ItemID.IRON_FULL_HELM, 22, 50),
 	IRON_LIMBS(ItemID.IRON_LIMBS, 23, 25),
 	IRON_SQ_SHIELD(ItemID.IRON_SQ_SHIELD, 23, 50),
 	IRON_WARHAMMER(ItemID.IRON_WARHAMMER, 24, 75),
@@ -91,47 +92,33 @@ public enum SmithingAction implements ItemSkillAction
 	IRON_KITESHIELD(ItemID.IRON_KITESHIELD, 27, 75),
 	IRON_CLAWS(ItemID.IRON_CLAWS, 28, 50),
 	IRON_2H_SWORD(ItemID.IRON_2H_SWORD, 29, 75),
-	STEEL_DAGGER(ItemID.STEEL_DAGGER, 30, 37.5f),
 	STEEL_BAR(ItemID.STEEL_BAR, 30, 17.5f),
-	IRON_PLATESKIRT(ItemID.IRON_PLATESKIRT, 31, 75),
-	IRON_PLATELEGS(ItemID.IRON_PLATELEGS, 31, 75),
+	STEEL_DAGGER(ItemID.STEEL_DAGGER, 30, 37.5f),
 	STEEL_AXE(ItemID.STEEL_AXE, 31, 37.5f),
+	IRON_PLATELEGS(ItemID.IRON_PLATELEGS, 31, 75),
+	IRON_PLATESKIRT(ItemID.IRON_PLATESKIRT, 31, 75),
 	STEEL_MACE(ItemID.STEEL_MACE, 32, 37.5f),
-	IRON_PLATEBODY(ItemID.IRON_PLATEBODY, 33, 125),
-	STEEL_MED_HELM(ItemID.STEEL_MED_HELM, 33, 37.5f),
 	STEEL_BOLTS_UNF(ItemID.STEEL_BOLTS_UNF, 33, 37.5f),
+	STEEL_MED_HELM(ItemID.STEEL_MED_HELM, 33, 37.5f),
+	IRON_PLATEBODY(ItemID.IRON_PLATEBODY, 33, 125),
 	STEEL_DART_TIP(ItemID.STEEL_DART_TIP, 34, 37.5f),
 	STEEL_NAILS(ItemID.STEEL_NAILS, 34, 37.5f),
 	STEEL_SWORD(ItemID.STEEL_SWORD, 34, 37.5f),
 	CANNONBALL(ItemID.CANNONBALL, 35, 25.6f),
-	STEEL_SCIMITAR(ItemID.STEEL_SCIMITAR, 35, 75),
 	STEEL_ARROWTIPS(ItemID.STEEL_ARROWTIPS, 35, 37.5f),
 	STEEL_HASTA(ItemID.STEEL_HASTA, 35, 75),
+	STEEL_SCIMITAR(ItemID.STEEL_SCIMITAR, 35, 75),
 	STEEL_SPEAR(ItemID.STEEL_SPEAR, 35, 75),
+	STEEL_JAVELIN_HEADS(ItemID.STEEL_JAVELIN_HEADS, 36, 37.5f),
 	STEEL_LIMBS(ItemID.STEEL_LIMBS, 36, 37.5f),
 	STEEL_STUDS(ItemID.STEEL_STUDS, 36, 37.5f),
 	STEEL_LONGSWORD(ItemID.STEEL_LONGSWORD, 36, 75),
-	STEEL_JAVELIN_HEADS(ItemID.STEEL_JAVELIN_HEADS, 36, 37.5f),
 	STEEL_KNIFE(ItemID.STEEL_KNIFE, 37, 37.5f),
 	STEEL_FULL_HELM(ItemID.STEEL_FULL_HELM, 37, 75),
 	STEEL_SQ_SHIELD(ItemID.STEEL_SQ_SHIELD, 38, 75),
 	STEEL_WARHAMMER(ItemID.STEEL_WARHAMMER, 39, 112.5f),
-	STEEL_BATTLEAXE(ItemID.STEEL_BATTLEAXE, 40, 112.5f),
-	GOLD_BAR_GOLDSMITH_GAUNTLETS(ItemID.GOLD_BAR, 40, 56.2f)
-	{
-		@Override
-		public String getName(final ItemManager itemManager)
-		{
-			return "Gold bar (Goldsmith gauntlets)";
-		}
-
-		@Override
-		public boolean isMembers(final ItemManager itemManager)
-		{
-			return true;
-		}
-	},
 	GOLD_BAR(ItemID.GOLD_BAR, 40, 22.5f),
+	STEEL_BATTLEAXE(ItemID.STEEL_BATTLEAXE, 40, 112.5f),
 	STEEL_CHAINBODY(ItemID.STEEL_CHAINBODY, 41, 112.5f),
 	STEEL_KITESHIELD(ItemID.STEEL_KITESHIELD, 42, 112.5f),
 	STEEL_CLAWS(ItemID.STEEL_CLAWS, 43, 75),
@@ -140,24 +127,24 @@ public enum SmithingAction implements ItemSkillAction
 	STEEL_PLATESKIRT(ItemID.STEEL_PLATESKIRT, 46, 112.5f),
 	STEEL_PLATEBODY(ItemID.STEEL_PLATEBODY, 48, 187.5f),
 	BULLSEYE_LANTERN_UNF(ItemID.BULLSEYE_LANTERN_UNF, 49, 37),
-	MITHRIL_DAGGER(ItemID.MITHRIL_DAGGER, 50, 50),
 	MITHRIL_BAR(ItemID.MITHRIL_BAR, 50, 30),
+	MITHRIL_DAGGER(ItemID.MITHRIL_DAGGER, 50, 50),
 	MITHRIL_AXE(ItemID.MITHRIL_AXE, 51, 50),
 	MITHRIL_MACE(ItemID.MITHRIL_MACE, 52, 50),
-	MITHRIL_MED_HELM(ItemID.MITHRIL_MED_HELM, 53, 50),
 	MITHRIL_BOLTS_UNF(ItemID.MITHRIL_BOLTS_UNF, 53, 50),
-	MITHRIL_SWORD(ItemID.MITHRIL_SWORD, 54, 50),
+	MITHRIL_MED_HELM(ItemID.MITHRIL_MED_HELM, 53, 50),
 	MITHRIL_DART_TIP(ItemID.MITHRIL_DART_TIP, 54, 50),
 	MITHRIL_NAILS(ItemID.MITHRIL_NAILS, 54, 50),
+	MITHRIL_SWORD(ItemID.MITHRIL_SWORD, 54, 50),
 	MITHRIL_ARROWTIPS(ItemID.MITHRIL_ARROWTIPS, 55, 50),
-	MITHRIL_SCIMITAR(ItemID.MITHRIL_SCIMITAR, 55, 100),
 	MITHRIL_HASTA(ItemID.MITHRIL_HASTA, 55, 100),
+	MITHRIL_SCIMITAR(ItemID.MITHRIL_SCIMITAR, 55, 100),
 	MITHRIL_SPEAR(ItemID.MITHRIL_SPEAR, 55, 100),
-	MITHRIL_LONGSWORD(ItemID.MITHRIL_LONGSWORD, 56, 100),
 	MITHRIL_JAVELIN_HEADS(ItemID.MITHRIL_JAVELIN_HEADS, 56, 50),
 	MITHRIL_LIMBS(ItemID.MITHRIL_LIMBS, 56, 50),
-	MITHRIL_FULL_HELM(ItemID.MITHRIL_FULL_HELM, 57, 100),
+	MITHRIL_LONGSWORD(ItemID.MITHRIL_LONGSWORD, 56, 100),
 	MITHRIL_KNIFE(ItemID.MITHRIL_KNIFE, 57, 50),
+	MITHRIL_FULL_HELM(ItemID.MITHRIL_FULL_HELM, 57, 100),
 	MITHRIL_SQ_SHIELD(ItemID.MITHRIL_SQ_SHIELD, 58, 100),
 	MITH_GRAPPLE_TIP(ItemID.MITH_GRAPPLE_TIP, 59, 50),
 	MITHRIL_WARHAMMER(ItemID.MITHRIL_WARHAMMER, 59, 150),
@@ -167,27 +154,27 @@ public enum SmithingAction implements ItemSkillAction
 	MITHRIL_KITESHIELD(ItemID.MITHRIL_KITESHIELD, 62, 150),
 	MITHRIL_CLAWS(ItemID.MITHRIL_CLAWS, 63, 100),
 	MITHRIL_2H_SWORD(ItemID.MITHRIL_2H_SWORD, 64, 150),
-	MITHRIL_PLATESKIRT(ItemID.MITHRIL_PLATESKIRT, 66, 150),
 	MITHRIL_PLATELEGS(ItemID.MITHRIL_PLATELEGS, 66, 150),
+	MITHRIL_PLATESKIRT(ItemID.MITHRIL_PLATESKIRT, 66, 150),
 	MITHRIL_PLATEBODY(ItemID.MITHRIL_PLATEBODY, 68, 250),
-	ADAMANT_DAGGER(ItemID.ADAMANT_DAGGER, 70, 62.5f),
 	ADAMANTITE_BAR(ItemID.ADAMANTITE_BAR, 70, 37.5f),
+	ADAMANT_DAGGER(ItemID.ADAMANT_DAGGER, 70, 62.5f),
 	ADAMANT_AXE(ItemID.ADAMANT_AXE, 71, 62.5f),
 	ADAMANT_MACE(ItemID.ADAMANT_MACE, 72, 62.5f),
 	ADAMANT_BOLTS_UNF(ItemID.ADAMANT_BOLTSUNF, 73, 62.5f),
 	ADAMANT_MED_HELM(ItemID.ADAMANT_MED_HELM, 73, 62.5f),
+	ADAMANTITE_NAILS(ItemID.ADAMANTITE_NAILS, 74, 62.5f),
 	ADAMANT_DART_TIP(ItemID.ADAMANT_DART_TIP, 74, 62.5f),
 	ADAMANT_SWORD(ItemID.ADAMANT_SWORD, 74, 62.5f),
-	ADAMANTITE_NAILS(ItemID.ADAMANTITE_NAILS, 74, 62.5f),
 	ADAMANT_ARROWTIPS(ItemID.ADAMANT_ARROWTIPS, 75, 62.5f),
-	ADAMANT_SCIMITAR(ItemID.ADAMANT_SCIMITAR, 75, 125),
 	ADAMANT_HASTA(ItemID.ADAMANT_HASTA, 75, 125),
+	ADAMANT_SCIMITAR(ItemID.ADAMANT_SCIMITAR, 75, 125),
 	ADAMANT_SPEAR(ItemID.ADAMANT_SPEAR, 75, 125),
 	ADAMANTITE_LIMBS(ItemID.ADAMANTITE_LIMBS, 76, 62.5f),
-	ADAMANT_LONGSWORD(ItemID.ADAMANT_LONGSWORD, 76, 125),
 	ADAMANT_JAVELIN_HEADS(ItemID.ADAMANT_JAVELIN_HEADS, 76, 62.5f),
-	ADAMANT_FULL_HELM(ItemID.ADAMANT_FULL_HELM, 77, 125),
+	ADAMANT_LONGSWORD(ItemID.ADAMANT_LONGSWORD, 76, 125),
 	ADAMANT_KNIFE(ItemID.ADAMANT_KNIFE, 77, 62.5f),
+	ADAMANT_FULL_HELM(ItemID.ADAMANT_FULL_HELM, 77, 125),
 	ADAMANT_SQ_SHIELD(ItemID.ADAMANT_SQ_SHIELD, 78, 125),
 	ADAMANT_WARHAMMER(ItemID.ADAMANT_WARHAMMER, 79, 187.5f),
 	ADAMANT_BATTLEAXE(ItemID.ADAMANT_BATTLEAXE, 80, 187.5f),
@@ -198,23 +185,23 @@ public enum SmithingAction implements ItemSkillAction
 	RUNITE_BAR(ItemID.RUNITE_BAR, 85, 50),
 	RUNE_DAGGER(ItemID.RUNE_DAGGER, 85, 75),
 	RUNE_AXE(ItemID.RUNE_AXE, 86, 75),
-	ADAMANT_PLATESKIRT(ItemID.ADAMANT_PLATESKIRT, 86, 187.5f),
 	ADAMANT_PLATELEGS(ItemID.ADAMANT_PLATELEGS, 86, 187.5f),
+	ADAMANT_PLATESKIRT(ItemID.ADAMANT_PLATESKIRT, 86, 187.5f),
 	RUNE_MACE(ItemID.RUNE_MACE, 87, 75),
-	RUNITE_BOLTS_UNF(ItemID.RUNITE_BOLTS_UNF, 88, 75),
 	RUNE_MED_HELM(ItemID.RUNE_MED_HELM, 88, 75),
+	RUNITE_BOLTS_UNF(ItemID.RUNITE_BOLTS_UNF, 88, 75),
 	ADAMANT_PLATEBODY(ItemID.ADAMANT_PLATEBODY, 88, 312.5f),
-	RUNE_SWORD(ItemID.RUNE_SWORD, 89, 75),
-	RUNE_NAILS(ItemID.RUNE_NAILS, 89, 75),
 	RUNE_DART_TIP(ItemID.RUNE_DART_TIP, 89, 75),
+	RUNE_NAILS(ItemID.RUNE_NAILS, 89, 75),
+	RUNE_SWORD(ItemID.RUNE_SWORD, 89, 75),
 	RUNE_ARROWTIPS(ItemID.RUNE_ARROWTIPS, 90, 75),
-	RUNE_SCIMITAR(ItemID.RUNE_SCIMITAR, 90, 150),
 	RUNE_HASTA(ItemID.RUNE_HASTA, 90, 150),
+	RUNE_SCIMITAR(ItemID.RUNE_SCIMITAR, 90, 150),
 	RUNE_SPEAR(ItemID.RUNE_SPEAR, 90, 150),
 	DRAGONFIRE_SHIELD(ItemID.DRAGONFIRE_SHIELD, 90, 2000),
-	RUNE_LONGSWORD(ItemID.RUNE_LONGSWORD, 91, 150),
 	RUNE_JAVELIN_HEADS(ItemID.RUNE_JAVELIN_HEADS, 91, 75),
 	RUNITE_LIMBS(ItemID.RUNITE_LIMBS, 91, 75),
+	RUNE_LONGSWORD(ItemID.RUNE_LONGSWORD, 91, 150),
 	RUNE_KNIFE(ItemID.RUNE_KNIFE, 92, 75),
 	RUNE_FULL_HELM(ItemID.RUNE_FULL_HELM, 92, 150),
 	RUNE_SQ_SHIELD(ItemID.RUNE_SQ_SHIELD, 93, 150),
@@ -223,13 +210,26 @@ public enum SmithingAction implements ItemSkillAction
 	RUNE_CHAINBODY(ItemID.RUNE_CHAINBODY, 96, 225),
 	RUNE_KITESHIELD(ItemID.RUNE_KITESHIELD, 97, 225),
 	RUNE_CLAWS(ItemID.RUNE_CLAWS, 98, 150),
-	RUNE_PLATEBODY(ItemID.RUNE_PLATEBODY, 99, 375),
-	RUNE_PLATESKIRT(ItemID.RUNE_PLATESKIRT, 99, 225),
-	RUNE_PLATELEGS(ItemID.RUNE_PLATELEGS, 99, 225),
 	RUNE_2H_SWORD(ItemID.RUNE_2H_SWORD, 99, 225),
+	RUNE_PLATELEGS(ItemID.RUNE_PLATELEGS, 99, 225),
+	RUNE_PLATESKIRT(ItemID.RUNE_PLATESKIRT, 99, 225),
+	RUNE_PLATEBODY(ItemID.RUNE_PLATEBODY, 99, 375),
 	;
 
 	private final int itemId;
 	private final int level;
 	private final float xp;
+
+	@Override
+	public Set<SmithingBonus> getExcludedSkillBonuses()
+	{
+		final EnumSet<SmithingBonus> others = EnumSet.allOf(SmithingBonus.class);
+
+		if (this == GOLD_BAR)
+		{
+			others.remove(SmithingBonus.GOLDSMITH_GAUNTLETS);
+		}
+
+		return others;
+	}
 }
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/SmithingBonus.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/SmithingBonus.java
new file mode 100644
index 000000000..38b97bbb4
--- /dev/null
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/SmithingBonus.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2024, DapperMickie <rustenhovenmick@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.skills;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@AllArgsConstructor
+@Getter(onMethod_ = @Override)
+public enum SmithingBonus implements SkillBonus
+{
+	GOLDSMITH_GAUNTLETS("Goldsmith Gauntlets", 2.5f),
+	;
+
+	private final String name;
+	private final float value;
+}
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/ThievingAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/ThievingAction.java
index c048339bf..eec464d34 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/ThievingAction.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/ThievingAction.java
@@ -37,9 +37,9 @@ public enum ThievingAction implements NamedSkillAction
 	WINTER_SQIRKJUICE("Winter Sq'irkjuice", 1, 350, ItemID.WINTER_SQIRKJUICE),
 	VEGETABLE_STALL("Vegetable Stall", 2, 10, ItemID.CABBAGE),
 	CAKE_STALL("Cake Stall", 5, 16, ItemID.CAKE),
-	TEA_STALL("Tea Stall", 5, 16, ItemID.CUP_OF_TEA_4242),
 	CRAFTING_STALL("Crafting Stall", 5, 16, ItemID.CHISEL_5601),
 	MONKEY_FOOD_STALL("Monkey Food Stall", 5, 16, ItemID.BANANA),
+	TEA_STALL("Tea Stall", 5, 16, ItemID.CUP_OF_TEA_4242),
 	FARMER("Farmer", 10, 14.5f, ItemID.FARMER),
 	HAM_MEMBER("H.A.M. Member", 15, 22.2f, ItemID.MALE_HAM),
 	SILK_STALL("Silk Stall", 20, 24, ItemID.SILK),
@@ -61,23 +61,24 @@ public enum ThievingAction implements NamedSkillAction
 	CROSSBOW_STALL("Crossbow Stall", 49, 52, ItemID.CROSSBOW),
 	SILVER_STALL("Silver Stall", 50, 54, ItemID.SILVER_BAR),
 	WALL_SAFE("Wall Safe", 50, 70, ItemID.STETHOSCOPE),
+	WEALTHY_CITIZEN("Wealthy Citizen", 50, 96, ItemID.WEALTHY_CITIZEN),
 	DESERT_BANDIT("Desert Bandit", 53, 79.5f, ItemID.BANDIT),
 	KNIGHT("Knight", 55, 84.3f, ItemID.KNIGHT),
 	POLLNIVNIAN_BANDIT("Pollnivnian Bandit", 55, 84.3f, ItemID.BANDIT_6781),
 	STONE_CHEST("Stone Chest", 64, 280, ItemID.XERICIAN_FABRIC),
+	SPICES_STALL("Spices Stall", 65, 81, ItemID.SPICE),
 	MAGIC_STALL("Magic Stall", 65, 100, ItemID.AIR_RUNE_6422),
 	SCIMITAR_STALL("Scimitar Stall", 65, 100, ItemID.STEEL_SCIMITAR),
 	MENAPHITE_THUG("Menaphite Thug", 65, 137.5f, ItemID.MENAPHITE_THUG),
-	SPICES_STALL("Spices Stall", 65, 81, ItemID.SPICE),
 	YANILLE_WATCHMAN("Yanille Watchman", 65, 137.5f, ItemID.WATCHMAN),
 	SUMMER_SQIRKJUICE("Summer Sq'irkjuice", 65, 3000, ItemID.SUMMER_SQIRKJUICE),
 	PALADIN("Paladin", 70, 151.8f, ItemID.PALADIN),
-	GNOME("Gnome", 75, 198.5f, ItemID.GNOME),
 	GEMS_STALL("Gems Stall", 75, 160, ItemID.SAPPHIRE),
+	GNOME("Gnome", 75, 198.5f, ItemID.GNOME),
 	DORGESH_KAAN_RICH_CHEST("Dorgesh-Kaan Rich Chest", 78, 650, ItemID.MINING_HELMET),
 	HERO("Hero", 80, 275, ItemID.HERO),
 	VYRE("Vyre", 82, 306.9f, ItemID.VYRE),
-	ROGUES_CASTLE_CHEST("Wilderness Rogues' Chest", 84, 100, ItemID.DRAGONSTONE),
+	ROGUES_CASTLE_CHEST("Wilderness Rogues' Chest", 84, 701.7f, ItemID.DRAGONSTONE),
 	ELF("Elf", 85, 353, ItemID.ELF),
 	TZHAAR_HUR("TzHaar-Hur", 90, 103.4f, ItemID.TZHAARHUR),
 	;
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/WoodcuttingAction.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/WoodcuttingAction.java
index c3e7d56ee..cf219afb3 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/WoodcuttingAction.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/WoodcuttingAction.java
@@ -33,11 +33,12 @@ import net.runelite.client.game.ItemManager;
 @Getter
 public enum WoodcuttingAction implements ItemSkillAction
 {
-	LOGS(ItemID.LOGS, 1, 25),
 	ACHEY_TREE_LOGS(ItemID.ACHEY_TREE_LOGS, 1, 25),
+	LOGS(ItemID.LOGS, 1, 25),
 	OAK_LOGS(ItemID.OAK_LOGS, 15, 37.5f),
 	WILLOW_LOGS(ItemID.WILLOW_LOGS, 30, 67.5f),
 	TEAK_LOGS(ItemID.TEAK_LOGS, 35, 85),
+	JUNIPER_LOGS(ItemID.JUNIPER_LOGS, 42, 35),
 	BARK(ItemID.BARK, 45, 82.5f),
 	MAPLE_LOGS(ItemID.MAPLE_LOGS, 45, 100),
 	MAHOGANY_LOGS(ItemID.MAHOGANY_LOGS, 50, 125),
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/WoodcuttingBonus.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/WoodcuttingBonus.java
index d4ded0e72..af21600d6 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/WoodcuttingBonus.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/skills/WoodcuttingBonus.java
@@ -24,6 +24,8 @@
  */
 package net.runelite.client.plugins.skillcalculator.skills;
 
+import java.util.EnumSet;
+import java.util.Set;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
 
@@ -31,9 +33,18 @@ import lombok.Getter;
 @Getter(onMethod_ = @Override)
 public enum WoodcuttingBonus implements SkillBonus
 {
-	LUMBERJACK_OUTFIT("Lumberjack Outfit (+2.5%)", 1.025f),
+	LUMBERJACK_OUTFIT("Lumberjack Outfit", 1.025f),
+	FELLING_AXE_RATIONS("Felling Axe + Rations", 1.1f),
 	;
 
 	private final String name;
 	private final float value;
+
+	@Override
+	public Set<WoodcuttingBonus> getCanBeStackedWith()
+	{
+		final EnumSet<WoodcuttingBonus> others = EnumSet.allOf(WoodcuttingBonus.class);
+		others.remove(this);
+		return others;
+	}
 }


Test patch:
diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/skillcalculator/CalculatorTypeTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/skillcalculator/CalculatorTypeTest.java
index df5ee0404..355aa3fa8 100644
--- a/runelite-client/src/test/java/net/runelite/client/plugins/skillcalculator/CalculatorTypeTest.java
+++ b/runelite-client/src/test/java/net/runelite/client/plugins/skillcalculator/CalculatorTypeTest.java
@@ -25,26 +25,74 @@
 package net.runelite.client.plugins.skillcalculator;
 
 import net.runelite.client.plugins.skillcalculator.skills.SkillAction;
+import net.runelite.client.plugins.skillcalculator.skills.SkillBonus;
 import static org.junit.Assert.fail;
 import org.junit.Test;
 
 public class CalculatorTypeTest
 {
+
 	@Test
-	public void skillActionsInLevelOrder()
+	public void skillActionsInOrder()
 	{
 		for (final CalculatorType calculatorType : CalculatorType.values())
 		{
-			int level = 1;
+			final String skillName = calculatorType.getSkill().getName();
+			int prevLevel = 0;
+			float prevXP = 0.0f;
+			String prevName = "";
 
 			for (final SkillAction skillAction : calculatorType.getSkillActions())
 			{
-				if (skillAction.getLevel() < level)
+				int currentLevel = skillAction.getLevel();
+				float currentXP = skillAction.getXp();
+				String currentName = skillAction.toString();
+
+				if (currentLevel < prevLevel)
 				{
-					fail("Skill action " + skillAction + " is out of order for " + calculatorType.getSkill().getName());
+					fail(skillName + " skill action " + skillAction + " is not ordered by level.");
 				}
+				else if (currentLevel == prevLevel)
+				{
+					if (currentXP < prevXP)
+					{
+						fail(skillName + " skill action " + skillAction + " is not ordered by xp among level " + currentLevel + " actions.");
+					}
+					else if (currentXP == prevXP && currentName.compareTo(prevName) < 0)
+					{
+						fail(skillName + " skill action " + skillAction + " is not ordered alphabetically among " + currentXP + "xp skills at level " + currentLevel + '.');
+					}
+				}
+
+				prevLevel = currentLevel;
+				prevXP = currentXP;
+				prevName = currentName;
+			}
+		}
+	}
 
-				level = skillAction.getLevel();
+	@Test
+	public void testSkillBonusesMutuallyStack()
+	{
+		for (final CalculatorType calculatorType : CalculatorType.values())
+		{
+			final SkillBonus[] skillBonuses = calculatorType.getSkillBonuses();
+			if (skillBonuses == null)
+			{
+				continue;
+			}
+
+			final String skillName = calculatorType.getSkill().getName();
+
+			for (final SkillBonus skillBonus : skillBonuses)
+			{
+				for (final SkillBonus stackedSkillBonus : skillBonus.getCanBeStackedWith())
+				{
+					if (!stackedSkillBonus.getCanBeStackedWith().contains(skillBonus))
+					{
+						fail(skillName + " skill bonus " + skillBonus + " is not mutually stacked with skill bonus " + stackedSkillBonus);
+					}
+				}
 			}
 		}
 	}
diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/skillcalculator/SkillCalculatorTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/skillcalculator/SkillCalculatorTest.java
new file mode 100644
index 000000000..4b9b36b96
--- /dev/null
+++ b/runelite-client/src/test/java/net/runelite/client/plugins/skillcalculator/SkillCalculatorTest.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2024, Jordan Atwood <nightfirecat@nightfirec.at>
+ * 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 static net.runelite.client.plugins.skillcalculator.SkillCalculator.formatBonusPercentage;
+import static org.junit.Assert.assertEquals;
+import org.junit.Test;
+
+public class SkillCalculatorTest
+{
+	@Test
+	public void testFormatBonusPercentage()
+	{
+		assertEquals("33.33", formatBonusPercentage(0.33333333f));
+		assertEquals("50", formatBonusPercentage(0.5f));
+		assertEquals("102.5", formatBonusPercentage(1.025f));
+		assertEquals("105", formatBonusPercentage(1.05f));
+		assertEquals("110", formatBonusPercentage(1.1f));
+		assertEquals("115", formatBonusPercentage(1.15f));
+		assertEquals("120", formatBonusPercentage(1.2f));
+		assertEquals("150", formatBonusPercentage(1.5f));
+		assertEquals("250", formatBonusPercentage(2.5f));
+		assertEquals("300", formatBonusPercentage(3f));
+		assertEquals("350", formatBonusPercentage(3.5f));
+		assertEquals("400", formatBonusPercentage(4f));
+		assertEquals("700", formatBonusPercentage(7f));
+	}
+}