Repository: runelite/runelite
Pull request #17441 (2024-02-02 04:38:48)

achievement diary: update various tasks
they re-introduced the typo that I've fixed twice now
also I found 3 other ones that were changed

<details>
<summary>images</summary>

![image](https://github.com/runelite/runelite/assets/41973452/321884e3-5f4b-44d7-84bc-99271709488d)
![image](https://github.com/runelite/runelite/assets/41973452/3604996f-32fc-49e2-827d-96c02caedd35)
![image](https://github.com/runelite/runelite/assets/41973452/df4e6fbc-16c5-44c7-9128-4fa1935b0279)
![image](https://github.com/runelite/runelite/assets/41973452/c11e87a0-aeda-4002-bea0-7ccbfe1f55e4)

</details>


Patch:
diff --git a/runelite-api/src/main/java/net/runelite/api/AnimationID.java b/runelite-api/src/main/java/net/runelite/api/AnimationID.java
index 4dcba5687..c5512b514 100644
--- a/runelite-api/src/main/java/net/runelite/api/AnimationID.java
+++ b/runelite-api/src/main/java/net/runelite/api/AnimationID.java
@@ -57,6 +57,7 @@ public final class AnimationID
 	public static final int WOODCUTTING_2H_RUNE = 10070;
 	public static final int WOODCUTTING_2H_DRAGON = 10071;
 	public static final int WOODCUTTING_2H_CRYSTAL = 10072;
+	public static final int WOODCUTTING_2H_CRYSTAL_INACTIVE = 10073;
 	public static final int WOODCUTTING_2H_3A = 10074;
 	public static final int CONSUMING = 829; // consuming consumables
 	public static final int FIREMAKING = 733;
diff --git a/runelite-api/src/main/java/net/runelite/api/ObjectComposition.java b/runelite-api/src/main/java/net/runelite/api/ObjectComposition.java
index 158702290..c055e3d98 100644
--- a/runelite-api/src/main/java/net/runelite/api/ObjectComposition.java
+++ b/runelite-api/src/main/java/net/runelite/api/ObjectComposition.java
@@ -106,4 +106,16 @@ public interface ObjectComposition extends ParamHolder
 	 * @see #getImpostorIds()
 	 */
 	int getVarPlayerId();
+
+	/**
+	 * Get the size of the object on the X-axis in tiles
+	 * @return
+	 */
+	int getSizeX();
+
+	/**
+	 * Get the size of the object on the Y-axis in tiles
+	 * @return
+	 */
+	int getSizeY();
 }
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/FremennikDiaryRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/FremennikDiaryRequirement.java
index dfd2fde23..f4d84ef3a 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/FremennikDiaryRequirement.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/FremennikDiaryRequirement.java
@@ -106,12 +106,12 @@ public class FremennikDiaryRequirement extends GenericDiaryRequirement
 		add("Teleport to Waterbirth Island.",
 			new SkillRequirement(Skill.MAGIC, 72),
 			new QuestRequirement(Quest.LUNAR_DIPLOMACY));
-		add("Obtain the Blast Furnace Foreman's permission to use the Blast Furnace for free.",
+		add("Obtain the Blast Furnace Foremans permission to use the Blast Furnace for free.",
 			new SkillRequirement(Skill.SMITHING, 60),
 			new QuestRequirement(Quest.THE_GIANT_DWARF, true));
 
 		// ELITE
-		add("Craft 56 astral runes simultaneously from Essence without the use of Extracts.",
+		add("Craft 56 astral runes from Essence simultaneously from Essence without the use of Extracts.",
 			new SkillRequirement(Skill.RUNECRAFT, 82),
 			new QuestRequirement(Quest.LUNAR_DIPLOMACY));
 		add("Create a dragonstone amulet in the Neitiznot furnace.",
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/KandarinDiaryRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/KandarinDiaryRequirement.java
index 36c19a8e1..58e6ebab0 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/KandarinDiaryRequirement.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/KandarinDiaryRequirement.java
@@ -120,7 +120,7 @@ public class KandarinDiaryRequirement extends GenericDiaryRequirement
 			new SkillRequirement(Skill.AGILITY, 60));
 		add("Smith a Rune Hasta at Otto's Grotto.",
 			new SkillRequirement(Skill.SMITHING, 90));
-		add("Construct a Pyre ship from Magic Logs.(Requires Chewed Bones.)",
+		add("Construct a Pyre ship from Magic Logs.",
 			new SkillRequirement(Skill.FIREMAKING, 85),
 			new SkillRequirement(Skill.CRAFTING, 85));
 		add("Teleport to Catherby.",
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/WesternDiaryRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/WesternDiaryRequirement.java
index e462b421f..0faf5d8b0 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/WesternDiaryRequirement.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/WesternDiaryRequirement.java
@@ -128,7 +128,7 @@ public class WesternDiaryRequirement extends GenericDiaryRequirement
 		add("Fletch a Magic Longbow in Tirannwn.",
 			new SkillRequirement(Skill.FLETCHING, 85),
 			new QuestRequirement(Quest.MOURNINGS_END_PART_I));
-		add("Kill the Thermonuclear Smoke devil (Does not require task).",
+		add("Kill the Thermonuclear Smoke devil.",
 			new SkillRequirement(Skill.SLAYER, 93));
 		add("Have Prissy Scilla protect your Magic tree.",
 			new SkillRequirement(Skill.FARMING, 75));
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/agility/LapCounterOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/agility/LapCounterOverlay.java
index c7f19b496..c775bfaeb 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/agility/LapCounterOverlay.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/agility/LapCounterOverlay.java
@@ -34,7 +34,6 @@ import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG;
 import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE;
 import net.runelite.client.ui.overlay.OverlayPanel;
 import net.runelite.client.ui.overlay.OverlayPosition;
-import net.runelite.client.ui.overlay.OverlayPriority;
 import net.runelite.client.ui.overlay.components.LineComponent;
 
 class LapCounterOverlay extends OverlayPanel
@@ -49,7 +48,7 @@ class LapCounterOverlay extends OverlayPanel
 	{
 		super(plugin);
 		setPosition(OverlayPosition.TOP_LEFT);
-		setPriority(OverlayPriority.LOW);
+		setPriority(PRIORITY_LOW);
 		this.plugin = plugin;
 		this.config = config;
 		addMenuEntry(RUNELITE_OVERLAY_CONFIG, OPTION_CONFIGURE, "Agility overlay");
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/TabInterface.java b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/TabInterface.java
index 92da9cf8e..f54fbf5a4 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/TabInterface.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/TabInterface.java
@@ -156,13 +156,15 @@ public class TabInterface
 	@Getter
 	private boolean tagTabActive;
 	private int tagTabFirstChildIdx = -1;
-	private int currentTabIndex;
+	private int tabScrollOffset;
 	private Instant startScroll = Instant.now();
+	private int tabCount;
 
+	private Widget parent;
+	private Widget scrollComponent;
 	private Widget upButton;
 	private Widget downButton;
 	private Widget newTab;
-	private Widget tabLayer;
 
 	@Inject
 	private TabInterface(
@@ -227,7 +229,11 @@ public class TabInterface
 			{
 				log.debug("Bank resize!");
 				// This is right before the bank is resized, so wait until after so the computed tab layer size is right
-				clientThread.invokeLater(this::resizeTabLayer);
+				clientThread.invokeLater(() ->
+				{
+					repositionButtons();
+					rebuildTabs();
+				});
 			}
 		}
 		else if (event.getScriptId() == ScriptID.BANKMAIN_SEARCH_TOGGLE)
@@ -245,7 +251,7 @@ public class TabInterface
 				hideBank();
 			}
 
-			resizeTabLayer();
+			repositionButtons();
 			rebuildTabs();
 			rebuildTagTabTab();
 
@@ -302,7 +308,7 @@ public class TabInterface
 		if (event.getGroupId() == InterfaceID.BANK && event.isUnload())
 		{
 			enabled = false;
-			upButton = downButton = newTab = tabLayer = null;
+			upButton = downButton = newTab = scrollComponent = parent = null;
 			activeTab = null;
 			tagTabActive = false;
 			tagTabFirstChildIdx = -1;
@@ -311,14 +317,13 @@ public class TabInterface
 
 	private void init()
 	{
-		Widget parent = client.getWidget(ComponentID.BANK_CONTENT_CONTAINER);
+		assert parent == null; // avoid double init
+		parent = client.getWidget(ComponentID.BANK_CONTENT_CONTAINER);
 
-		assert tabLayer == null; // avoid double init
-
-		tabLayer = parent.createStaticChild(WidgetType.LAYER);
-		tabLayer.setHasListener(true);
-		tabLayer.setNoScrollThrough(true);
-		tabLayer.setOnScrollWheelListener((JavaScriptCallback) (event) -> scrollTab(event.getMouseY()));
+		scrollComponent = parent.createChild(-1, WidgetType.TEXT); // not really text, but just to capture scroll
+		scrollComponent.setHasListener(true);
+		scrollComponent.setNoScrollThrough(true);
+		scrollComponent.setOnScrollWheelListener((JavaScriptCallback) (event) -> scrollTab(event.getMouseY()));
 
 		upButton = createGraphic(parent, "", TabSprites.UP_ARROW.getSpriteId(), -1, TAB_WIDTH, BUTTON_HEIGHT, MARGIN, 0);
 		upButton.setAction(1, SCROLL_UP);
@@ -346,7 +351,7 @@ public class TabInterface
 		tabManager.clear();
 		tabManager.getAllTabs().forEach(this::loadTab);
 
-		currentTabIndex = config.position();
+		tabScrollOffset = config.position();
 		scrollTab(0);
 
 		if (config.rememberTab() && !Strings.isNullOrEmpty(config.tab()))
@@ -399,12 +404,9 @@ public class TabInterface
 		enabled = false;
 		activeTab = null;
 
-		// we can't easily remove these, just hide and orphan them
-		upButton.setHidden(true);
-		downButton.setHidden(true);
-		newTab.setHidden(true);
-		tabLayer.setHidden(true);
-		upButton = downButton = newTab = tabLayer = null;
+		upButton = downButton = newTab = scrollComponent = null;
+		parent.deleteAllChildren();
+		parent = null;
 
 		tabManager.clear();
 	}
@@ -507,7 +509,7 @@ public class TabInterface
 							loadTab(tagName);
 							tabManager.save();
 
-							resizeTabLayer();
+							repositionButtons();
 							rebuildTabs();
 							rebuildTagTabTab();
 						}
@@ -555,7 +557,7 @@ public class TabInterface
 					loadTab(name);
 					tabManager.save();
 
-					resizeTabLayer();
+					repositionButtons();
 					rebuildTabs();
 					rebuildTagTabTab();
 
@@ -755,16 +757,19 @@ public class TabInterface
 			if (!tagTabActive
 				&& draggedWidget.getId() == ComponentID.BANK_ITEM_CONTAINER
 				&& draggedWidget.getItemId() != -1
-				&& draggedOn.getId() == tabLayer.getId())
+				&& draggedOn.getParent() == parent
+				&& draggedOn.getIndex() > 3) // skip buttons
 			{
 				// Tag an item dragged on a tag tab
+				log.debug("Dragged {} to tab {}", draggedWidget.getItemId(), Text.removeTags(draggedOn.getName()));
 				tagManager.addTag(draggedWidget.getItemId(), draggedOn.getName(), shiftDown);
 				reloadActiveTab();
 			}
 			else if ((tagTabActive && draggedWidget.getId() == ComponentID.BANK_ITEM_CONTAINER && draggedOn.getId() == ComponentID.BANK_ITEM_CONTAINER)
-				|| (tabLayer.getId() == draggedOn.getId() && tabLayer.getId() == draggedWidget.getId()))
+				|| (draggedWidget.getParent() == parent && draggedOn.getParent() == parent))
 			{
 				// Reorder tag tabs
+				log.debug("Reorder tag tab {} <-> {}", draggedWidget, draggedOn);
 				moveTagTab(draggedWidget, draggedOn);
 			}
 		}
@@ -854,7 +859,7 @@ public class TabInterface
 		tabManager.remove(tag);
 		tabManager.save();
 
-		resizeTabLayer();
+		repositionButtons();
 		rebuildTabs();
 		rebuildTagTabTab();
 		scrollTab(0);
@@ -927,24 +932,22 @@ public class TabInterface
 
 	private void scrollTab(int d)
 	{
-		currentTabIndex += d;
+		tabScrollOffset += d;
 
-		int maxTabs = tabLayer.getHeight() / TAB_HEIGHT;
-		int maxScroll = tabManager.size() - maxTabs;
-		if (currentTabIndex > maxScroll)
+		int maxScroll = tabManager.size() - tabCount;
+		if (tabScrollOffset > maxScroll)
 		{
-			currentTabIndex = maxScroll;
+			tabScrollOffset = maxScroll;
 		}
 
-		if (currentTabIndex < 0)
+		if (tabScrollOffset < 0)
 		{
-			currentTabIndex = 0;
+			tabScrollOffset = 0;
 		}
 
-		int amt = (MARGIN + TAB_HEIGHT) * currentTabIndex;
-		tabLayer.setScrollY(amt);
+		config.position(tabScrollOffset);
 
-		config.position(currentTabIndex);
+		rebuildTabs();
 	}
 
 	private void openNamedTag(String name, boolean relayout)
@@ -991,7 +994,7 @@ public class TabInterface
 		}
 	}
 
-	private void resizeTabLayer()
+	private void repositionButtons()
 	{
 		Widget incinerator = client.getWidget(ComponentID.BANK_INCINERATOR);
 		int incineratorHeight = 0;
@@ -1019,38 +1022,43 @@ public class TabInterface
 			incineratorHeight = incinerator.getHeight();
 		}
 
-		Widget parent = tabLayer.getParent();
-		tabLayer.setOriginalY(41 + BUTTON_HEIGHT);
-		tabLayer.setOriginalWidth(TAB_WIDTH + MARGIN * 2);
+		scrollComponent.setOriginalY(41 + BUTTON_HEIGHT);
+		scrollComponent.setOriginalWidth(TAB_WIDTH + MARGIN * 2);
 
 		// Keep the tab layer height a multiple of the tab heights
-		int tabLayerHeight = parent.getHeight() - tabLayer.getOriginalY() - 61 - incineratorHeight;
-		int numTabs = tabLayerHeight / (TAB_HEIGHT + MARGIN);
-		tabLayer.setOriginalHeight(numTabs * (TAB_HEIGHT + MARGIN));
+		int tabLayerHeight = parent.getHeight() - scrollComponent.getOriginalY() - 61 - incineratorHeight;
+		tabCount = tabLayerHeight / (TAB_HEIGHT + MARGIN);
+		scrollComponent.setOriginalHeight(tabCount * (TAB_HEIGHT + MARGIN));
 
-		tabLayer.revalidate();
+		scrollComponent.revalidate();
 
 		upButton.setOriginalY(41);
 		upButton.revalidate();
 
-		downButton.setOriginalY(41 + BUTTON_HEIGHT + numTabs * (TAB_HEIGHT + MARGIN) + MARGIN);
+		downButton.setOriginalY(41 + BUTTON_HEIGHT + tabCount * (TAB_HEIGHT + MARGIN) + MARGIN);
 		downButton.revalidate();
 	}
 
 	private void rebuildTabs()
 	{
-		int y = MARGIN;
+		// remove the tag tabs but keep the buttons and scroll component
+		parent.setChildren(Arrays.copyOf(parent.getChildren(), 4));
 
-		tabLayer.deleteAllChildren();
-		for (TagTab tab : tabManager.getTabs())
+		int y = scrollComponent.getOriginalY();
+		y += MARGIN;
+
+		var tabs = tabManager.getTabs();
+		for (int i = tabScrollOffset; i < tabScrollOffset + tabCount && i < tabs.size(); ++i)
 		{
-			Widget background = createGraphic(tabLayer, ColorUtil.wrapWithColorTag(tab.getTag(), HILIGHT_COLOR),
+			TagTab tab = tabs.get(i);
+
+			Widget background = createGraphic(parent, ColorUtil.wrapWithColorTag(tab.getTag(), HILIGHT_COLOR),
 				(activeTab == tab ? TabSprites.TAB_BACKGROUND_ACTIVE : TabSprites.TAB_BACKGROUND).getSpriteId(),
 				-1, TAB_WIDTH, TAB_HEIGHT, MARGIN, y);
 			addTabActions(background);
 
 			Widget icon = createGraphic(
-				tabLayer,
+				parent,
 				ColorUtil.wrapWithColorTag(tab.getTag(), HILIGHT_COLOR),
 				-1,
 				tab.getIconItemId(),
@@ -1060,8 +1068,6 @@ public class TabInterface
 
 			y += TAB_HEIGHT + MARGIN;
 		}
-
-		tabLayer.setScrollHeight(y);
 	}
 
 	private void rebuildTagTabTab()
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/barrows/BarrowsBrotherSlainOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/barrows/BarrowsBrotherSlainOverlay.java
index a2a21c7a7..e30383b64 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/barrows/BarrowsBrotherSlainOverlay.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/barrows/BarrowsBrotherSlainOverlay.java
@@ -38,7 +38,6 @@ import net.runelite.client.ui.FontManager;
 import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE;
 import net.runelite.client.ui.overlay.OverlayPanel;
 import net.runelite.client.ui.overlay.OverlayPosition;
-import net.runelite.client.ui.overlay.OverlayPriority;
 import net.runelite.client.ui.overlay.components.LineComponent;
 
 class BarrowsBrotherSlainOverlay extends OverlayPanel
@@ -52,7 +51,7 @@ class BarrowsBrotherSlainOverlay extends OverlayPanel
 	{
 		super(plugin);
 		setPosition(OverlayPosition.TOP_LEFT);
-		setPriority(OverlayPriority.LOW);
+		setPriority(PRIORITY_LOW);
 		this.client = client;
 		addMenuEntry(RUNELITE_OVERLAY_CONFIG, OPTION_CONFIGURE, "Barrows overlay");
 	}
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/boosts/BoostsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/boosts/BoostsOverlay.java
index 197259194..763fb3746 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/boosts/BoostsOverlay.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/boosts/BoostsOverlay.java
@@ -33,7 +33,6 @@ import net.runelite.api.Client;
 import net.runelite.api.Skill;
 import net.runelite.client.ui.overlay.OverlayPanel;
 import net.runelite.client.ui.overlay.OverlayPosition;
-import net.runelite.client.ui.overlay.OverlayPriority;
 import net.runelite.client.ui.overlay.components.LineComponent;
 import net.runelite.client.util.ColorUtil;
 
@@ -51,7 +50,7 @@ class BoostsOverlay extends OverlayPanel
 		this.client = client;
 		this.config = config;
 		setPosition(OverlayPosition.TOP_LEFT);
-		setPriority(OverlayPriority.MED);
+		setPriority(PRIORITY_MED);
 	}
 
 	@Override
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/boosts/CompactBoostsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/boosts/CompactBoostsOverlay.java
index ca43aced3..a4a046bc3 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/boosts/CompactBoostsOverlay.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/boosts/CompactBoostsOverlay.java
@@ -37,7 +37,6 @@ import net.runelite.api.Skill;
 import net.runelite.client.game.SkillIconManager;
 import net.runelite.client.ui.overlay.Overlay;
 import net.runelite.client.ui.overlay.OverlayPosition;
-import net.runelite.client.ui.overlay.OverlayPriority;
 import net.runelite.client.ui.overlay.components.TextComponent;
 import net.runelite.client.util.ImageUtil;
 
@@ -66,7 +65,7 @@ class CompactBoostsOverlay extends Overlay
 		this.plugin = plugin;
 		this.skillIconManager = skillIconManager;
 		setPosition(OverlayPosition.TOP_LEFT);
-		setPriority(OverlayPriority.MED);
+		setPriority(PRIORITY_MED);
 	}
 
 	@Override
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonOverlay.java
index 51e3165dd..573913ebc 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonOverlay.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonOverlay.java
@@ -35,12 +35,11 @@ import static net.runelite.api.Perspective.LOCAL_TILE_SIZE;
 import net.runelite.api.Point;
 import net.runelite.api.coords.LocalPoint;
 import net.runelite.api.coords.WorldPoint;
+import static net.runelite.client.plugins.cannon.CannonPlugin.MAX_OVERLAY_DISTANCE;
 import net.runelite.client.ui.overlay.Overlay;
 import net.runelite.client.ui.overlay.OverlayPosition;
-import net.runelite.client.ui.overlay.OverlayPriority;
 import net.runelite.client.ui.overlay.OverlayUtil;
 import net.runelite.client.ui.overlay.components.TextComponent;
-import static net.runelite.client.plugins.cannon.CannonPlugin.MAX_OVERLAY_DISTANCE;
 
 class CannonOverlay extends Overlay
 {
@@ -53,7 +52,7 @@ class CannonOverlay extends Overlay
 	CannonOverlay(Client client, CannonConfig config, CannonPlugin plugin)
 	{
 		setPosition(OverlayPosition.DYNAMIC);
-		setPriority(OverlayPriority.MED);
+		setPriority(PRIORITY_MED);
 		this.client = client;
 		this.config = config;
 		this.plugin = plugin;
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsPlugin.java
index 8d039adc6..d97eca907 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsPlugin.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsPlugin.java
@@ -2588,6 +2588,7 @@ public class ChatCommandsPlugin extends Plugin
 			Math.min(client.getVarbitValue(Varbits.TOA_MEMBER_2_HEALTH), 1) +
 			Math.min(client.getVarbitValue(Varbits.TOA_MEMBER_3_HEALTH), 1) +
 			Math.min(client.getVarbitValue(Varbits.TOA_MEMBER_4_HEALTH), 1) +
+			Math.min(client.getVarbitValue(Varbits.TOA_MEMBER_5_HEALTH), 1) +
 			Math.min(client.getVarbitValue(Varbits.TOA_MEMBER_6_HEALTH), 1) +
 			Math.min(client.getVarbitValue(Varbits.TOA_MEMBER_7_HEALTH), 1);
 	}
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollOverlay.java
index 4a0b1f239..90048cf6e 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollOverlay.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollOverlay.java
@@ -42,7 +42,6 @@ import net.runelite.client.plugins.cluescrolls.clues.item.ItemRequirement;
 import static net.runelite.client.plugins.cluescrolls.clues.item.ItemRequirements.item;
 import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE;
 import net.runelite.client.ui.overlay.OverlayPanel;
-import net.runelite.client.ui.overlay.OverlayPriority;
 import net.runelite.client.ui.overlay.components.ComponentConstants;
 import net.runelite.client.ui.overlay.components.LineComponent;
 
@@ -97,7 +96,7 @@ public class ClueScrollOverlay extends OverlayPanel
 		super(plugin);
 		this.plugin = plugin;
 		this.client = client;
-		setPriority(OverlayPriority.LOW);
+		setPriority(PRIORITY_LOW);
 		addMenuEntry(RUNELITE_OVERLAY_CONFIG, OPTION_CONFIGURE, "Clue Scroll overlay");
 		addMenuEntry(RUNELITE_OVERLAY, "Reset", "Clue Scroll overlay", e -> plugin.resetClue(true));
 	}
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/FaloTheBardClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/FaloTheBardClue.java
index d7ea55fa7..0617365d3 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/FaloTheBardClue.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/FaloTheBardClue.java
@@ -58,7 +58,7 @@ public class FaloTheBardClue extends ClueScroll implements NpcClueScroll
 		new FaloTheBardClue("A mark used to increase one's grace, found atop a seer's place.", item(MARK_OF_GRACE)),
 		new FaloTheBardClue("A molten beast with fiery breath, you acquire these with its death.", item(LAVA_DRAGON_BONES)),
 		new FaloTheBardClue("A shiny helmet of flight, to obtain this with melee, struggle you might.", item(ARMADYL_HELMET)),
-		new FaloTheBardClue("A sword held in the other hand, red its colour, Cyclops strength you must withstand.", any("Dragon or Avernic Defender", item(DRAGON_DEFENDER), item(DRAGON_DEFENDER_T), item(DRAGON_DEFENDER_L), item(AVERNIC_DEFENDER), item(AVERNIC_DEFENDER_L), item(GHOMMALS_AVERNIC_DEFENDER_5), item(GHOMMALS_AVERNIC_DEFENDER_5_L), item(GHOMMALS_AVERNIC_DEFENDER_6), item(GHOMMALS_AVERNIC_DEFENDER_6_L))),
+		new FaloTheBardClue("A sword held in the other hand, red its colour, Cyclops strength you must withstand.", any("Dragon or Avernic Defender", item(DRAGON_DEFENDER), item(DRAGON_DEFENDER_T), item(DRAGON_DEFENDER_L), item(DRAGON_DEFENDER_LT), item(AVERNIC_DEFENDER), item(AVERNIC_DEFENDER_L), item(GHOMMALS_AVERNIC_DEFENDER_5), item(GHOMMALS_AVERNIC_DEFENDER_5_L), item(GHOMMALS_AVERNIC_DEFENDER_6), item(GHOMMALS_AVERNIC_DEFENDER_6_L))),
 		new FaloTheBardClue("A token used to kill mythical beasts, in hopes of a blade or just for an xp feast.", item(WARRIOR_GUILD_TOKEN)),
 		new FaloTheBardClue("Green is my favourite, mature ale I do love, this takes your herblore above.", item(GREENMANS_ALEM)),
 		new FaloTheBardClue("It can hold down a boat or crush a goat, this object, you see, is quite heavy.", any("Barrelchest anchor", item(BARRELCHEST_ANCHOR), item(BARRELCHEST_ANCHOR_BH))),
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/corp/CorpDamageOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/corp/CorpDamageOverlay.java
index 48d3becf7..12042814d 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/corp/CorpDamageOverlay.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/corp/CorpDamageOverlay.java
@@ -40,7 +40,6 @@ import net.runelite.client.ui.overlay.OverlayLayer;
 import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE;
 import net.runelite.client.ui.overlay.OverlayPanel;
 import net.runelite.client.ui.overlay.OverlayPosition;
-import net.runelite.client.ui.overlay.OverlayPriority;
 import net.runelite.client.ui.overlay.components.ComponentConstants;
 import net.runelite.client.ui.overlay.components.LineComponent;
 
@@ -56,7 +55,7 @@ class CorpDamageOverlay extends OverlayPanel
 		super(corpPlugin);
 		setPosition(OverlayPosition.TOP_LEFT);
 		setLayer(OverlayLayer.UNDER_WIDGETS);
-		setPriority(OverlayPriority.LOW);
+		setPriority(PRIORITY_LOW);
 		this.client = client;
 		this.corpPlugin = corpPlugin;
 		this.config = config;
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsOverlay.java
index 4da3834d4..16611b439 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsOverlay.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsOverlay.java
@@ -61,7 +61,6 @@ import net.runelite.client.ui.FontManager;
 import net.runelite.client.ui.overlay.Overlay;
 import net.runelite.client.ui.overlay.OverlayLayer;
 import net.runelite.client.ui.overlay.OverlayPosition;
-import net.runelite.client.ui.overlay.OverlayPriority;
 import net.runelite.client.ui.overlay.OverlayUtil;
 import net.runelite.client.ui.overlay.tooltip.Tooltip;
 import net.runelite.client.ui.overlay.tooltip.TooltipManager;
@@ -91,7 +90,7 @@ class DevToolsOverlay extends Overlay
 	{
 		setPosition(OverlayPosition.DYNAMIC);
 		setLayer(OverlayLayer.ABOVE_WIDGETS);
-		setPriority(OverlayPriority.HIGHEST);
+		setPriority(PRIORITY_HIGHEST);
 		this.client = client;
 		this.plugin = plugin;
 		this.toolTipManager = toolTipManager;
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/WidgetInspectorOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/WidgetInspectorOverlay.java
index 72d1979e3..9720a356d 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/WidgetInspectorOverlay.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/WidgetInspectorOverlay.java
@@ -38,7 +38,6 @@ import net.runelite.api.widgets.Widget;
 import net.runelite.client.ui.overlay.Overlay;
 import net.runelite.client.ui.overlay.OverlayLayer;
 import net.runelite.client.ui.overlay.OverlayPosition;
-import net.runelite.client.ui.overlay.OverlayPriority;
 
 @Singleton
 public class WidgetInspectorOverlay extends Overlay
@@ -57,7 +56,7 @@ public class WidgetInspectorOverlay extends Overlay
 
 		setPosition(OverlayPosition.DYNAMIC);
 		setLayer(OverlayLayer.ABOVE_WIDGETS);
-		setPriority(OverlayPriority.HIGHEST);
+		setPriority(PRIORITY_HIGHEST);
 		drawAfterInterface(InterfaceID.FULLSCREEN_CONTAINER_TLI);
 	}
 
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/WorldMapLocationOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/WorldMapLocationOverlay.java
index 55498f796..f73e1e12d 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/WorldMapLocationOverlay.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/WorldMapLocationOverlay.java
@@ -40,7 +40,6 @@ import net.runelite.api.worldmap.WorldMap;
 import net.runelite.client.ui.overlay.Overlay;
 import net.runelite.client.ui.overlay.OverlayLayer;
 import net.runelite.client.ui.overlay.OverlayPosition;
-import net.runelite.client.ui.overlay.OverlayPriority;
 import net.runelite.client.ui.overlay.worldmap.WorldMapOverlay;
 
 public class WorldMapLocationOverlay extends Overlay
@@ -56,7 +55,7 @@ public class WorldMapLocationOverlay extends Overlay
 		this.worldMapOverlay = worldMapOverlay;
 		this.plugin = plugin;
 		setPosition(OverlayPosition.DYNAMIC);
-		setPriority(OverlayPriority.HIGHEST);
+		setPriority(PRIORITY_HIGHEST);
 		setLayer(OverlayLayer.MANUAL);
 		drawAfterInterface(InterfaceID.WORLD_MAP);
 	}
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/WorldMapRegionOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/WorldMapRegionOverlay.java
index 0340c1f41..396cc6fd4 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/WorldMapRegionOverlay.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/WorldMapRegionOverlay.java
@@ -40,7 +40,6 @@ import net.runelite.api.worldmap.WorldMap;
 import net.runelite.client.ui.overlay.Overlay;
 import net.runelite.client.ui.overlay.OverlayLayer;
 import net.runelite.client.ui.overlay.OverlayPosition;
-import net.runelite.client.ui.overlay.OverlayPriority;
 
 class WorldMapRegionOverlay extends Overlay
 {
@@ -56,7 +55,7 @@ class WorldMapRegionOverlay extends Overlay
 	private WorldMapRegionOverlay(Client client, DevToolsPlugin plugin)
 	{
 		setPosition(OverlayPosition.DYNAMIC);
-		setPriority(OverlayPriority.HIGH);
+		setPriority(PRIORITY_HIGH);
 		setLayer(OverlayLayer.MANUAL);
 		drawAfterInterface(InterfaceID.WORLD_MAP);
 		this.client = client;
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/driftnet/DriftNetOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/driftnet/DriftNetOverlay.java
index 1ff9e117f..0a6e6bb6f 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/driftnet/DriftNetOverlay.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/driftnet/DriftNetOverlay.java
@@ -34,7 +34,6 @@ import net.runelite.api.Point;
 import net.runelite.client.ui.overlay.Overlay;
 import net.runelite.client.ui.overlay.OverlayLayer;
 import net.runelite.client.ui.overlay.OverlayPosition;
-import net.runelite.client.ui.overlay.OverlayPriority;
 import net.runelite.client.ui.overlay.OverlayUtil;
 
 class DriftNetOverlay extends Overlay
@@ -48,7 +47,7 @@ class DriftNetOverlay extends Overlay
 		this.config = config;
 		this.plugin = plugin;
 		setPosition(OverlayPosition.DYNAMIC);
-		setPriority(OverlayPriority.LOW);
+		setPriority(PRIORITY_LOW);
 		setLayer(OverlayLayer.ABOVE_SCENE);
 	}
 
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/fps/FpsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/fps/FpsOverlay.java
index 68d809870..6ac5666c2 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/fps/FpsOverlay.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/fps/FpsOverlay.java
@@ -36,7 +36,6 @@ import net.runelite.api.widgets.Widget;
 import net.runelite.client.ui.overlay.Overlay;
 import net.runelite.client.ui.overlay.OverlayLayer;
 import net.runelite.client.ui.overlay.OverlayPosition;
-import net.runelite.client.ui.overlay.OverlayPriority;
 import net.runelite.client.ui.overlay.OverlayUtil;
 
 /**
@@ -66,7 +65,7 @@ public class FpsOverlay extends Overlay
 		this.config = config;
 		this.client = client;
 		setLayer(OverlayLayer.ABOVE_WIDGETS);
-		setPriority(OverlayPriority.HIGH);
+		setPriority(PRIORITY_HIGH);
 		setPosition(OverlayPosition.DYNAMIC);
 	}
 
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerMinimapOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerMinimapOverlay.java
index 4f120dcb6..0a808fdd3 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerMinimapOverlay.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerMinimapOverlay.java
@@ -40,7 +40,6 @@ import net.runelite.api.coords.WorldPoint;
 import net.runelite.client.ui.overlay.Overlay;
 import net.runelite.client.ui.overlay.OverlayLayer;
 import net.runelite.client.ui.overlay.OverlayPosition;
-import net.runelite.client.ui.overlay.OverlayPriority;
 
 class GroundMarkerMinimapOverlay extends Overlay
 {
@@ -55,7 +54,7 @@ class GroundMarkerMinimapOverlay extends Overlay
 		this.config = config;
 		this.plugin = plugin;
 		setPosition(OverlayPosition.DYNAMIC);
-		setPriority(OverlayPriority.LOW);
+		setPriority(PRIORITY_LOW);
 		setLayer(OverlayLayer.ABOVE_WIDGETS);
 	}
 
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerOverlay.java
index 3a43bd859..b0243cf67 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerOverlay.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerOverlay.java
@@ -43,7 +43,6 @@ import net.runelite.api.coords.WorldPoint;
 import net.runelite.client.ui.overlay.Overlay;
 import net.runelite.client.ui.overlay.OverlayLayer;
 import net.runelite.client.ui.overlay.OverlayPosition;
-import net.runelite.client.ui.overlay.OverlayPriority;
 import net.runelite.client.ui.overlay.OverlayUtil;
 
 public class GroundMarkerOverlay extends Overlay
@@ -61,7 +60,7 @@ public class GroundMarkerOverlay extends Overlay
 		this.config = config;
 		this.plugin = plugin;
 		setPosition(OverlayPosition.DYNAMIC);
-		setPriority(OverlayPriority.LOW);
+		setPriority(PRIORITY_LOW);
 		setLayer(OverlayLayer.ABOVE_SCENE);
 	}
 
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/idlenotifier/IdleNotifierPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/idlenotifier/IdleNotifierPlugin.java
index fa9430c7a..162635773 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/idlenotifier/IdleNotifierPlugin.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/idlenotifier/IdleNotifierPlugin.java
@@ -159,6 +159,7 @@ public class IdleNotifierPlugin extends Plugin
 			case WOODCUTTING_2H_RUNE:
 			case WOODCUTTING_2H_DRAGON:
 			case WOODCUTTING_2H_CRYSTAL:
+			case WOODCUTTING_2H_CRYSTAL_INACTIVE:
 			case WOODCUTTING_2H_3A:
 			case BLISTERWOOD_JUMP_SCARE:
 			/* Firemaking */
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/instancemap/InstanceMapOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/instancemap/InstanceMapOverlay.java
index d46edc17f..2391eb9b1 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/instancemap/InstanceMapOverlay.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/instancemap/InstanceMapOverlay.java
@@ -46,7 +46,6 @@ import net.runelite.client.game.SpriteManager;
 import net.runelite.client.ui.overlay.Overlay;
 import net.runelite.client.ui.overlay.OverlayLayer;
 import net.runelite.client.ui.overlay.OverlayPosition;
-import net.runelite.client.ui.overlay.OverlayPriority;
 import net.runelite.client.ui.overlay.components.BackgroundComponent;
 
 @Singleton
@@ -100,7 +99,7 @@ class InstanceMapOverlay extends Overlay
 	{
 		this.client = client;
 		this.spriteManager = spriteManager;
-		setPriority(OverlayPriority.HIGH);
+		setPriority(PRIORITY_HIGH);
 		setPosition(OverlayPosition.TOP_LEFT);
 		setLayer(OverlayLayer.ABOVE_WIDGETS);
 		backgroundComponent.setFill(false);
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/interacthighlight/InteractHighlightOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/interacthighlight/InteractHighlightOverlay.java
index 50ab9d011..1a0210c21 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/interacthighlight/InteractHighlightOverlay.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/interacthighlight/InteractHighlightOverlay.java
@@ -40,7 +40,6 @@ import net.runelite.api.widgets.WidgetUtil;
 import net.runelite.client.ui.overlay.Overlay;
 import net.runelite.client.ui.overlay.OverlayLayer;
 import net.runelite.client.ui.overlay.OverlayPosition;
-import net.runelite.client.ui.overlay.OverlayPriority;
 import net.runelite.client.ui.overlay.outline.ModelOutlineRenderer;
 import net.runelite.client.util.ColorUtil;
 
@@ -62,7 +61,7 @@ class InteractHighlightOverlay extends Overlay
 		this.modelOutlineRenderer = modelOutlineRenderer;
 		setPosition(OverlayPosition.DYNAMIC);
 		setLayer(OverlayLayer.ABOVE_SCENE);
-		setPriority(OverlayPriority.HIGH);
+		setPriority(PRIORITY_HIGH);
 	}
 
 	@Override
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/kourendlibrary/KourendLibraryTutorialOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/kourendlibrary/KourendLibraryTutorialOverlay.java
index 0ad6103c0..69090946d 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/kourendlibrary/KourendLibraryTutorialOverlay.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/kourendlibrary/KourendLibraryTutorialOverlay.java
@@ -32,7 +32,6 @@ import net.runelite.api.Player;
 import net.runelite.api.coords.WorldPoint;
 import net.runelite.client.ui.overlay.OverlayPanel;
 import net.runelite.client.ui.overlay.OverlayPosition;
-import net.runelite.client.ui.overlay.OverlayPriority;
 import net.runelite.client.ui.overlay.components.LineComponent;
 
 class KourendLibraryTutorialOverlay extends OverlayPanel
@@ -60,7 +59,7 @@ class KourendLibraryTutorialOverlay extends OverlayPanel
 		completeMessageComponent = LineComponent.builder().left("All books found.").build();
 		sidebarMessageComponent = LineComponent.builder().left("Locations are in the sidebar.").build();
 
-		setPriority(OverlayPriority.LOW);
+		setPriority(PRIORITY_LOW);
 		setPosition(OverlayPosition.TOP_LEFT);
 	}
 
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/nightmarezone/NightmareZoneOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/nightmarezone/NightmareZoneOverlay.java
index 9a59f5f55..827a04162 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/nightmarezone/NightmareZoneOverlay.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/nightmarezone/NightmareZoneOverlay.java
@@ -38,7 +38,6 @@ import net.runelite.client.game.ItemManager;
 import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE;
 import net.runelite.client.ui.overlay.OverlayPanel;
 import net.runelite.client.ui.overlay.OverlayPosition;
-import net.runelite.client.ui.overlay.OverlayPriority;
 import net.runelite.client.ui.overlay.components.LineComponent;
 import net.runelite.client.ui.overlay.infobox.InfoBoxManager;
 import net.runelite.client.util.QuantityFormatter;
@@ -63,7 +62,7 @@ class NightmareZoneOverlay extends OverlayPanel
 	{
 		super(plugin);
 		setPosition(OverlayPosition.TOP_LEFT);
-		setPriority(OverlayPriority.LOW);
+		setPriority(PRIORITY_LOW);
 		this.client = client;
 		this.config = config;
 		this.plugin = plugin;
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaNotWorkingOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaNotWorkingOverlay.java
index 50b9cc8a3..5621e5732 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaNotWorkingOverlay.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaNotWorkingOverlay.java
@@ -29,7 +29,6 @@ import java.awt.Dimension;
 import java.awt.Graphics2D;
 import net.runelite.client.ui.overlay.OverlayPanel;
 import net.runelite.client.ui.overlay.OverlayPosition;
-import net.runelite.client.ui.overlay.OverlayPriority;
 import net.runelite.client.ui.overlay.components.LineComponent;
 
 class NpcAggroAreaNotWorkingOverlay extends OverlayPanel
@@ -45,7 +44,7 @@ class NpcAggroAreaNotWorkingOverlay extends OverlayPanel
 			.left("Unaggressive NPC timers require calibration. Teleport far away or enter a dungeon, then run until this overlay disappears.")
 			.build());
 
-		setPriority(OverlayPriority.LOW);
+		setPriority(PRIORITY_LOW);
 		setPosition(OverlayPosition.TOP_LEFT);
 		setClearChildren(false);
 	}
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaOverlay.java
index 72691c4da..068206ef8 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaOverlay.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaOverlay.java
@@ -41,7 +41,6 @@ import net.runelite.api.geometry.Geometry;
 import net.runelite.client.ui.overlay.Overlay;
 import net.runelite.client.ui.overlay.OverlayLayer;
 import net.runelite.client.ui.overlay.OverlayPosition;
-import net.runelite.client.ui.overlay.OverlayPriority;
 
 class NpcAggroAreaOverlay extends Overlay
 {
@@ -59,7 +58,7 @@ class NpcAggroAreaOverlay extends Overlay
 		this.plugin = plugin;
 
 		setLayer(OverlayLayer.ABOVE_SCENE);
-		setPriority(OverlayPriority.LOW);
+		setPriority(PRIORITY_LOW);
 		setPosition(OverlayPosition.DYNAMIC);
 	}
 
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/objectindicators/ObjectIndicatorsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/objectindicators/ObjectIndicatorsOverlay.java
index 8a41240b7..d97c0794a 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/objectindicators/ObjectIndicatorsOverlay.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/objectindicators/ObjectIndicatorsOverlay.java
@@ -48,7 +48,6 @@ import static net.runelite.client.plugins.objectindicators.ColorTileObject.HF_TI
 import net.runelite.client.ui.overlay.Overlay;
 import net.runelite.client.ui.overlay.OverlayLayer;
 import net.runelite.client.ui.overlay.OverlayPosition;
-import net.runelite.client.ui.overlay.OverlayPriority;
 import net.runelite.client.ui.overlay.OverlayUtil;
 import net.runelite.client.ui.overlay.outline.ModelOutlineRenderer;
 import net.runelite.client.util.ColorUtil;
@@ -69,7 +68,7 @@ class ObjectIndicatorsOverlay extends Overlay
 		this.plugin = plugin;
 		this.modelOutlineRenderer = modelOutlineRenderer;
 		setPosition(OverlayPosition.DYNAMIC);
-		setPriority(OverlayPriority.LOW);
+		setPriority(PRIORITY_LOW);
 		setLayer(OverlayLayer.ABOVE_SCENE);
 	}
 
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoOverlay.java
index fdb6619e8..d4a57c01f 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoOverlay.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoOverlay.java
@@ -49,7 +49,6 @@ import net.runelite.client.hiscore.HiscoreSkill;
 import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE;
 import net.runelite.client.ui.overlay.OverlayPanel;
 import net.runelite.client.ui.overlay.OverlayPosition;
-import net.runelite.client.ui.overlay.OverlayPriority;
 import net.runelite.client.ui.overlay.components.ComponentConstants;
 import net.runelite.client.ui.overlay.components.ProgressBarComponent;
 import net.runelite.client.ui.overlay.components.TitleComponent;
@@ -87,7 +86,7 @@ class OpponentInfoOverlay extends OverlayPanel
 		this.npcManager = npcManager;
 
 		setPosition(OverlayPosition.TOP_LEFT);
-		setPriority(OverlayPriority.HIGH);
+		setPriority(PRIORITY_HIGH);
 
 		panelComponent.setBorder(new Rectangle(2, 2, 2, 2));
 		panelComponent.setGap(new Point(0, 2));
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyStatusOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyStatusOverlay.java
index 87d4ce047..41373918a 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyStatusOverlay.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyStatusOverlay.java
@@ -45,7 +45,6 @@ import net.runelite.client.ui.FontManager;
 import net.runelite.client.ui.overlay.Overlay;
 import net.runelite.client.ui.overlay.OverlayLayer;
 import net.runelite.client.ui.overlay.OverlayPosition;
-import net.runelite.client.ui.overlay.OverlayPriority;
 import net.runelite.client.ui.overlay.OverlayUtil;
 import net.runelite.client.util.ColorUtil;
 
@@ -89,7 +88,7 @@ class PartyStatusOverlay extends Overlay
 
 		setLayer(OverlayLayer.UNDER_WIDGETS);
 		setPosition(OverlayPosition.DYNAMIC);
-		setPriority(OverlayPriority.HIGH);
+		setPriority(PRIORITY_HIGH);
 	}
 
 	@Override
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsMinimapOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsMinimapOverlay.java
index 5184d539b..87d43ef16 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsMinimapOverlay.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsMinimapOverlay.java
@@ -32,7 +32,6 @@ import net.runelite.api.Player;
 import net.runelite.client.ui.overlay.Overlay;
 import net.runelite.client.ui.overlay.OverlayLayer;
 import net.runelite.client.ui.overlay.OverlayPosition;
-import net.runelite.client.ui.overlay.OverlayPriority;
 import net.runelite.client.ui.overlay.OverlayUtil;
 
 @Singleton
@@ -48,7 +47,7 @@ public class PlayerIndicatorsMinimapOverlay extends Overlay
 		this.playerIndicatorsService = playerIndicatorsService;
 		setLayer(OverlayLayer.ABOVE_WIDGETS);
 		setPosition(OverlayPosition.DYNAMIC);
-		setPriority(OverlayPriority.HIGH);
+		setPriority(PRIORITY_HIGH);
 	}
 
 	@Override
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsOverlay.java
index e71e32e36..341d57ce1 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsOverlay.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsOverlay.java
@@ -36,7 +36,6 @@ import net.runelite.api.Point;
 import net.runelite.client.game.ChatIconManager;
 import net.runelite.client.ui.overlay.Overlay;
 import net.runelite.client.ui.overlay.OverlayPosition;
-import net.runelite.client.ui.overlay.OverlayPriority;
 import net.runelite.client.ui.overlay.OverlayUtil;
 import net.runelite.client.util.Text;
 
@@ -58,7 +57,7 @@ public class PlayerIndicatorsOverlay extends Overlay
 		this.playerIndicatorsService = playerIndicatorsService;
 		this.chatIconManager = chatIconManager;
 		setPosition(OverlayPosition.DYNAMIC);
-		setPriority(OverlayPriority.MED);
+		setPriority(PRIORITY_MED);
 	}
 
 	@Override
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsTileOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsTileOverlay.java
index c9ea0507d..7405ecb4a 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsTileOverlay.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsTileOverlay.java
@@ -32,7 +32,6 @@ import javax.inject.Inject;
 import net.runelite.client.ui.overlay.Overlay;
 import net.runelite.client.ui.overlay.OverlayLayer;
 import net.runelite.client.ui.overlay.OverlayPosition;
-import net.runelite.client.ui.overlay.OverlayPriority;
 import net.runelite.client.ui.overlay.OverlayUtil;
 
 public class PlayerIndicatorsTileOverlay extends Overlay
@@ -47,7 +46,7 @@ public class PlayerIndicatorsTileOverlay extends Overlay
 		this.playerIndicatorsService = playerIndicatorsService;
 		setLayer(OverlayLayer.ABOVE_SCENE);
 		setPosition(OverlayPosition.DYNAMIC);
-		setPriority(OverlayPriority.MED);
+		setPriority(PRIORITY_MED);
 	}
 
 	@Override
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerBarOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerBarOverlay.java
index a0d0f8d84..f6178e1b1 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerBarOverlay.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerBarOverlay.java
@@ -41,7 +41,6 @@ import net.runelite.api.coords.LocalPoint;
 import net.runelite.client.ui.overlay.Overlay;
 import net.runelite.client.ui.overlay.OverlayLayer;
 import net.runelite.client.ui.overlay.OverlayPosition;
-import net.runelite.client.ui.overlay.OverlayPriority;
 import net.runelite.client.util.ImageUtil;
 
 @Singleton
@@ -68,7 +67,7 @@ class PrayerBarOverlay extends Overlay
 		this.plugin = plugin;
 
 		setPosition(OverlayPosition.DYNAMIC);
-		setPriority(OverlayPriority.HIGH);
+		setPriority(PRIORITY_HIGH);
 		setLayer(OverlayLayer.ABOVE_SCENE);
 	}
 
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/PuzzleSolverOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/PuzzleSolverOverlay.java
index 8ec6c7842..e8946f7a4 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/PuzzleSolverOverlay.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/PuzzleSolverOverlay.java
@@ -44,11 +44,11 @@ import net.runelite.api.Item;
 import net.runelite.api.ItemContainer;
 import static net.runelite.api.SpriteID.MINIMAP_DESTINATION_FLAG;
 import net.runelite.api.widgets.ComponentID;
-import static net.runelite.client.plugins.puzzlesolver.solver.PuzzleSolver.BLANK_TILE_VALUE;
-import static net.runelite.client.plugins.puzzlesolver.solver.PuzzleSolver.DIMENSION;
 import net.runelite.api.widgets.Widget;
 import net.runelite.client.game.SpriteManager;
 import net.runelite.client.plugins.puzzlesolver.solver.PuzzleSolver;
+import static net.runelite.client.plugins.puzzlesolver.solver.PuzzleSolver.BLANK_TILE_VALUE;
+import static net.runelite.client.plugins.puzzlesolver.solver.PuzzleSolver.DIMENSION;
 import net.runelite.client.plugins.puzzlesolver.solver.PuzzleState;
 import net.runelite.client.plugins.puzzlesolver.solver.heuristics.ManhattanDistance;
 import net.runelite.client.plugins.puzzlesolver.solver.pathfinding.IDAStar;
@@ -56,7 +56,6 @@ import net.runelite.client.plugins.puzzlesolver.solver.pathfinding.IDAStarMM;
 import net.runelite.client.ui.overlay.Overlay;
 import net.runelite.client.ui.overlay.OverlayLayer;
 import net.runelite.client.ui.overlay.OverlayPosition;
-import net.runelite.client.ui.overlay.OverlayPriority;
 import net.runelite.client.ui.overlay.OverlayUtil;
 import net.runelite.client.ui.overlay.components.BackgroundComponent;
 import net.runelite.client.ui.overlay.components.TextComponent;
@@ -89,7 +88,7 @@ public class PuzzleSolverOverlay extends Overlay
 	public PuzzleSolverOverlay(Client client, PuzzleSolverConfig config, ScheduledExecutorService executorService, SpriteManager spriteManager)
 	{
 		setPosition(OverlayPosition.DYNAMIC);
-		setPriority(OverlayPriority.HIGH);
+		setPriority(PRIORITY_HIGH);
 		setLayer(OverlayLayer.ABOVE_WIDGETS);
 		this.client = client;
 		this.config = config;
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsOverlay.java
index 74cc3a102..a5fe27837 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsOverlay.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsOverlay.java
@@ -40,7 +40,6 @@ import net.runelite.client.plugins.raids.solver.Room;
 import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE;
 import net.runelite.client.ui.overlay.OverlayPanel;
 import net.runelite.client.ui.overlay.OverlayPosition;
-import net.runelite.client.ui.overlay.OverlayPriority;
 import net.runelite.client.ui.overlay.components.ComponentConstants;
 import net.runelite.client.ui.overlay.components.LineComponent;
 import net.runelite.client.ui.overlay.components.TitleComponent;
@@ -66,7 +65,7 @@ class RaidsOverlay extends OverlayPanel
 	{
 		super(plugin);
 		setPosition(OverlayPosition.TOP_LEFT);
-		setPriority(OverlayPriority.LOW);
+		setPriority(PRIORITY_LOW);
 		this.client = client;
 		this.plugin = plugin;
 		this.config = config;
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerCreationOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerCreationOverlay.java
index 81e25192e..26e8dec35 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerCreationOverlay.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerCreationOverlay.java
@@ -32,7 +32,6 @@ import javax.inject.Inject;
 import net.runelite.client.ui.overlay.Overlay;
 import net.runelite.client.ui.overlay.OverlayLayer;
 import net.runelite.client.ui.overlay.OverlayPosition;
-import net.runelite.client.ui.overlay.OverlayPriority;
 
 class ScreenMarkerCreationOverlay extends Overlay
 {
@@ -44,7 +43,7 @@ class ScreenMarkerCreationOverlay extends Overlay
 		this.plugin = plugin;
 		setPosition(OverlayPosition.DYNAMIC);
 		setLayer(OverlayLayer.ABOVE_WIDGETS);
-		setPriority(OverlayPriority.HIGH);
+		setPriority(PRIORITY_HIGH);
 		setMovable(true);
 	}
 
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerOverlay.java
index 5341f75af..f5621c682 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerOverlay.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerOverlay.java
@@ -33,7 +33,6 @@ import lombok.NonNull;
 import net.runelite.client.ui.overlay.Overlay;
 import net.runelite.client.ui.overlay.OverlayLayer;
 import net.runelite.client.ui.overlay.OverlayPosition;
-import net.runelite.client.ui.overlay.OverlayPriority;
 
 public class ScreenMarkerOverlay extends Overlay
 {
@@ -47,7 +46,7 @@ public class ScreenMarkerOverlay extends Overlay
 		this.screenMarkerRenderable = new ScreenMarkerRenderable();
 		setPosition(OverlayPosition.DYNAMIC);
 		setLayer(OverlayLayer.ALWAYS_ON_TOP);
-		setPriority(OverlayPriority.HIGH);
+		setPriority(PRIORITY_HIGH);
 		setMovable(true);
 		setResizable(true);
 		setMinimumSize(16);
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerWidgetHighlightOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerWidgetHighlightOverlay.java
index cd92af332..153420378 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerWidgetHighlightOverlay.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerWidgetHighlightOverlay.java
@@ -36,7 +36,6 @@ import net.runelite.api.widgets.Widget;
 import net.runelite.client.ui.overlay.Overlay;
 import net.runelite.client.ui.overlay.OverlayLayer;
 import net.runelite.client.ui.overlay.OverlayPosition;
-import net.runelite.client.ui.overlay.OverlayPriority;
 
 class ScreenMarkerWidgetHighlightOverlay extends Overlay
 {
@@ -50,7 +49,7 @@ class ScreenMarkerWidgetHighlightOverlay extends Overlay
 		this.client = client;
 		setPosition(OverlayPosition.DYNAMIC);
 		setLayer(OverlayLayer.ABOVE_WIDGETS);
-		setPriority(OverlayPriority.HIGH);
+		setPriority(PRIORITY_HIGH);
 		setMovable(true);
 	}
 
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotOverlay.java
index 854f5ed53..284a7103c 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotOverlay.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotOverlay.java
@@ -45,7 +45,6 @@ import net.runelite.client.ui.FontManager;
 import net.runelite.client.ui.overlay.Overlay;
 import net.runelite.client.ui.overlay.OverlayLayer;
 import net.runelite.client.ui.overlay.OverlayPosition;
-import net.runelite.client.ui.overlay.OverlayPriority;
 
 class ScreenshotOverlay extends Overlay
 {
@@ -62,7 +61,7 @@ class ScreenshotOverlay extends Overlay
 	private ScreenshotOverlay(Client client, DrawManager drawManager, ScreenshotPlugin plugin)
 	{
 		setPosition(OverlayPosition.DYNAMIC);
-		setPriority(OverlayPriority.HIGH);
+		setPriority(PRIORITY_HIGH);
 		setLayer(OverlayLayer.ABOVE_WIDGETS);
 		this.client = client;
 		this.drawManager = drawManager;
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/specialcounter/PlayerInfoDropOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/specialcounter/PlayerInfoDropOverlay.java
index 497eb0d3d..87d4ce73d 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/specialcounter/PlayerInfoDropOverlay.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/specialcounter/PlayerInfoDropOverlay.java
@@ -37,7 +37,6 @@ import net.runelite.api.Player;
 import net.runelite.api.Point;
 import net.runelite.client.ui.overlay.Overlay;
 import net.runelite.client.ui.overlay.OverlayPosition;
-import net.runelite.client.ui.overlay.OverlayPriority;
 import net.runelite.client.ui.overlay.OverlayUtil;
 import net.runelite.client.util.ColorUtil;
 import net.runelite.client.util.ImageUtil;
@@ -56,7 +55,7 @@ class PlayerInfoDropOverlay extends Overlay
 		this.config = config;
 		this.client = client;
 		setPosition(OverlayPosition.DYNAMIC);
-		setPriority(OverlayPriority.MED);
+		setPriority(PRIORITY_MED);
 	}
 
 	@Override
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/team/TeamCapesOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/team/TeamCapesOverlay.java
index 5f00db93e..270a5e3b3 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/team/TeamCapesOverlay.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/team/TeamCapesOverlay.java
@@ -34,7 +34,6 @@ import net.runelite.client.game.ItemManager;
 import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE;
 import net.runelite.client.ui.overlay.OverlayPanel;
 import net.runelite.client.ui.overlay.OverlayPosition;
-import net.runelite.client.ui.overlay.OverlayPriority;
 import net.runelite.client.ui.overlay.components.ComponentOrientation;
 import net.runelite.client.ui.overlay.components.ImageComponent;
 
@@ -49,7 +48,7 @@ class TeamCapesOverlay extends OverlayPanel
 	{
 		super(plugin);
 		setPosition(OverlayPosition.TOP_LEFT);
-		setPriority(OverlayPriority.LOW);
+		setPriority(PRIORITY_LOW);
 		this.plugin = plugin;
 		this.config = config;
 		this.manager = manager;
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/tileindicators/TileIndicatorsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/tileindicators/TileIndicatorsOverlay.java
index 99f81a298..23b45e9c8 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/tileindicators/TileIndicatorsOverlay.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/tileindicators/TileIndicatorsOverlay.java
@@ -37,7 +37,6 @@ import net.runelite.api.coords.WorldPoint;
 import net.runelite.client.ui.overlay.Overlay;
 import net.runelite.client.ui.overlay.OverlayLayer;
 import net.runelite.client.ui.overlay.OverlayPosition;
-import net.runelite.client.ui.overlay.OverlayPriority;
 import net.runelite.client.ui.overlay.OverlayUtil;
 
 public class TileIndicatorsOverlay extends Overlay
@@ -52,7 +51,7 @@ public class TileIndicatorsOverlay extends Overlay
 		this.config = config;
 		setPosition(OverlayPosition.DYNAMIC);
 		setLayer(OverlayLayer.ABOVE_SCENE);
-		setPriority(OverlayPriority.MED);
+		setPriority(PRIORITY_MED);
 	}
 
 	@Override
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtPlugin.java
index 31caeb9e4..2636d057c 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtPlugin.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtPlugin.java
@@ -44,6 +44,7 @@ import static net.runelite.api.AnimationID.WOODCUTTING_2H_ADAMANT;
 import static net.runelite.api.AnimationID.WOODCUTTING_2H_BLACK;
 import static net.runelite.api.AnimationID.WOODCUTTING_2H_BRONZE;
 import static net.runelite.api.AnimationID.WOODCUTTING_2H_CRYSTAL;
+import static net.runelite.api.AnimationID.WOODCUTTING_2H_CRYSTAL_INACTIVE;
 import static net.runelite.api.AnimationID.WOODCUTTING_2H_DRAGON;
 import static net.runelite.api.AnimationID.WOODCUTTING_2H_IRON;
 import static net.runelite.api.AnimationID.WOODCUTTING_2H_MITHRIL;
@@ -444,6 +445,7 @@ public class WintertodtPlugin extends Plugin
 			case WOODCUTTING_2H_RUNE:
 			case WOODCUTTING_2H_DRAGON:
 			case WOODCUTTING_2H_CRYSTAL:
+			case WOODCUTTING_2H_CRYSTAL_INACTIVE:
 			case WOODCUTTING_2H_3A:
 				setActivity(WintertodtActivity.WOODCUTTING);
 				break;
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/Tree.java b/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/Tree.java
deleted file mode 100644
index d773e1260..000000000
--- a/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/Tree.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (c) 2018, Mantautas Jurksa <https://github.com/Juzzed>
- * 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.woodcutting;
-
-import com.google.common.collect.ImmutableMap;
-import java.time.Duration;
-import java.util.Map;
-import javax.annotation.Nullable;
-import lombok.Getter;
-import net.runelite.api.NullObjectID;
-import net.runelite.api.ObjectID;
-import static net.runelite.api.NullObjectID.NULL_10835;
-import static net.runelite.api.NullObjectID.NULL_10823;
-import static net.runelite.api.ObjectID.*;
-import static net.runelite.client.util.RSTimeUnit.GAME_TICKS;
-
-@Getter
-@SuppressWarnings("PMD.UnnecessaryFullyQualifiedName")
-enum Tree
-{
-	REGULAR_TREE(null, TREE, TREE_1277, TREE_1278, TREE_1279, TREE_1280, TREE_40750, TREE_40752),
-	OAK_TREE(Duration.of(14, GAME_TICKS), OAK_TREE_4540, OAK_TREE_10820),
-	WILLOW_TREE(Duration.of(14, GAME_TICKS), WILLOW_TREE_10819, WILLOW_TREE_10829, WILLOW_TREE_10831, WILLOW_TREE_10833),
-	MAPLE_TREE(Duration.of(59, GAME_TICKS), MAPLE_TREE_10832, MAPLE_TREE_36681, MAPLE_TREE_40754)
-		{
-			@Override
-			Duration getRespawnTime(int region)
-			{
-				return region == MISCELLANIA_REGION ? Duration.of(14, GAME_TICKS) : super.respawnTime;
-			}
-		},
-	TEAK_TREE(Duration.of(15, GAME_TICKS), ObjectID.TEAK_TREE, TEAK_TREE_36686, TEAK_TREE_40758),
-	MAHOGANY_TREE(Duration.of(14, GAME_TICKS), ObjectID.MAHOGANY_TREE, MAHOGANY, MAHOGANY_TREE_40760),
-	YEW_TREE(Duration.of(99, GAME_TICKS), YEW_TREE_10822, NULL_10823, YEW_TREE_36683, YEW_TREE_40756),
-	MAGIC_TREE(Duration.of(199, GAME_TICKS), MAGIC_TREE_10834, NULL_10835),
-	REDWOOD(Duration.of(199, GAME_TICKS), REDWOOD_TREE, REDWOOD_TREE_29670, NullObjectID.NULL_34633, NullObjectID.NULL_34635, NullObjectID.NULL_34637, NullObjectID.NULL_34639, ObjectID.REDWOOD_TREE_34284, ObjectID.REDWOOD_TREE_34286, ObjectID.REDWOOD_TREE_34288, ObjectID.REDWOOD_TREE_34290);
-
-	@Nullable
-	private final Duration respawnTime;
-	private final int[] treeIds;
-
-	Tree(Duration respawnTime, int... treeIds)
-	{
-		this.respawnTime = respawnTime;
-		this.treeIds = treeIds;
-	}
-
-	private static final int MISCELLANIA_REGION = 10044;
-	private static final Map<Integer, Tree> TREES;
-
-	static
-	{
-		ImmutableMap.Builder<Integer, Tree> builder = new ImmutableMap.Builder<>();
-
-		for (Tree tree : values())
-		{
-			for (int treeId : tree.treeIds)
-			{
-				builder.put(treeId, tree);
-			}
-		}
-
-		TREES = builder.build();
-	}
-
-	Duration getRespawnTime(int region)
-	{
-		return respawnTime;
-	}
-
-	static Tree findTree(int objectId)
-	{
-		return TREES.get(objectId);
-	}
-}
\ No newline at end of file
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/TreeRespawn.java b/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/TreeRespawn.java
index ef05dc67b..58602a375 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/TreeRespawn.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/TreeRespawn.java
@@ -34,10 +34,9 @@ import net.runelite.api.coords.WorldPoint;
 @Getter
 class TreeRespawn
 {
-	private final Tree tree;
+	private final WorldPoint worldLocation;
 	private final int lenX;
 	private final int lenY;
-	private final WorldPoint worldLocation;
 	private final Instant startTime;
 	private final int respawnTime;
 
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingPlugin.java
index fb65e4de0..d9e6f394f 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingPlugin.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingPlugin.java
@@ -46,6 +46,7 @@ import static net.runelite.api.AnimationID.WOODCUTTING_2H_ADAMANT;
 import static net.runelite.api.AnimationID.WOODCUTTING_2H_BLACK;
 import static net.runelite.api.AnimationID.WOODCUTTING_2H_BRONZE;
 import static net.runelite.api.AnimationID.WOODCUTTING_2H_CRYSTAL;
+import static net.runelite.api.AnimationID.WOODCUTTING_2H_CRYSTAL_INACTIVE;
 import static net.runelite.api.AnimationID.WOODCUTTING_2H_DRAGON;
 import static net.runelite.api.AnimationID.WOODCUTTING_2H_IRON;
 import static net.runelite.api.AnimationID.WOODCUTTING_2H_MITHRIL;
@@ -67,11 +68,14 @@ import static net.runelite.api.AnimationID.WOODCUTTING_STEEL;
 import static net.runelite.api.AnimationID.WOODCUTTING_TRAILBLAZER;
 import net.runelite.api.ChatMessageType;
 import net.runelite.api.Client;
+import net.runelite.api.Constants;
 import net.runelite.api.GameObject;
 import net.runelite.api.NPC;
 import net.runelite.api.NpcID;
+import net.runelite.api.NullObjectID;
+import net.runelite.api.ObjectComposition;
 import net.runelite.api.ObjectID;
-import net.runelite.api.Point;
+import net.runelite.api.ScriptID;
 import net.runelite.api.coords.WorldPoint;
 import net.runelite.api.events.AnimationChanged;
 import net.runelite.api.events.ChatMessage;
@@ -83,6 +87,7 @@ import net.runelite.api.events.InteractingChanged;
 import net.runelite.api.events.ItemSpawned;
 import net.runelite.api.events.NpcDespawned;
 import net.runelite.api.events.NpcSpawned;
+import net.runelite.api.events.ScriptPreFired;
 import net.runelite.client.Notifier;
 import net.runelite.client.config.ConfigManager;
 import net.runelite.client.eventbus.Subscribe;
@@ -106,7 +111,7 @@ public class WoodcuttingPlugin extends Plugin
 		WOODCUTTING_INFERNAL, WOODCUTTING_3A_AXE, WOODCUTTING_CRYSTAL, WOODCUTTING_TRAILBLAZER,
 		WOODCUTTING_2H_BRONZE, WOODCUTTING_2H_IRON, WOODCUTTING_2H_STEEL, WOODCUTTING_2H_BLACK,
 		WOODCUTTING_2H_MITHRIL, WOODCUTTING_2H_ADAMANT, WOODCUTTING_2H_RUNE, WOODCUTTING_2H_DRAGON,
-		WOODCUTTING_2H_CRYSTAL, WOODCUTTING_2H_3A
+		WOODCUTTING_2H_CRYSTAL, WOODCUTTING_2H_CRYSTAL_INACTIVE, WOODCUTTING_2H_3A
 	);
 
 	private static final Pattern WOOD_CUT_PATTERN = Pattern.compile("You get (?:some|an)[\\w ]+(?:logs?|mushrooms)\\.");
@@ -136,7 +141,7 @@ public class WoodcuttingPlugin extends Plugin
 	private WoodcuttingSession session;
 
 	@Getter
-	private final Set<GameObject> treeObjects = new HashSet<>();
+	private final Set<GameObject> redwoods = new HashSet<>();
 
 	// Forestry
 	@Getter(AccessLevel.PACKAGE)
@@ -163,8 +168,6 @@ public class WoodcuttingPlugin extends Plugin
 
 	@Getter(AccessLevel.PACKAGE)
 	private final List<TreeRespawn> respawns = new ArrayList<>();
-	private boolean recentlyLoggedIn;
-	private int currentPlane;
 	private ClueNestTier clueTierSpawned;
 
 	@Provides
@@ -186,7 +189,7 @@ public class WoodcuttingPlugin extends Plugin
 		overlayManager.remove(overlay);
 		overlayManager.remove(treesOverlay);
 		respawns.clear();
-		treeObjects.clear();
+		redwoods.clear();
 		roots.clear();
 		flowers.clear();
 		saplingIngredients.clear();
@@ -198,9 +201,7 @@ public class WoodcuttingPlugin extends Plugin
 	@Subscribe
 	public void onGameTick(GameTick gameTick)
 	{
-		recentlyLoggedIn = false;
 		clueTierSpawned = null;
-		currentPlane = client.getPlane();
 
 		respawns.removeIf(TreeRespawn::isExpired);
 
@@ -319,15 +320,23 @@ public class WoodcuttingPlugin extends Plugin
 	public void onGameObjectSpawned(final GameObjectSpawned event)
 	{
 		GameObject gameObject = event.getGameObject();
-		Tree tree = Tree.findTree(gameObject.getId());
-
-		if (tree == Tree.REDWOOD)
-		{
-			treeObjects.add(gameObject);
-		}
 
 		switch (gameObject.getId())
 		{
+			/* redwood trees */
+			case ObjectID.REDWOOD_TREE:
+			case ObjectID.REDWOOD_TREE_29670:
+			case NullObjectID.NULL_34633:
+			case NullObjectID.NULL_34635:
+			case NullObjectID.NULL_34637:
+			case NullObjectID.NULL_34639:
+			case ObjectID.REDWOOD_TREE_34284:
+			case ObjectID.REDWOOD_TREE_34286:
+			case ObjectID.REDWOOD_TREE_34288:
+			case ObjectID.REDWOOD_TREE_34290:
+				redwoods.add(gameObject);
+				break;
+
 			case ObjectID.TREE_ROOTS:
 			case ObjectID.ANIMAINFUSED_TREE_ROOTS:
 				if (roots.isEmpty() && config.forestryRisingRootsNotification())
@@ -369,28 +378,22 @@ public class WoodcuttingPlugin extends Plugin
 	{
 		final GameObject object = event.getGameObject();
 
-		Tree tree = Tree.findTree(object.getId());
-		if (tree != null)
-		{
-			if (tree.getRespawnTime() != null && !recentlyLoggedIn && currentPlane == object.getPlane())
-			{
-				log.debug("Adding respawn timer for {} tree at {}", tree, object.getLocalLocation());
-
-				Point min = object.getSceneMinLocation();
-				WorldPoint base = WorldPoint.fromScene(client, min.getX(), min.getY(), client.getPlane());
-				TreeRespawn treeRespawn = new TreeRespawn(tree, object.sizeX() - 1, object.sizeY() - 1,
-					base, Instant.now(), (int) tree.getRespawnTime(base.getRegionID()).toMillis());
-				respawns.add(treeRespawn);
-			}
-
-			if (tree == Tree.REDWOOD)
-			{
-				treeObjects.remove(event.getGameObject());
-			}
-		}
-
 		switch (object.getId())
 		{
+			/* redwood trees */
+			case ObjectID.REDWOOD_TREE:
+			case ObjectID.REDWOOD_TREE_29670:
+			case NullObjectID.NULL_34633:
+			case NullObjectID.NULL_34635:
+			case NullObjectID.NULL_34637:
+			case NullObjectID.NULL_34639:
+			case ObjectID.REDWOOD_TREE_34284:
+			case ObjectID.REDWOOD_TREE_34286:
+			case ObjectID.REDWOOD_TREE_34288:
+			case ObjectID.REDWOOD_TREE_34290:
+				redwoods.remove(object);
+				break;
+
 			case ObjectID.TREE_ROOTS:
 			case ObjectID.ANIMAINFUSED_TREE_ROOTS:
 				roots.remove(object);
@@ -420,6 +423,137 @@ public class WoodcuttingPlugin extends Plugin
 		}
 	}
 
+	@Subscribe
+	public void onScriptPreFired(ScriptPreFired scriptPreFired)
+	{
+		if (scriptPreFired.getScriptId() == ScriptID.ADD_OVERLAYTIMER_LOC)
+		{
+			var args = scriptPreFired.getScriptEvent().getArguments();
+			int locCoord = (int) args[1];
+			int locId = (int) args[2];
+			int ticks = (int) args[5];
+
+			log.debug("Add overlay loc={} coord={} ticks={}", locId, locCoord, ticks);
+
+			switch (locId)
+			{
+				case ObjectID.TREE_STUMP:
+				case ObjectID.TREE_STUMP_1342: // regular
+				case ObjectID.TREE_STUMP_1343:
+				case ObjectID.TREE_STUMP_1344:
+				case ObjectID.TREE_STUMP_1345:
+				case ObjectID.TREE_STUMP_1346:
+				case ObjectID.TREE_STUMP_1347:
+				case ObjectID.TREE_STUMP_1348:
+				case ObjectID.TREE_STUMP_1349:
+				case ObjectID.TREE_STUMP_1350:
+				case ObjectID.TREE_STUMP_1351:
+				case ObjectID.TREE_STUMP_1352:
+				case ObjectID.TREE_STUMP_1353:
+				case ObjectID.TREE_STUMP_1354:
+				case ObjectID.TREE_STUMP_1355:
+				case ObjectID.TREE_STUMP_1356: // oak
+				case ObjectID.TREE_STUMP_1357:
+				case ObjectID.TREE_STUMP_1358:
+				case ObjectID.TREE_STUMP_1359:
+				case ObjectID.TREE_STUMP_2310:
+				case ObjectID.TREE_STUMP_2891:
+				case ObjectID.ACHEY_TREE_STUMP:
+				case ObjectID.DYING_TREE_STUMP:
+				case ObjectID.TREE_STUMP_3880:
+				case ObjectID.TREE_STUMP_3884:
+				case ObjectID.TREE_STUMP_4061:
+				case ObjectID.TREE_STUMP_4328:
+				case ObjectID.TREE_STUMP_4329:
+				case ObjectID.JUNGLE_TREE_STUMP:
+				case ObjectID.JUNGLE_TREE_STUMP_4821:
+				case ObjectID.TREE_STUMP_4822:
+				case ObjectID.TREE_STUMP_5905:
+				case ObjectID.TREE_STUMP_6212:
+				case ObjectID.APPLE_TREE_STUMP:
+				case ObjectID.BANANA_TREE_STUMP:
+				case ObjectID.CURRY_TREE_STUMP:
+				case ObjectID.ORANGE_TREE_STUMP:
+				case ObjectID.PALM_TREE_STUMP:
+				case ObjectID.PAPAYA_TREE_STUMP:
+				case ObjectID.SPIRIT_TREE_STUMP:
+				case ObjectID.MAGIC_TREE_STUMP:
+				case ObjectID.TREE_STUMP_8445:
+				case ObjectID.OAK_TREE_STUMP:
+				case ObjectID.WILLOW_TREE_STUMP:
+				case ObjectID.YEW_TREE_STUMP:
+				case ObjectID.TREE_STUMP_9035:
+				case ObjectID.TREE_STUMP_9037:
+				case ObjectID.TREE_STUMP_9471: // willow
+				case ObjectID.TREE_STUMP_9661:
+				case ObjectID.TREE_STUMP_9711:
+				case ObjectID.TREE_STUMP_9712:
+				case ObjectID.TREE_STUMP_9713:
+				case ObjectID.TREE_STUMP_9714: // yew
+				case ObjectID.TREE_STUMP_10057:
+				case ObjectID.TREE_STUMP_12894:
+				case ObjectID.TREE_STUMP_14516:
+				case ObjectID.TREE_STUMP_14517:
+				case ObjectID.TREE_STUMP_14567:
+				case ObjectID.TREE_STUMP_14596:
+				case ObjectID.TREE_STUMP_14638:
+				case ObjectID.TREE_STUMP_14667:
+				case ObjectID.TREE_STUMP_14697:
+				case ObjectID.TREE_STUMP_16266:
+				case ObjectID.DREAM_TREE_STUMP:
+				case ObjectID.TREE_STUMP_21274:
+				case ObjectID.TREE_STUMP_23054:
+				case ObjectID.TREE_STUMP_25186:
+				case ObjectID.TREE_STUMP_26834:
+				case ObjectID.TREE_STUMP_27061:
+				case ObjectID.MAHOGANY_TREE_STUMP:
+				case ObjectID.TREE_STUMP_30446:
+				case ObjectID.DEAD_TREE_STUMP:
+				case ObjectID.DEAD_TREE_STUMP_30856:
+				case ObjectID.TREE_STUMP_33583:
+				case ObjectID.TREE_STUMP_33584:
+				case ObjectID.CELASTRUS_TREE_STUMP:
+				case ObjectID.DRAGONFRUIT_TREE_STUMP:
+				case ObjectID.TREE_STUMP_36673:
+				case ObjectID.TREE_STUMP_36675:
+				case ObjectID.TREE_STUMP_36678:
+				case ObjectID.TREE_STUMP_36680:
+				case ObjectID.TREE_STUMP_36684:
+				case ObjectID.TREE_STUMP_36687:
+				case ObjectID.TREE_STUMP_36689:
+				case ObjectID.TREE_STUMP_40751:
+				case ObjectID.TREE_STUMP_40753:
+				case ObjectID.TREE_STUMP_40757:
+				case ObjectID.TREE_STUMP_40759:
+				case ObjectID.TREE_STUMP_40761:
+				case ObjectID.TREE_STUMP_42392:
+				case ObjectID.TREE_STUMP_42394:
+				case ObjectID.TREE_STUMP_42396:
+				case ObjectID.TREE_STUMP_46582:
+				case ObjectID.TREE_STUMP_46583:
+				case ObjectID.TREE_STUMP_50035:
+
+				// depleted redwood
+				case ObjectID.REDWOOD_TREE_29669:
+				case ObjectID.REDWOOD_TREE_29670:
+				case ObjectID.REDWOOD_TREE_29671:
+
+				// farming guild redwood
+				case NullObjectID.NULL_34633:
+				case NullObjectID.NULL_34635:
+				case NullObjectID.NULL_34637:
+				case NullObjectID.NULL_34639:
+				{
+					WorldPoint worldPoint = new WorldPoint((locCoord >>> 14) & 0x3FFF, locCoord & 0x3FFF, (locCoord >>> 28) & 0x3);
+					ObjectComposition obj = client.getObjectDefinition(locId);
+
+					TreeRespawn treeRespawn = new TreeRespawn(worldPoint, obj.getSizeX() - 1, obj.getSizeY() - 1, Instant.now(), ticks * Constants.GAME_TICK_LENGTH);
+					respawns.add(treeRespawn);
+				}
+			}
+		}
+	}
+
 	@Subscribe
 	public void onGameStateChanged(final GameStateChanged event)
 	{
@@ -437,18 +571,12 @@ public class WoodcuttingPlugin extends Plugin
 				entlings.clear();
 				// fallthrough
 			case LOADING:
-				treeObjects.clear();
+				redwoods.clear();
 				roots.clear();
 				saplingIngredients.clear();
 				Arrays.fill(saplingOrder, null);
 				pheasantNests.clear();
 				break;
-			case LOGGED_IN:
-				// After login trees that are depleted will be changed,
-				// wait for the next game tick before watching for
-				// trees to despawn
-				recentlyLoggedIn = true;
-				break;
 		}
 	}
 
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingSceneOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingSceneOverlay.java
index d2cae6a74..aecf33a92 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingSceneOverlay.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingSceneOverlay.java
@@ -38,7 +38,6 @@ import net.runelite.api.Client;
 import net.runelite.api.GameObject;
 import net.runelite.api.ItemID;
 import net.runelite.api.NPC;
-import net.runelite.api.ObjectComposition;
 import net.runelite.api.ObjectID;
 import net.runelite.api.Perspective;
 import net.runelite.api.Point;
@@ -298,17 +297,10 @@ class WoodcuttingSceneOverlay extends Overlay
 			return;
 		}
 
-		for (GameObject treeObject : plugin.getTreeObjects())
+		for (GameObject treeObject : plugin.getRedwoods())
 		{
 			if (treeObject.getWorldLocation().distanceTo(client.getLocalPlayer().getWorldLocation()) <= 12)
 			{
-				// Redwood trees at the farming guild are multilocs rather than global objects synced for all players
-				// so we must handle them here rather than relying on GameObjectSpawned events
-				final ObjectComposition treeComp = client.getObjectDefinition(treeObject.getId());
-				if (treeComp.getImpostorIds() != null && Tree.findTree(treeComp.getImpostor().getId()) == null)
-				{
-					continue;
-				}
 				OverlayUtil.renderImageLocation(client, graphics, treeObject.getLocalLocation(), itemManager.getImage(ItemID.REDWOOD_LOGS), 120);
 			}
 		}
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldHopperPingOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldHopperPingOverlay.java
index 7c0b43836..cfbfad051 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldHopperPingOverlay.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldHopperPingOverlay.java
@@ -35,7 +35,6 @@ import net.runelite.api.widgets.Widget;
 import net.runelite.client.ui.overlay.Overlay;
 import net.runelite.client.ui.overlay.OverlayLayer;
 import net.runelite.client.ui.overlay.OverlayPosition;
-import net.runelite.client.ui.overlay.OverlayPriority;
 import net.runelite.client.ui.overlay.OverlayUtil;
 
 class WorldHopperPingOverlay extends Overlay
@@ -54,7 +53,7 @@ class WorldHopperPingOverlay extends Overlay
 		this.worldHopperPlugin = worldHopperPlugin;
 		this.worldHopperConfig = worldHopperConfig;
 		setLayer(OverlayLayer.ABOVE_WIDGETS);
-		setPriority(OverlayPriority.HIGH);
+		setPriority(PRIORITY_HIGH);
 		setPosition(OverlayPosition.DYNAMIC);
 	}
 
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/TeleportLocationData.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/TeleportLocationData.java
index 556fadb6d..4212cbcc1 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/TeleportLocationData.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/TeleportLocationData.java
@@ -37,12 +37,12 @@ enum TeleportLocationData
 	FALADOR(TeleportType.NORMAL_MAGIC, "Falador", 37, new WorldPoint(2965, 3381, 0), "falador_teleport_icon.png"),
 	CAMELOT(TeleportType.NORMAL_MAGIC, "Camelot", 45, new WorldPoint(2757, 3477, 0), "camelot_teleport_icon.png"),
 	CAMELOT_BANK(TeleportType.NORMAL_MAGIC, "Camelot Bank", 45, new WorldPoint(2726, 3485, 0), "camelot_teleport_icon.png"),
+	KOUREND(TeleportType.NORMAL_MAGIC, "Kourend", 48, new WorldPoint(1643, 3672, 0), "kourend_teleport_icon.png"),
 	ARDOUGNE(TeleportType.NORMAL_MAGIC, "Ardougne", 51, new WorldPoint(2664, 3306, 0), "ardougne_teleport_icon.png"),
 	WATCHTOWER(TeleportType.NORMAL_MAGIC, "Watchtower", 58, new WorldPoint(2547, 3114, 0), "watchtower_teleport_icon.png"),
 	WATCHTOWER_YANILLE(TeleportType.NORMAL_MAGIC, "Watchtower Yanille", 58, new WorldPoint(2584, 3097, 0), "watchtower_teleport_icon.png"),
 	TROLLHEIM(TeleportType.NORMAL_MAGIC, "Trollheim", 61, new WorldPoint(2891, 3678, 0), "trollheim_teleport_icon.png"),
 	APE_ATOLL(TeleportType.NORMAL_MAGIC, "Ape Atoll", 64, new WorldPoint(2796, 2791, 0), "ape_atoll_teleport_icon.png"),
-	KOUREND(TeleportType.NORMAL_MAGIC, "Kourend", 69, new WorldPoint(1643, 3672, 0), "kourend_teleport_icon.png"),
 	PADDEWWA(TeleportType.ANCIENT_MAGICKS, "Paddewwa", 54, new WorldPoint(3097, 9880, 0), "paddewwa_teleport_icon.png"),
 	SENNTISTEN(TeleportType.ANCIENT_MAGICKS, "Senntisten", 60, new WorldPoint(3319, 3336, 0), "senntisten_teleport_icon.png"),
 	KHARYRLL(TeleportType.ANCIENT_MAGICKS, "Kharyrll", 66, new WorldPoint(3494, 3473, 0), "kharyrll_teleport_icon.png"),
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/zalcano/ZalcanoOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/zalcano/ZalcanoOverlay.java
index e9541d947..073b968cc 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/zalcano/ZalcanoOverlay.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/zalcano/ZalcanoOverlay.java
@@ -38,7 +38,6 @@ import net.runelite.api.coords.LocalPoint;
 import net.runelite.client.ui.overlay.Overlay;
 import net.runelite.client.ui.overlay.OverlayLayer;
 import net.runelite.client.ui.overlay.OverlayPosition;
-import net.runelite.client.ui.overlay.OverlayPriority;
 import net.runelite.client.ui.overlay.OverlayUtil;
 
 class ZalcanoOverlay extends Overlay
@@ -53,7 +52,7 @@ class ZalcanoOverlay extends Overlay
 		this.zalcanoPlugin = zalcanoPlugin;
 		setPosition(OverlayPosition.DYNAMIC);
 		setLayer(OverlayLayer.ABOVE_SCENE);
-		setPriority(OverlayPriority.MED);
+		setPriority(PRIORITY_MED);
 	}
 
 	@Override
diff --git a/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java b/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java
index cd913f39b..86e8e8f34 100644
--- a/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java
+++ b/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java
@@ -1156,7 +1156,8 @@ public class ClientUI
 			return;
 		}
 
-		if (frame.getGraphicsConfiguration().getDevice().getFullScreenWindow() == null)
+		if (frame.getGraphicsConfiguration().getDevice().getFullScreenWindow() == null
+			&& !safeMode)
 		{
 			frame.setOpacity(config.windowOpacity() / 100.0f);
 		}
diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/Overlay.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/Overlay.java
index 7fb40723a..e1f2abce8 100644
--- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/Overlay.java
+++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/Overlay.java
@@ -47,6 +47,12 @@ import net.runelite.client.ui.overlay.components.LayoutableRenderableEntity;
 @Setter
 public abstract class Overlay implements LayoutableRenderableEntity
 {
+	public static final float PRIORITY_LOW = 0f;
+	public static final float PRIORITY_DEFAULT = 0.25f;
+	public static final float PRIORITY_MED = 0.5f;
+	public static final float PRIORITY_HIGH = 0.75f;
+	public static final float PRIORITY_HIGHEST = 1f;
+
 	@Nullable
 	private final Plugin plugin;
 	private Point preferredLocation;
@@ -54,7 +60,11 @@ public abstract class Overlay implements LayoutableRenderableEntity
 	private OverlayPosition preferredPosition;
 	private Rectangle bounds = new Rectangle();
 	private OverlayPosition position = OverlayPosition.TOP_LEFT;
-	private OverlayPriority priority = OverlayPriority.NONE;
+	/**
+	 * The overlay priority, which determines the order the overlay renders in relative
+	 * to other overlays.
+	 */
+	private float priority = PRIORITY_DEFAULT;
 	private OverlayLayer layer = OverlayLayer.UNDER_WIDGETS;
 	private final List<Integer> drawHooks = new ArrayList<>();
 	private final List<OverlayMenuEntry> menuEntries = new ArrayList<>();
@@ -92,6 +102,33 @@ public abstract class Overlay implements LayoutableRenderableEntity
 		this.plugin = plugin;
 	}
 
+	public void setPriority(float priority)
+	{
+		this.priority = priority;
+	}
+
+	public void setPriority(OverlayPriority overlayPriority)
+	{
+		switch (overlayPriority)
+		{
+			case LOW:
+				priority = PRIORITY_LOW;
+				break;
+			case NONE:
+				priority = PRIORITY_DEFAULT;
+				break;
+			case MED:
+				priority = PRIORITY_MED;
+				break;
+			case HIGH:
+				priority = PRIORITY_HIGH;
+				break;
+			case HIGHEST:
+				priority = PRIORITY_HIGHEST;
+				break;
+		}
+	}
+
 	/**
 	 * Overlay name, used for saving the overlay, needs to be unique
 	 *
diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayManager.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayManager.java
index 3439b857a..e1a4b9e92 100644
--- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayManager.java
+++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayManager.java
@@ -81,8 +81,8 @@ public class OverlayManager
 		// draw *earlier* so that they are closer to their
 		// defined position.
 		return aPos == OverlayPosition.DYNAMIC || aPos == OverlayPosition.DETACHED
-			? a.getPriority().compareTo(b.getPriority())
-			: b.getPriority().compareTo(a.getPriority());
+			? Float.compare(a.getPriority(), b.getPriority())
+			: Float.compare(b.getPriority(), a.getPriority());
 	};
 
 	/**
diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayPriority.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayPriority.java
index 95c7cb996..dd29049f9 100644
--- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayPriority.java
+++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayPriority.java
@@ -24,6 +24,10 @@
  */
 package net.runelite.client.ui.overlay;
 
+/**
+ * @deprecated use floating point overlay priorities instead
+ */
+@Deprecated
 public enum OverlayPriority
 {
 	LOW,
diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/WidgetItemOverlay.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/WidgetItemOverlay.java
index 8109ea3f0..b594a9ff5 100644
--- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/WidgetItemOverlay.java
+++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/WidgetItemOverlay.java
@@ -44,7 +44,7 @@ public abstract class WidgetItemOverlay extends Overlay
 	protected WidgetItemOverlay()
 	{
 		super.setPosition(OverlayPosition.DYNAMIC);
-		super.setPriority(OverlayPriority.LOW);
+		super.setPriority(PRIORITY_LOW);
 		super.setLayer(OverlayLayer.MANUAL);
 	}
 
@@ -143,6 +143,12 @@ public abstract class WidgetItemOverlay extends Overlay
 		throw new IllegalStateException();
 	}
 
+	@Override
+	public void setPriority(float priority)
+	{
+		throw new IllegalStateException();
+	}
+
 	@Override
 	public void setPriority(OverlayPriority priority)
 	{
diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/WidgetOverlay.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/WidgetOverlay.java
index 37cae7f85..6b4b6d0fd 100644
--- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/WidgetOverlay.java
+++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/WidgetOverlay.java
@@ -118,10 +118,10 @@ public class WidgetOverlay extends Overlay
 
 	private WidgetOverlay(final Client client, @Component final int componentId, final String name, final OverlayPosition overlayPosition)
 	{
-		this(client, componentId, name, overlayPosition, OverlayPriority.HIGHEST);
+		this(client, componentId, name, overlayPosition, Overlay.PRIORITY_HIGHEST);
 	}
 
-	private WidgetOverlay(final Client client, @Component final int componentId, final String name, final OverlayPosition overlayPosition, final OverlayPriority overlayPriority)
+	private WidgetOverlay(final Client client, @Component final int componentId, final String name, final OverlayPosition overlayPosition, final float overlayPriority)
 	{
 		this.client = client;
 		this.componentId = componentId;
diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/tooltip/TooltipOverlay.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/tooltip/TooltipOverlay.java
index 904c00040..ebc897fe7 100644
--- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/tooltip/TooltipOverlay.java
+++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/tooltip/TooltipOverlay.java
@@ -37,7 +37,6 @@ import net.runelite.client.config.TooltipPositionType;
 import net.runelite.client.ui.overlay.Overlay;
 import net.runelite.client.ui.overlay.OverlayLayer;
 import net.runelite.client.ui.overlay.OverlayPosition;
-import net.runelite.client.ui.overlay.OverlayPriority;
 import net.runelite.client.ui.overlay.components.LayoutableRenderableEntity;
 import net.runelite.client.ui.overlay.components.PanelComponent;
 import net.runelite.client.ui.overlay.components.TooltipComponent;
@@ -60,7 +59,7 @@ public class TooltipOverlay extends Overlay
 		this.tooltipManager = tooltipManager;
 		this.runeLiteConfig = runeLiteConfig;
 		setPosition(OverlayPosition.TOOLTIP);
-		setPriority(OverlayPriority.HIGHEST);
+		setPriority(PRIORITY_HIGHEST);
 		setLayer(OverlayLayer.ABOVE_WIDGETS);
 		// additionally allow tooltips above the full screen world map and welcome screen
 		drawAfterInterface(InterfaceID.FULLSCREEN_CONTAINER_TLI);
diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/worldmap/WorldMapOverlay.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/worldmap/WorldMapOverlay.java
index 23e0a6c8f..388cd37d3 100644
--- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/worldmap/WorldMapOverlay.java
+++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/worldmap/WorldMapOverlay.java
@@ -51,7 +51,6 @@ import net.runelite.client.ui.JagexColors;
 import net.runelite.client.ui.overlay.Overlay;
 import net.runelite.client.ui.overlay.OverlayLayer;
 import net.runelite.client.ui.overlay.OverlayPosition;
-import net.runelite.client.ui.overlay.OverlayPriority;
 import net.runelite.client.util.ColorUtil;
 
 @Singleton
@@ -80,7 +79,7 @@ public class WorldMapOverlay extends Overlay
 		this.client = client;
 		this.worldMapPointManager = worldMapPointManager;
 		setPosition(OverlayPosition.DYNAMIC);
-		setPriority(OverlayPriority.HIGHEST);
+		setPriority(PRIORITY_HIGHEST);
 		setLayer(OverlayLayer.MANUAL);
 		drawAfterInterface(InterfaceID.WORLD_MAP);
 	}


Test patch:
diff --git a/runelite-client/src/test/java/net/runelite/client/ui/overlay/OverlayManagerTest.java b/runelite-client/src/test/java/net/runelite/client/ui/overlay/OverlayManagerTest.java
index af1accea5..2afac6282 100644
--- a/runelite-client/src/test/java/net/runelite/client/ui/overlay/OverlayManagerTest.java
+++ b/runelite-client/src/test/java/net/runelite/client/ui/overlay/OverlayManagerTest.java
@@ -37,7 +37,7 @@ public class OverlayManagerTest
 {
 	class TestOverlay extends Overlay
 	{
-		TestOverlay(OverlayPosition position, OverlayPriority priority)
+		TestOverlay(OverlayPosition position, float priority)
 		{
 			setPosition(position);
 			setPriority(priority);
@@ -86,8 +86,8 @@ public class OverlayManagerTest
 	public void testSort()
 	{
 		// High priorities overlays render first
-		Overlay tlh = new TestOverlay(OverlayPosition.TOP_LEFT, OverlayPriority.HIGH);
-		Overlay tll = new TestOverlay(OverlayPosition.TOP_LEFT, OverlayPriority.LOW);
+		Overlay tlh = new TestOverlay(OverlayPosition.TOP_LEFT, Overlay.PRIORITY_HIGH);
+		Overlay tll = new TestOverlay(OverlayPosition.TOP_LEFT, Overlay.PRIORITY_LOW);
 		List<Overlay> overlays = Arrays.asList(tlh, tll);
 		overlays.sort(OverlayManager.OVERLAY_COMPARATOR);
 		assertEquals(tlh, overlays.get(0));
@@ -98,8 +98,8 @@ public class OverlayManagerTest
 	public void testSortDynamic()
 	{
 		// Dynamic overlays render before static overlays
-		Overlay tlh = new TestOverlay(OverlayPosition.TOP_LEFT, OverlayPriority.HIGH);
-		Overlay dyn = new TestOverlay(OverlayPosition.DYNAMIC, OverlayPriority.HIGH);
+		Overlay tlh = new TestOverlay(OverlayPosition.TOP_LEFT, Overlay.PRIORITY_HIGH);
+		Overlay dyn = new TestOverlay(OverlayPosition.DYNAMIC, Overlay.PRIORITY_HIGH);
 		List<Overlay> overlays = Arrays.asList(tlh, dyn);
 		overlays.sort(OverlayManager.OVERLAY_COMPARATOR);
 		assertEquals(dyn, overlays.get(0));
@@ -110,9 +110,9 @@ public class OverlayManagerTest
 	public void testTooltips()
 	{
 		// Tooltip overlay renders after everything
-		Overlay t = new TestOverlay(OverlayPosition.TOOLTIP, OverlayPriority.HIGH);
-		Overlay dyn = new TestOverlay(OverlayPosition.DYNAMIC, OverlayPriority.HIGH);
-		Overlay tlh = new TestOverlay(OverlayPosition.TOP_LEFT, OverlayPriority.HIGH);
+		Overlay t = new TestOverlay(OverlayPosition.TOOLTIP, Overlay.PRIORITY_HIGH);
+		Overlay dyn = new TestOverlay(OverlayPosition.DYNAMIC, Overlay.PRIORITY_HIGH);
+		Overlay tlh = new TestOverlay(OverlayPosition.TOP_LEFT, Overlay.PRIORITY_HIGH);
 		List<Overlay> overlays = Arrays.asList(t, dyn, tlh);
 		overlays.sort(OverlayManager.OVERLAY_COMPARATOR);
 		assertEquals(dyn, overlays.get(0));