Repository: runelite/runelite
Pull request #17820 (2024-05-09 00:14:13)

agility: add missing shortcuts & fix existing ones
This PR among others...
- Adds the new project rebalance shortcuts
- Fixes the shortcuts changed in project rebalance
  - Jagex did move the DRAYNOR_UNDERWALL_TUNNEL shortcut south (to 3068, 3257) but they forgot to move the minimap icon...
- Adds/fixes miscellaneous shortcuts that were missing or incorrect
  - Ice dungeon basic shortcut
  - Nature grotto bridge (Swampletics)
  - Yanille climbing rocks
  - Kourend catacombs (name, for one shortcut object id)
  - Temple of the eye rubble
  - Slayer tower spikey chain (name)
  - Jagged wall (shaman/viyeldi cave)
  - Viyeldi cave rock slide
  - Viyeldi cave rock climb (91 agility)
  - Ungael ice (missing ids when inside Vorkath's arena, worldpoint)

New project rebalance shortcuts:
![afbeelding](https://github.com/runelite/runelite/assets/7929021/4c2b12d8-1b31-4e07-9afc-03b5560d64fd)

Changed project rebalance shortcuts:
![afbeelding](https://github.com/runelite/runelite/assets/7929021/d278b263-5db0-4af6-aba3-3c8f50914fee)
(No changes to the draynor one as noted above)


Patch:
diff --git a/cache/pom.xml b/cache/pom.xml
index f8ba078fa..4ac1161f2 100644
--- a/cache/pom.xml
+++ b/cache/pom.xml
@@ -29,7 +29,7 @@
 	<parent>
 		<groupId>net.runelite</groupId>
 		<artifactId>runelite-parent</artifactId>
-		<version>1.10.29-SNAPSHOT</version>
+		<version>1.10.30-SNAPSHOT</version>
 	</parent>
 
 	<artifactId>cache</artifactId>
diff --git a/pom.xml b/pom.xml
index 4c3ecc48c..efb43013f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -28,7 +28,7 @@
 
 	<groupId>net.runelite</groupId>
 	<artifactId>runelite-parent</artifactId>
-	<version>1.10.29-SNAPSHOT</version>
+	<version>1.10.30-SNAPSHOT</version>
 	<packaging>pom</packaging>
 
 	<name>RuneLite</name>
diff --git a/runelite-api/pom.xml b/runelite-api/pom.xml
index 2d47de52f..36fb2262d 100644
--- a/runelite-api/pom.xml
+++ b/runelite-api/pom.xml
@@ -29,7 +29,7 @@
 	<parent>
 		<groupId>net.runelite</groupId>
 		<artifactId>runelite-parent</artifactId>
-		<version>1.10.29-SNAPSHOT</version>
+		<version>1.10.30-SNAPSHOT</version>
 	</parent>
 
 	<artifactId>runelite-api</artifactId>
diff --git a/runelite-api/src/main/interfaces/interfaces.toml b/runelite-api/src/main/interfaces/interfaces.toml
index 5b6ff84e9..0a6403ac3 100644
--- a/runelite-api/src/main/interfaces/interfaces.toml
+++ b/runelite-api/src/main/interfaces/interfaces.toml
@@ -558,7 +558,9 @@ worldmap_options=53
 
 [mlm]
 id=382
-container=0
+layer=3
+sack_size_text=5
+space_text=6
 
 [moons_of_peril]
 id=869
diff --git a/runelite-api/src/main/java/net/runelite/api/Client.java b/runelite-api/src/main/java/net/runelite/api/Client.java
index 6aef7976c..4556e7291 100644
--- a/runelite-api/src/main/java/net/runelite/api/Client.java
+++ b/runelite-api/src/main/java/net/runelite/api/Client.java
@@ -172,6 +172,14 @@ public interface Client extends OAuthApi, GameEngine
 	 */
 	void stopNow();
 
+	/**
+	 * Gets the display name of the active account when launched from the Jagex launcher.
+	 *
+	 * @return The active account's display name, or {@code null} if not launched from the Jagex launcher
+	 */
+	@Nullable
+	String getLauncherDisplayName();
+
 	/**
 	 * DEPRECATED. See getAccountHash instead.
 	 * Gets the current logged in username.
diff --git a/runelite-api/src/main/java/net/runelite/api/ScriptID.java b/runelite-api/src/main/java/net/runelite/api/ScriptID.java
index 062ae1a9c..77f1f1583 100644
--- a/runelite-api/src/main/java/net/runelite/api/ScriptID.java
+++ b/runelite-api/src/main/java/net/runelite/api/ScriptID.java
@@ -455,4 +455,7 @@ public final class ScriptID
 
 	@ScriptArguments(integer = 12, string = 2)
 	public static final int MAGIC_SPELLBOOK_INITIALISESPELLS = 2616;
+
+	@ScriptArguments(integer = 2)
+	public static final int MOTHERLODE_HUD_UPDATE = 1634;
 }
diff --git a/runelite-api/src/main/java/net/runelite/api/Varbits.java b/runelite-api/src/main/java/net/runelite/api/Varbits.java
index 2384a2c96..4cc3e37d4 100644
--- a/runelite-api/src/main/java/net/runelite/api/Varbits.java
+++ b/runelite-api/src/main/java/net/runelite/api/Varbits.java
@@ -369,11 +369,11 @@ public final class Varbits
 	/**
 	 * Blast Mine
 	 */
-	public static final int BLAST_MINE_COAL = 4924;
-	public static final int BLAST_MINE_GOLD = 4925;
-	public static final int BLAST_MINE_MITHRIL = 4926;
-	public static final int BLAST_MINE_ADAMANTITE = 4921;
-	public static final int BLAST_MINE_RUNITE = 4922;
+	public static final int BLAST_MINE_COAL = 10698;
+	public static final int BLAST_MINE_GOLD = 10699;
+	public static final int BLAST_MINE_MITHRIL = 10700;
+	public static final int BLAST_MINE_ADAMANTITE = 10701;
+	public static final int BLAST_MINE_RUNITE = 10702;
 
 	/**
 	 * Raids
diff --git a/runelite-client/pom.xml b/runelite-client/pom.xml
index c29a8a6b7..470f5e7df 100644
--- a/runelite-client/pom.xml
+++ b/runelite-client/pom.xml
@@ -29,7 +29,7 @@
 	<parent>
 		<groupId>net.runelite</groupId>
 		<artifactId>runelite-parent</artifactId>
-		<version>1.10.29-SNAPSHOT</version>
+		<version>1.10.30-SNAPSHOT</version>
 	</parent>
 
 	<artifactId>client</artifactId>
diff --git a/runelite-client/src/main/java/net/runelite/client/config/ConfigManager.java b/runelite-client/src/main/java/net/runelite/client/config/ConfigManager.java
index 9a832af12..32af957dc 100644
--- a/runelite-client/src/main/java/net/runelite/client/config/ConfigManager.java
+++ b/runelite-client/src/main/java/net/runelite/client/config/ConfigManager.java
@@ -538,22 +538,72 @@ public class ConfigManager
 				}
 
 				log.info("Profile '{}' (sync: {}, active: {}, id: {})", p.getName(), p.isSync(), p.isActive(), p.getId());
+			}
+
+			if (rsProfile == null)
+			{
+				rsProfile = lock.createProfile(RSPROFILE_NAME, RSPROFILE_ID);
+			}
+			rsProfile.setSync(true);
 
-				// --profile
-				if (configProfileName != null)
+			// synced rsprofile need to be fetched if outdated
+			syncRemote(lock, rsProfile, remoteProfiles);
+
+			this.rsProfile = rsProfile;
+			rsProfileConfigProfile = new ConfigData(ProfileManager.profileConfigFile(rsProfile));
+
+			final String launcherDisplayName = client != null ? client.getLauncherDisplayName() : null;
+			// --profile
+			if (configProfileName != null)
+			{
+				profile = lock.findProfile(p -> !p.isInternal() && configProfileName.equals(p.getName()));
+			}
+			else
+			{
+				// select a config profile associated with the display name from the jagex launcher, if available
+				if (launcherDisplayName != null)
 				{
-					if (p.getName().equals(configProfileName))
+					profile = lock.findProfile(p ->
 					{
-						profile = p;
-					}
+						if (p.isInternal())
+						{
+							return false;
+						}
+
+						final List<String> defaultRsProfilesForProfile = p.getDefaultForRsProfiles();
+						if (defaultRsProfilesForProfile == null)
+						{
+							return false;
+						}
+
+						// Calling getConfiguration before a profile has been loaded is usually invalid. Because
+						// rsProfile is loaded above before this is run and we are only attempting to load rsProfile
+						// keys, it is safe to be called.
+						for (final String defaultRsProfile : defaultRsProfilesForProfile)
+						{
+							final RuneScapeProfileType rsProfileType = getConfiguration(RSPROFILE_GROUP, defaultRsProfile, RSPROFILE_TYPE, RuneScapeProfileType.class);
+							if (rsProfileType != RuneScapeProfileType.STANDARD)
+							{
+								continue;
+							}
+
+							final String profileDisplayName = getConfiguration(RSPROFILE_GROUP, defaultRsProfile, RSPROFILE_DISPLAY_NAME);
+							if (launcherDisplayName.equals(profileDisplayName))
+							{
+								return true;
+							}
+						}
+
+						return false;
+					});
 				}
-				else if (p.isActive())
+				if (profile == null)
 				{
-					profile = p;
+					profile = lock.findProfile(p -> !p.isInternal() && p.isActive());
 				}
-				else if (profile == null)
+				if (profile == null)
 				{
-					profile = p;
+					profile = lock.findProfile(p -> !p.isInternal());
 				}
 			}
 
@@ -574,20 +624,11 @@ public class ConfigManager
 				log.info("Creating profile: {} ({})", profile.getName(), profile.getId());
 			}
 
-			if (rsProfile == null)
-			{
-				rsProfile = lock.createProfile(RSPROFILE_NAME, RSPROFILE_ID);
-			}
-			rsProfile.setSync(true);
-
-			// synced profiles need to be fetched if outdated
+			// synced profile need to be fetched if outdated
 			syncRemote(lock, profile, remoteProfiles);
-			syncRemote(lock, rsProfile, remoteProfiles);
 
 			this.profile = profile;
-			this.rsProfile = rsProfile;
 			configProfile = new ConfigData(ProfileManager.profileConfigFile(profile));
-			rsProfileConfigProfile = new ConfigData(ProfileManager.profileConfigFile(rsProfile));
 		}
 
 		eventBus.post(new ProfileChanged());
diff --git a/runelite-client/src/main/java/net/runelite/client/config/ProfileManager.java b/runelite-client/src/main/java/net/runelite/client/config/ProfileManager.java
index 8947eb3c0..3ff6d180a 100644
--- a/runelite-client/src/main/java/net/runelite/client/config/ProfileManager.java
+++ b/runelite-client/src/main/java/net/runelite/client/config/ProfileManager.java
@@ -41,6 +41,7 @@ import java.nio.file.StandardCopyOption;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.function.Predicate;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import lombok.RequiredArgsConstructor;
@@ -164,21 +165,19 @@ public class ProfileManager
 
 		public ConfigProfile findProfile(String name)
 		{
-			for (ConfigProfile configProfile : profiles)
-			{
-				if (configProfile.getName().equals(name))
-				{
-					return configProfile;
-				}
-			}
-			return null;
+			return findProfile((profile) -> profile.getName().equals(name));
 		}
 
 		public ConfigProfile findProfile(long id)
 		{
-			for (ConfigProfile configProfile : profiles)
+			return findProfile((profile) -> profile.getId() == id);
+		}
+
+		public ConfigProfile findProfile(Predicate<ConfigProfile> condition)
+		{
+			for (ConfigProfile configProfile: profiles)
 			{
-				if (configProfile.getId() == id)
+				if (condition.test(configProfile))
 				{
 					return configProfile;
 				}
diff --git a/runelite-client/src/main/java/net/runelite/client/game/AgilityShortcut.java b/runelite-client/src/main/java/net/runelite/client/game/AgilityShortcut.java
index 8fb9292f6..875891349 100644
--- a/runelite-client/src/main/java/net/runelite/client/game/AgilityShortcut.java
+++ b/runelite-client/src/main/java/net/runelite/client/game/AgilityShortcut.java
@@ -45,7 +45,10 @@ import static net.runelite.api.NullObjectID.NULL_33327;
 import static net.runelite.api.NullObjectID.NULL_33328;
 import static net.runelite.api.NullObjectID.NULL_39541;
 import static net.runelite.api.NullObjectID.NULL_39542;
+import static net.runelite.api.NullObjectID.NULL_40960;
+import static net.runelite.api.NullObjectID.NULL_40962;
 import static net.runelite.api.NullObjectID.NULL_43840;
+import static net.runelite.api.NullObjectID.NULL_47325;
 import static net.runelite.api.ObjectID.*;
 import net.runelite.api.TileObject;
 import net.runelite.api.coords.WorldPoint;
@@ -89,7 +92,11 @@ public enum AgilityShortcut
 			// Trollweiss Mountain Cave
 			ROCKY_HANDHOLDS, ROCKY_HANDHOLDS_19847,
 			// Witchaven Dungeon
-			SHORTCUT),
+			SHORTCUT,
+			// Nature Grotto bridge
+			BRIDGE_3522,
+			// Rocky Ledges Viyeldi cave
+			ROCKY_LEDGE, ROCKY_LEDGE_2960, ROCKY_LEDGE_2961, ROCKS_2962, ROCKS_2963, ROCKS_2964),
 	WEISS_BROKEN_FENCE(1, "Shortcut", null, /* base id */ NullObjectID.NULL_46815)
 	{
 		@Override
@@ -108,8 +115,9 @@ public enum AgilityShortcut
 	BRIMHAVEN_DUNGEON_LOG_BALANCE_RETURN(1, "Log Balance", null, LOG_BALANCE_20884),
 	AGILITY_PYRAMID_ROCKS_WEST(1, "Rocks", null, CLIMBING_ROCKS_11948),
 	CAIRN_ISLE_CLIMBING_ROCKS(1, "Rocks", null, CLIMBING_ROCKS),
-	KARAMJA_GLIDER_LOG(1, "Log Balance", new WorldPoint(2906, 3050, 0), A_WOODEN_LOG ),
-	FALADOR_CRUMBLING_WALL(5, "Crumbling Wall", new WorldPoint(2936, 3357, 0), CRUMBLING_WALL_24222 ),
+	KARAMJA_GLIDER_LOG(1, "Log Balance", new WorldPoint(2906, 3050, 0), A_WOODEN_LOG),
+	FALADOR_CRUMBLING_WALL(5, "Crumbling Wall", new WorldPoint(2936, 3357, 0), CRUMBLING_WALL_24222),
+	YANILLE_CLIMBING_ROCKS(5, "Climbing rocks", null, CLIMBING_ROCKS_23543),
 	RIVER_LUM_GRAPPLE_WEST(8, "Grapple Broken Raft", new WorldPoint(3245, 3179, 0), BROKEN_RAFT),
 	RIVER_LUM_GRAPPLE_EAST(8, "Grapple Broken Raft", new WorldPoint(3258, 3179, 0), BROKEN_RAFT),
 	CORSAIR_COVE_ROCKS(10, "Rocks", new WorldPoint(2545, 2871, 0), ROCKS_31757),
@@ -122,8 +130,8 @@ public enum AgilityShortcut
 	EDGEVILLE_DUNGEON_MONKEYBARS(15, "Monkey Bars", null, MONKEYBARS_23566),
 	TROLLHEIM_ROCKS(15, "Rocks", null, new WorldPoint(2838, 3614, 0), ROCKS_3748), // No fixed world map location, but rocks near death plateau have a requirement of 15
 	YANILLE_UNDERWALL_TUNNEL(16, "Underwall Tunnel", new WorldPoint(2574, 3109, 0), HOLE_16520, CASTLE_WALL),
-	KOUREND_CATACOMBS_SOUTH_WEST_CREVICE_NORTH(17, "Crevice", new WorldPoint(1647, 10008, 0), CRACK_28892),
-	KOUREND_CATACOMBS_SOUTH_WEST_CREVICE_SOUTH(17, "Crevice", new WorldPoint(1645, 10001, 0), CRACK_28892),
+	KOUREND_CATACOMBS_SOUTH_WEST_CRACK_NORTH(17, "Crack", new WorldPoint(1647, 10008, 0), CRACK_28892),
+	KOUREND_CATACOMBS_SOUTH_WEST_CRACK_SOUTH(17, "Crack", new WorldPoint(1645, 10001, 0), CRACK_28892),
 	CRABCLAW_CAVES_CREVICE(18, "Crevice", new WorldPoint(1710, 9822, 0), CREVICE_31695, CREVICE_31696),
 	CRABCLAW_CAVES_ROCKS(18, "Rocks", new WorldPoint(1687, 9802, 0), ROCKS_31697),
 	CRABCLAW_CAVES_STEPPING_STONES(18, "Stepping Stones", new WorldPoint(1704, 9800, 0), STEPPING_STONE_31699),
@@ -134,8 +142,8 @@ public enum AgilityShortcut
 	OBSERVATORY_SCALE_CLIFF(23, "Grapple Rocks", new WorldPoint(2447, 3155, 0), NULL_31849, NULL_31852),
 	EAGLES_PEAK_ROCK_CLIMB(25, "Rock Climb", new WorldPoint(2320, 3499, 0), ROCKS_19849),
 	FALADOR_UNDERWALL_TUNNEL(26, "Underwall Tunnel", new WorldPoint(2947, 3313, 0), UNDERWALL_TUNNEL, UNDERWALL_TUNNEL_16528),
-	KOUREND_CATACOMBS_PILLAR_JUMP_NORTH(28, "Pillar Jump", new WorldPoint(1613, 10071, 0)),
-	KOUREND_CATACOMBS_PILLAR_JUMP_SOUTH(28, "Pillar Jump", new WorldPoint(1609, 10060, 0)),
+	KOUREND_CATACOMBS_STONES_NORTH(28, "Stones", new WorldPoint(1613, 10071, 0), STONE_28893),
+	KOUREND_CATACOMBS_STONES_SOUTH(28, "Stones", new WorldPoint(1609, 10060, 0), STONE_28893),
 	MOUNT_KARUULM_LOWER(29, "Rocks", new WorldPoint(1324, 3782, 0), ROCKS_34397),
 	CORSAIR_COVE_RESOURCE_ROCKS(30, "Rocks", new WorldPoint(2486, 2898, 0), ROCKS_31758, ROCKS_31759),
 	SOUTHEAST_KARAJMA_STEPPING_STONES(30, "Stepping Stones", new WorldPoint(2924, 2946, 0), STEPPING_STONES, STEPPING_STONES_23646, STEPPING_STONES_23647),
@@ -144,10 +152,11 @@ public enum AgilityShortcut
 	DRAYNOR_MANOR_STEPPING_STONES(31, "Stepping Stones", new WorldPoint(3150, 3362, 0), STEPPING_STONE_16533),
 	CATHERBY_CLIFFSIDE_GRAPPLE(32, "Grapple Rock", new WorldPoint(2868, 3429, 0), ROCKS_17042),
 	CAIRN_ISLE_ROCKS(32, "Rocks", null, ROCKS_2231),
+	SHILO_VILLAGE_STEPPING_STONES( 32, "Stepping Stones", new WorldPoint(2863, 2974, 0), STEPPING_STONE_16466),
 	ARDOUGNE_LOG_BALANCE(33, "Log Balance", new WorldPoint(2602, 3336, 0), LOG_BALANCE_16546, LOG_BALANCE_16547, LOG_BALANCE_16548),
 	BRIMHAVEN_DUNGEON_MEDIUM_PIPE(34, "Pipe Squeeze", null, new WorldPoint(2698, 9501, 0), PIPE_21727),
-	KOUREND_CATACOMBS_NORTH_EAST_CREVICE_NORTH(34, "Crevice", new WorldPoint(1715, 10057, 0), CRACK_28892),
-	KOUREND_CATACOMBS_NORTH_EAST_CREVICE_SOUTH(34, "Crevice", new WorldPoint(1705, 10077, 0), CRACK_28892),
+	KOUREND_CATACOMBS_NORTH_EAST_CRACK_NORTH(34, "Crack", new WorldPoint(1715, 10057, 0), CRACK_28892),
+	KOUREND_CATACOMBS_NORTH_EAST_CRACK_SOUTH(34, "Crack", new WorldPoint(1705, 10077, 0), CRACK_28892),
 	CATHERBY_OBELISK_GRAPPLE(36, "Grapple Rock", null, CROSSBOW_TREE_17062),
 	GNOME_STRONGHOLD_ROCKS(37, "Rocks", new WorldPoint(2485, 3515, 0), ROCKS_16534, ROCKS_16535),
 	AL_KHARID_MINING_PITCLIFF_SCRAMBLE(38, "Rocks", new WorldPoint(3305, 3315, 0), ROCKS_16549, ROCKS_16550),
@@ -165,6 +174,7 @@ public enum AgilityShortcut
 	DRAYNOR_UNDERWALL_TUNNEL(42, "Underwall Tunnel", new WorldPoint(3068, 3261, 0), UNDERWALL_TUNNEL_19032, UNDERWALL_TUNNEL_19036),
 	TROLLHEIM_MEDIUM_CLIFF_SCRAMBLE_NORTH(43, "Rocks", new WorldPoint(2886, 3684, 0), ROCKS_3803, ROCKS_3804, ROCKS_16522),
 	TROLLHEIM_MEDIUM_CLIFF_SCRAMBLE_SOUTH(43, "Rocks", new WorldPoint(2876, 3666, 0), ROCKS_3803, ROCKS_3804, ROCKS_16522),
+	SLAYER_DUNGEON_CHASM_JUMP(43, "Spiked Blades", new WorldPoint(2770, 10003, 0), STRANGE_FLOOR_16544),
 	TROLLHEIM_ADVANCED_CLIFF_SCRAMBLE(44, "Rocks", new WorldPoint(2907, 3686, 0), ROCKS_16523, ROCKS_3748),
 	KOUREND_RIVER_STEPPING_STONES(45, "Stepping Stones", new WorldPoint(1720, 3551, 0), STEPPING_STONE_29728),
 	TIRANNWN_LOG_BALANCE(45, "Log Balance", null, LOG_BALANCE_3933, LOG_BALANCE_3931, LOG_BALANCE_3930, LOG_BALANCE_3929, LOG_BALANCE_3932),
@@ -177,6 +187,7 @@ public enum AgilityShortcut
 	YANILLE_DUNGEON_PIPE_SQUEEZE(49, "Pipe Squeeze", null, OBSTACLE_PIPE_23140),
 	ARCEUUS_ESSENCE_MINE_BOULDER(49, "Boulder", new WorldPoint(1774, 3888, 0), BOULDER_27990),
 	MORYTANIA_STEPPING_STONE(50, "Stepping Stone", new WorldPoint(3418, 3326, 0), STEPPING_STONE_13504),
+	SHAMAN_CAVES_JAGGED_WALL(50, "Jagged wall", null, JAGGED_WALL),
 	VARROCK_SEWERS_PIPE_SQUEEZE(51, "Pipe Squeeze", new WorldPoint(3152, 9905, 0), OBSTACLE_PIPE_16511),
 	ARCEUUS_ESSENCE_MINE_EAST_SCRAMBLE(52, "Rock Climb", new WorldPoint(1770, 3851, 0), ROCKS_27987, ROCKS_27988),
 	KARAMJA_VOLCANO_GRAPPLE_NORTH(53, "Grapple Rock", new WorldPoint(2873, 3143, 0), STRONG_TREE_17074),
@@ -184,6 +195,9 @@ public enum AgilityShortcut
 	MOTHERLODE_MINE_WALL_EAST(54, "Wall", new WorldPoint(3124, 9703, 0), DARK_TUNNEL_10047),
 	MOTHERLODE_MINE_WALL_WEST(54, "Wall", new WorldPoint(3118, 9702, 0), DARK_TUNNEL_10047),
 	MISCELLANIA_DOCK_STEPPING_STONE(55, "Stepping Stone", new WorldPoint(2572, 3862, 0), STEPPING_STONE_11768),
+	TEMPLE_OF_EYE_RUBBLE(56, "Rubble", null, RUBBLE_43724, RUBBLE_43726),
+	BRIMHAVEN_DUNGEON_EAST_STEPPING_STONES_NORTH(56, "Stepping Stones", new WorldPoint(2685, 9547, 0), STEPPING_STONE_19040),
+	BRIMHAVEN_DUNGEON_EAST_STEPPING_STONES_SOUTH(56, "Stepping Stones", new WorldPoint(2693, 9529, 0), STEPPING_STONE_19040),
 	ISAFDAR_FOREST_OBSTACLES(56, "Trap", null, DENSE_FOREST_3938, DENSE_FOREST_3939, DENSE_FOREST_3998, DENSE_FOREST_3999, DENSE_FOREST, LEAVES, LEAVES_3924, LEAVES_3925, STICKS, TRIPWIRE, TRIPWIRE_3921),
 	RELEKKA_EAST_FENCE(57, "Fence", new WorldPoint(2688, 3697, 0), BROKEN_FENCE),
 	YANILLE_DUNGEON_MONKEY_BARS(57, "Monkey Bars", null, MONKEYBARS_23567),
@@ -194,15 +208,16 @@ public enum AgilityShortcut
 	WILDERNESS_GWD_CLIMB_WEST(60, "Rocks", new WorldPoint(2928, 3760, 0), ROCKY_HANDHOLDS_26400, ROCKY_HANDHOLDS_26401, ROCKY_HANDHOLDS_26402, ROCKY_HANDHOLDS_26404, ROCKY_HANDHOLDS_26405, ROCKY_HANDHOLDS_26406),
 	MOS_LEHARMLESS_STEPPING_STONE(60, "Stepping Stone", new WorldPoint(3710, 2970, 0), STEPPING_STONE_19042),
 	WINTERTODT_GAP(60, "Gap", new WorldPoint(1629, 4023, 0), GAP_29326),
-	UNGAEL_ICE(60, "Ice Chunks", null, NULL_25337, NULL_29868, NULL_29869, NULL_29870, ICE_CHUNKS_31822, NULL_31823, ICE_CHUNKS_31990),
+	UNGAEL_ICE(60, "Ice Chunks", new WorldPoint(2262, 4044, 0), NULL_25337, NULL_29868, NULL_29869, NULL_29870, ICE_CHUNKS_31822, NULL_31823, ICE_CHUNKS_31990, ICE_CHUNKS_47324, NULL_47325),
 	GWD_LITTLE_CRACK(60, "Little Crack", new WorldPoint(2900, 3712, 0), LITTLE_CRACK),
-	SLAYER_TOWER_MEDIUM_CHAIN_FIRST(61, "Spiked Chain (Floor 1)", new WorldPoint(3421, 3550, 0), SPIKEY_CHAIN),
-	SLAYER_TOWER_MEDIUM_CHAIN_SECOND(61, "Spiked Chain (Floor 2)", new WorldPoint(3420, 3551, 0), SPIKEY_CHAIN_16538),
-	SLAYER_DUNGEON_CREVICE(62, "Narrow Crevice", new WorldPoint(2729, 10008, 0), CREVICE_16539),
+	SLAYER_TOWER_MEDIUM_CHAIN_FIRST(61, "Spikey Chain (Floor 1)", new WorldPoint(3421, 3550, 0), SPIKEY_CHAIN),
+	SLAYER_TOWER_MEDIUM_CHAIN_SECOND(61, "Spikey Chain (Floor 2)", new WorldPoint(3420, 3551, 0), SPIKEY_CHAIN_16538),
+	SLAYER_DUNGEON_CREVICE(61, "Narrow Crevice", new WorldPoint(2729, 10008, 0), CREVICE_16539),
 	MOUNT_KARUULM_UPPER(62, "Rocks", new WorldPoint(1322, 3791, 0), ROCKS_34396),
 	NECROPOLIS_STEPPING_STONE_NORTH(62, "Stepping Stone", new WorldPoint(3293, 2706, 0), STEPPING_STONE_43990),
 	NECROPOLIS_STEPPING_STONES_SOUTH(62, "Stepping Stones", new WorldPoint(3291, 2700, 0), STEPPING_STONE_43989),
 	TAVERLEY_DUNGEON_RAILING(63, "Loose Railing", new WorldPoint(2935, 9811, 0), LOOSE_RAILING_28849),
+	FORTHOS_DUNGEON_SPIKED_BLADES(63, "Spiked Blades", new WorldPoint(1819, 9946, 0), STRANGE_FLOOR_34834),
 	DARKMEYER_WALL(63, "Wall (Long rope)", new WorldPoint(3669, 3375, 0), NULL_39541, NULL_39542),
 	TROLLHEIM_WILDERNESS_ROCKS_EAST(64, "Rocks", new WorldPoint(2945, 3678, 0), ROCKS_16545),
 	TROLLHEIM_WILDERNESS_ROCKS_WEST(64, "Rocks", new WorldPoint(2917, 3672, 0), ROCKS_16545),
@@ -211,6 +226,7 @@ public enum AgilityShortcut
 	REVENANT_CAVES_GREEN_DRAGONS(65, "Jump", new WorldPoint(3220, 10086, 0), PILLAR_31561),
 	COSMIC_ALTAR_ADVANCED_WALKWAY(66, "Narrow Walkway", new WorldPoint(2408, 4401, 0), JUTTING_WALL_17002),
 	LUMBRIDGE_DESERT_STEPPING_STONE(66, "Stepping Stone", new WorldPoint(3210, 3135, 0), STEPPING_STONE_16513),
+	TAVERLEY_WALL_CLIMBING_ROCKS(66, "Climbing rocks", new WorldPoint(2945, 3439, 0), CLIMBING_ROCKS_53255),
 	HEROES_GUILD_TUNNEL_EAST(67, "Crevice", new WorldPoint(2898, 9901, 0), CREVICE_9739, CREVICE_9740),
 	HEROES_GUILD_TUNNEL_WEST(67, "Crevice", new WorldPoint(2913, 9895, 0), CREVICE_9739, CREVICE_9740),
 	YANILLE_DUNGEON_RUBBLE_CLIMB(67, "Pile of Rubble", null, PILE_OF_RUBBLE_23563, PILE_OF_RUBBLE_23564),
@@ -237,41 +253,53 @@ public enum AgilityShortcut
 	GWD_SARADOMIN_ROPE_NORTH(70, "Rope Descent", new WorldPoint(2912, 5300, 0), NULL_26371, NULL_26561),
 	GWD_SARADOMIN_ROPE_SOUTH(70, "Rope Descent", new WorldPoint(2951, 5267, 0), NULL_26375, NULL_26562),
 	GU_TANOTH_CRUMBLING_WALL(71, "Rocks", new WorldPoint(2545, 3032, 0), CRUMBLING_WALL_40355, ROCKS_40356),
-	SLAYER_TOWER_ADVANCED_CHAIN_FIRST(71, "Spiked Chain (Floor 2)", new WorldPoint(3447, 3578, 0), SPIKEY_CHAIN ),
-	SLAYER_TOWER_ADVANCED_CHAIN_SECOND(71, "Spiked Chain (Floor 3)", new WorldPoint(3446, 3576, 0), SPIKEY_CHAIN_16538),
+	POLLNIVNEACH_STEPPING_STONE(71, "Stepping stone", new WorldPoint(3371, 2958, 0), STEPPING_STONE_53241),
+	SLAYER_TOWER_ADVANCED_CHAIN_FIRST(71, "Spikey Chain (Floor 2)", new WorldPoint(3447, 3578, 0), SPIKEY_CHAIN),
+	SLAYER_TOWER_ADVANCED_CHAIN_SECOND(71, "Spikey Chain (Floor 3)", new WorldPoint(3446, 3576, 0), SPIKEY_CHAIN_16538),
 	STRONGHOLD_SLAYER_CAVE_TUNNEL(72, "Tunnel", new WorldPoint(2431, 9806, 0), TUNNEL_30174, TUNNEL_30175),
+	ASGARNIA_ICE_DUNGEON_BASIC_NORTH(72, "Tunnel", new WorldPoint(3025, 9570, 0), TUNNEL_42506),
+	ASGARNIA_ICE_DUNGEON_BASIC_SOUTH(72, "Tunnel", new WorldPoint(3033, 9559, 0), TUNNEL_42507),
+	CHAOS_TEMPLE_STEPPING_STONE(72, "Stepping stone", new WorldPoint(3267, 3628, 0), STEPPING_STONE_53237),
+	BARROWS_WALL_JUMP(72, "Dry stone wall", new WorldPoint(3544, 3282, 0), DRY_STONE_WALL_53256),
 	TROLL_STRONGHOLD_WALL_CLIMB(73, "Rocks", new WorldPoint(2841, 3694, 0), ROCKS_16464),
-	ARCEUUS_ESSENSE_MINE_WEST(73, "Rock Climb", new WorldPoint(1742, 3853, 0), ROCKS_27984, ROCKS_27985 ),
+	ARCEUUS_ESSENSE_MINE_WEST(73, "Rock Climb", new WorldPoint(1742, 3853, 0), ROCKS_27984, ROCKS_27985),
 	LAVA_DRAGON_ISLE_JUMP(74, "Stepping Stone", new WorldPoint(3200, 3807, 0), STEPPING_STONE_14918),
 	MEIYERDITCH_LAB_TUNNELS_NORTH(74, "Cave", new WorldPoint(3623, 9811, 0), CAVE_43755, CAVE_43756),
 	MEIYERDITCH_LAB_TUNNELS_SOUTH(74, "Cave", new WorldPoint(3618, 9786, 0), CAVE_43757, CAVE_43758),
-	FORTHOS_DUNGEON_SPIKED_BLADES(75, "Spiked Blades", new WorldPoint(1819, 9946, 0), STRANGE_FLOOR_34834),
 	REVENANT_CAVES_DEMONS_JUMP(75, "Jump", new WorldPoint(3199, 10135, 0), PILLAR_31561),
 	REVENANT_CAVES_ANKOU_EAST(75, "Jump", new WorldPoint(3201, 10195, 0), PILLAR_31561),
 	REVENANT_CAVES_ANKOU_NORTH(75, "Jump", new WorldPoint(3180, 10209, 0), PILLAR_31561),
 	ZUL_ANDRA_ISLAND_CROSSING(76, "Stepping Stone", new WorldPoint(2156, 3073, 0), STEPPING_STONE_10663),
-	SHILO_VILLAGE_STEPPING_STONES( 77, "Stepping Stones", new WorldPoint(2863, 2974, 0), STEPPING_STONE_16466),
+	WILDERNESS_SLAYER_CAVE_CREVICE_NORTH_EAST(77, "Crevice", new WorldPoint(3433, 10093, 0), CREVICE_53259),
+	WILDERNESS_SLAYER_CAVE_CREVICE_SOUTH_EAST(77, "Crevice", new WorldPoint(3434, 10115, 0), CREVICE_53259),
+	WILDERNESS_SLAYER_CAVE_CREVICE_NORTH_WEST(77, "Crevice", new WorldPoint(3341, 10149, 0), CREVICE_53259),
+	WILDERNESS_SLAYER_CAVE_CREVICE_SOUTH_WEST(77, "Crevice", new WorldPoint(3333, 10119, 0), CREVICE_53259),
 	IORWERTHS_DUNGEON_NORTHERN_SHORTCUT_EAST(78, "Tight Gap", new WorldPoint(3221, 12441, 0), TIGHT_GAP),
 	IORWERTHS_DUNGEON_NORTHERN_SHORTCUT_WEST(78, "Tight Gap", new WorldPoint(3215, 12441, 0), TIGHT_GAP_36693),
+	SHILO_VILLAGE_ROCKS(79, "Rocks", new WorldPoint(2870, 3003, 0), ROCKS_53240, ROCKS_53238),
 	KHARAZI_JUNGLE_VINE_CLIMB(79, "Vine", new WorldPoint(2897, 2939, 0), NULL_26884, NULL_26886),
 	TAVERLEY_DUNGEON_SPIKED_BLADES(80, "Strange Floor", new WorldPoint(2877, 9813, 0), STRANGE_FLOOR),
-	SLAYER_DUNGEON_CHASM_JUMP(81, "Spiked Blades", new WorldPoint(2770, 10003, 0), STRANGE_FLOOR_16544),
+	WATERBIRTH_DUNGEON_CREVICE(81, "Crevice", new WorldPoint(2604, 10070, 0), CREVICE_53258),
 	LAVA_MAZE_NORTH_JUMP(82, "Stepping Stone", new WorldPoint(3092, 3880, 0), STEPPING_STONE_14917),
-	BRIMHAVEN_DUNGEON_EAST_STEPPING_STONES_NORTH(83, "Stepping Stones", new WorldPoint(2685, 9547, 0), STEPPING_STONE_19040),
-	BRIMHAVEN_DUNGEON_EAST_STEPPING_STONES_SOUTH(83, "Stepping Stones", new WorldPoint(2693, 9529, 0), STEPPING_STONE_19040),
+	ASGARNIA_ICE_DUNGEON_ADEPT_WEST(82, "Tunnel", new WorldPoint(3012, 9549, 0), TUNNEL_53250),
+	ASGARNIA_ICE_DUNGEON_ADEPT_EAST(82, "Tunnel", new WorldPoint(3022, 9553, 0), TUNNEL_53251),
 	IORWERTHS_DUNGEON_SOUTHERN_SHORTCUT_EAST(84, "Tight Gap", new WorldPoint(3241, 12420, 0), TIGHT_GAP_36694),
 	IORWERTHS_DUNGEON_SOUTHERN_SHORTCUT_WEST(84, "Tight Gap", new WorldPoint(3231, 12420, 0), TIGHT_GAP_36695),
+	CRANDOR_ROCK_CLIMB(84, "Rocks", new WorldPoint(2831, 3252, 0), ROCKS_53236, ROCKS_53234),
 	ELVEN_ADVANCED_CLIFF_SCRAMBLE(85, "Rocks", new WorldPoint(2337, 3253, 0), ROCKS_16514, ROCKS_16515),
 	ELVEN_ADVANCED_CLIFF_SCRAMBLE_PRIFDDINAS(85, "Rocks", new WorldPoint(3361, 6005, 0), ROCKS_16514, ROCKS_16515),
+	WATERBIRTH_ISLAND_ROCKS(85, "Rocks", new WorldPoint(2546, 3750, 0), ROCKS_53252, ROCKS_53254),
 	KALPHITE_WALL(86, "Crevice", new WorldPoint(3214, 9508, 0), CREVICE_16465),
 	BRIMHAVEN_DUNGEON_VINE_EAST(87, "Vine", new WorldPoint(2672, 9582, 0), VINE_26880, VINE_26882),
 	BRIMHAVEN_DUNGEON_VINE_WEST(87, "Vine", new WorldPoint(2606, 9584, 0), VINE_26880, VINE_26882),
 	MOUNT_KARUULM_PIPE_SOUTH(88, "Pipe", new WorldPoint(1316, 10214, 0), MYSTERIOUS_PIPE),
 	MOUNT_KARUULM_PIPE_NORTH(88, "Pipe", new WorldPoint(1345, 10230, 0), MYSTERIOUS_PIPE),
 	REVENANT_CAVES_CHAMBER_JUMP(89, "Jump", new WorldPoint(3240, 10144, 0), PILLAR_31561),
+	VIYELDI_ROCK_CLIMB(91, "Rocks", null, NULL_40960, NULL_40962),
 	MEIYERDITCH_LAB_ADVANCED_TUNNELS_WEST(93, "Cave", new WorldPoint(3499, 9802, 0), CAVE_43759),
 	MEIYERDITCH_LAB_ADVANCED_TUNNELS_MIDDLE(93, "Cave", new WorldPoint(3597, 9768, 0), NULL_43840),
-	MEIYERDITCH_LAB_ADVANCED_TUNNELS_EAST(93, "Cave", new WorldPoint(3604, 9772, 0), CAVE_43762, CAVE_43763);
+	MEIYERDITCH_LAB_ADVANCED_TUNNELS_EAST(93, "Cave", new WorldPoint(3604, 9772, 0), CAVE_43762, CAVE_43763),
+	VIYELDI_CAVES_CREVICE(96, "Crevice", null, CREVICE_53242);
 
 	/**
 	 * The agility level required to pass the shortcut
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/FaladorDiaryRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/FaladorDiaryRequirement.java
index dcc738872..5db2a74bb 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/FaladorDiaryRequirement.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/FaladorDiaryRequirement.java
@@ -90,7 +90,7 @@ public class FaladorDiaryRequirement extends GenericDiaryRequirement
 			new SkillRequirement(Skill.SLAYER, 72));
 		add("Complete a lap of the Falador rooftop agility course.",
 			new SkillRequirement(Skill.AGILITY, 50));
-		add("Enter the mining guild wearing full prospector.",
+		add("Enter the mining guild wearing a Prospector helmet.",
 			new SkillRequirement(Skill.MINING, 60));
 		add("Kill the Blue Dragon under the Heroes' Guild.",
 			new QuestRequirement(Quest.HEROES_QUEST));
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/bosstimer/Boss.java b/runelite-client/src/main/java/net/runelite/client/plugins/bosstimer/Boss.java
index f47b75856..524de80f3 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/bosstimer/Boss.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/bosstimer/Boss.java
@@ -44,7 +44,7 @@ enum Boss
 	ARTIO(NpcID.ARTIO, 11, RSTimeUnit.GAME_TICKS, ItemID.CALLISTO_CUB),
 	CHAOS_ELEMENTAL(NpcID.CHAOS_ELEMENTAL, 14, RSTimeUnit.GAME_TICKS, ItemID.PET_CHAOS_ELEMENTAL),
 	CHAOS_FANATIC(NpcID.CHAOS_FANATIC, 14, RSTimeUnit.GAME_TICKS, ItemID.ANCIENT_STAFF),
-	CRAZY_ARCHAEOLOGIST(NpcID.CRAZY_ARCHAEOLOGIST, 30, ChronoUnit.SECONDS, ItemID.FEDORA),
+	CRAZY_ARCHAEOLOGIST(NpcID.CRAZY_ARCHAEOLOGIST, 9, ChronoUnit.SECONDS, ItemID.FEDORA),
 	KING_BLACK_DRAGON(NpcID.KING_BLACK_DRAGON, 9, ChronoUnit.SECONDS, ItemID.PRINCE_BLACK_DRAGON),
 	SCORPIA(NpcID.SCORPIA, 14, RSTimeUnit.GAME_TICKS, ItemID.SCORPIAS_OFFSPRING),
 	SCURRIUS(NpcID.SCURRIUS, 29, RSTimeUnit.GAME_TICKS, ItemID.SCURRY),
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CoordinateClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CoordinateClue.java
index c62e666c9..f6ed3e993 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CoordinateClue.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CoordinateClue.java
@@ -237,7 +237,7 @@ public class CoordinateClue extends ClueScroll implements LocationClueScroll
 		.put(new WorldPoint(3085, 3569, 0), new CoordinateClueInfo("Wilderness. Obelisk of Air.", BRASSICAN_MAGE))
 		.put(new WorldPoint(2934, 2727, 0), new CoordinateClueInfo("Eastern shore of Crash Island.", BRASSICAN_MAGE))
 		.put(new WorldPoint(1451, 3695, 0), new CoordinateClueInfo("West side of Lizardman Canyon with Lizardman shaman.", ANCIENT_WIZARDS))
-		.put(new WorldPoint(2538, 3739, 0), new CoordinateClueInfo("Waterbirth Island. Bring a pet rock and rune thrownaxe.", BRASSICAN_MAGE))
+		.put(new WorldPoint(2538, 3739, 0), new CoordinateClueInfo("Waterbirth Island. Bring a pet rock and rune thrownaxe OR have 85 agility.", BRASSICAN_MAGE))
 		.put(new WorldPoint(1248, 3751, 0), new CoordinateClueInfo("In the north wing of the Farming Guild.", BRASSICAN_MAGE))
 		.put(new WorldPoint(1698, 3792, 0), new CoordinateClueInfo("Arceuus church.", ANCIENT_WIZARDS))
 		.put(new WorldPoint(2951, 3820, 0), new CoordinateClueInfo("Wilderness. Chaos Temple (level 38).", ANCIENT_WIZARDS))
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CrypticClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CrypticClue.java
index d1272f3da..57b45e17e 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CrypticClue.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CrypticClue.java
@@ -1070,7 +1070,7 @@ public class CrypticClue extends ClueScroll implements NpcClueScroll, ObjectClue
 		CrypticClue.builder()
 			.text("A ring of water surrounds 4 powerful rings, dig above the ladder located there.")
 			.location(new WorldPoint(1910, 4367, 0))
-			.solution("Dig by the ladder leading to the Dagannoth Kings room in the Waterbirth Island Dungeon. Bring a pet rock and rune thrownaxe.")
+			.solution("Dig by the ladder leading to the Dagannoth Kings room in the Waterbirth Island Dungeon. Bring a pet rock and rune thrownaxe OR have 85 agility.")
 			.build(),
 		CrypticClue.builder()
 			.text("This place sure is a mess.")
@@ -1108,7 +1108,7 @@ public class CrypticClue extends ClueScroll implements NpcClueScroll, ObjectClue
 		CrypticClue.builder()
 			.text("If you're feeling brave, dig beneath the dragon's eye.")
 			.location(new WorldPoint(2410, 4714, 0))
-			.solution("Dig below the mossy rock under the Viyeldi caves (Legend's Quest). Items needed: Pickaxe, unpowered orb, lockpick, spade, any charge orb spell, and either 79 agility or an axe and machete.")
+			.solution("Dig below the mossy rock under the Viyeldi caves (Legend's Quest). Items needed: Pickaxe, unpowered orb, lockpick, spade, any charge orb spell, and either 79 agility or an axe and machete. With 96 agility no items are needed.")
 			.build(),
 		CrypticClue.builder()
 			.text("Search the tents in the Imperial Guard camp in Burthorpe for some boxes.")
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/combatlevel/CombatLevelPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/combatlevel/CombatLevelPlugin.java
index d0fde04e6..f7814206f 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/combatlevel/CombatLevelPlugin.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/combatlevel/CombatLevelPlugin.java
@@ -33,13 +33,13 @@ import java.util.regex.Pattern;
 import javax.inject.Inject;
 import net.runelite.api.Client;
 import net.runelite.api.Experience;
-import net.runelite.api.GameState;
 import net.runelite.api.ScriptID;
 import net.runelite.api.Skill;
 import net.runelite.api.WorldType;
-import net.runelite.api.events.GameTick;
+import net.runelite.api.events.ClientTick;
 import net.runelite.api.events.ScriptPostFired;
 import net.runelite.api.events.ScriptPreFired;
+import net.runelite.api.events.StatChanged;
 import net.runelite.api.widgets.ComponentID;
 import net.runelite.api.widgets.Widget;
 import net.runelite.client.config.ConfigManager;
@@ -78,6 +78,8 @@ public class CombatLevelPlugin extends Plugin
 	@Inject
 	private OverlayManager overlayManager;
 
+	private String combatLevelStr;
+
 	@Provides
 	CombatLevelConfig provideConfig(ConfigManager configManager)
 	{
@@ -87,6 +89,17 @@ public class CombatLevelPlugin extends Plugin
 	@Override
 	protected void startUp() throws Exception
 	{
+		double combatLevel = Experience.getCombatLevelPrecise(
+			client.getRealSkillLevel(Skill.ATTACK),
+			client.getRealSkillLevel(Skill.STRENGTH),
+			client.getRealSkillLevel(Skill.DEFENCE),
+			client.getRealSkillLevel(Skill.HITPOINTS),
+			client.getRealSkillLevel(Skill.MAGIC),
+			client.getRealSkillLevel(Skill.RANGED),
+			client.getRealSkillLevel(Skill.PRAYER)
+		);
+		combatLevelStr = DECIMAL_FORMAT.format(combatLevel);
+
 		overlayManager.add(overlay);
 
 		if (config.wildernessAttackLevelRange())
@@ -115,20 +128,13 @@ public class CombatLevelPlugin extends Plugin
 	}
 
 	@Subscribe
-	public void onGameTick(GameTick event)
+	private void onStatChanged(StatChanged statChanged)
 	{
-		if (client.getGameState() != GameState.LOGGED_IN)
-		{
-			return;
-		}
-
-		Widget combatLevelWidget = client.getWidget(ComponentID.COMBAT_LEVEL);
-		if (combatLevelWidget == null || !config.showPreciseCombatLevel())
+		Skill skill = statChanged.getSkill();
+		if (skill == Skill.ATTACK || skill == Skill.DEFENCE || skill == Skill.STRENGTH || skill == Skill.HITPOINTS
+			|| skill == Skill.MAGIC || skill == Skill.PRAYER || skill == Skill.RANGED)
 		{
-			return;
-		}
-
-		double combatLevelPrecise = Experience.getCombatLevelPrecise(
+			double combatLevel = Experience.getCombatLevelPrecise(
 				client.getRealSkillLevel(Skill.ATTACK),
 				client.getRealSkillLevel(Skill.STRENGTH),
 				client.getRealSkillLevel(Skill.DEFENCE),
@@ -136,9 +142,21 @@ public class CombatLevelPlugin extends Plugin
 				client.getRealSkillLevel(Skill.MAGIC),
 				client.getRealSkillLevel(Skill.RANGED),
 				client.getRealSkillLevel(Skill.PRAYER)
-		);
+			);
+			combatLevelStr = DECIMAL_FORMAT.format(combatLevel);
+		}
+	}
+
+	@Subscribe
+	private void onClientTick(ClientTick tick)
+	{
+		Widget combatLevelWidget = client.getWidget(ComponentID.COMBAT_LEVEL);
+		if (combatLevelWidget == null || !config.showPreciseCombatLevel())
+		{
+			return;
+		}
 
-		combatLevelWidget.setText("Combat Lvl: " + DECIMAL_FORMAT.format(combatLevelPrecise));
+		combatLevelWidget.setText("Combat Lvl: " + combatLevelStr);
 	}
 
 	@Subscribe
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItem.java b/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItem.java
index 677fa6706..c372eae99 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItem.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItem.java
@@ -77,7 +77,7 @@ class GroundItem
 
 	boolean isMine()
 	{
-		return ownership != OWNERSHIP_OTHER;
+		return ownership == OWNERSHIP_SELF || ownership == OWNERSHIP_GROUP;
 	}
 
 	void reset()
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsOverlay.java
index 38366542f..0684df67d 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsOverlay.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsOverlay.java
@@ -39,6 +39,7 @@ import java.util.HashMap;
 import java.util.Map;
 import javax.inject.Inject;
 import net.runelite.api.Client;
+import net.runelite.api.ItemID;
 import net.runelite.api.Perspective;
 import net.runelite.api.Player;
 import net.runelite.api.Point;
@@ -225,34 +226,38 @@ public class GroundItemsOverlay extends Overlay
 					.append(')');
 			}
 
-			if (config.priceDisplayMode() == PriceDisplayMode.BOTH)
+			if (item.getId() != ItemID.COINS_995)
 			{
-				if (item.getGePrice() > 0)
+				PriceDisplayMode displayMode = config.priceDisplayMode();
+				if (displayMode == PriceDisplayMode.BOTH)
 				{
-					itemStringBuilder.append(" (GE: ")
-						.append(QuantityFormatter.quantityToStackSize(item.getGePrice()))
-						.append(" gp)");
-				}
+					if (item.getGePrice() > 0)
+					{
+						itemStringBuilder.append(" (GE: ")
+							.append(QuantityFormatter.quantityToStackSize(item.getGePrice()))
+							.append(" gp)");
+					}
 
-				if (item.getHaPrice() > 0)
-				{
-					itemStringBuilder.append(" (HA: ")
-						.append(QuantityFormatter.quantityToStackSize(item.getHaPrice()))
-						.append(" gp)");
+					if (item.getHaPrice() > 0)
+					{
+						itemStringBuilder.append(" (HA: ")
+							.append(QuantityFormatter.quantityToStackSize(item.getHaPrice()))
+							.append(" gp)");
+					}
 				}
-			}
-			else if (config.priceDisplayMode() != PriceDisplayMode.OFF)
-			{
-				final int price = config.priceDisplayMode() == PriceDisplayMode.GE
-					? item.getGePrice()
-					: item.getHaPrice();
-
-				if (price > 0)
+				else if (displayMode != PriceDisplayMode.OFF)
 				{
-					itemStringBuilder
-						.append(" (")
-						.append(QuantityFormatter.quantityToStackSize(price))
-						.append(" gp)");
+					final int price = displayMode == PriceDisplayMode.GE
+						? item.getGePrice()
+						: item.getHaPrice();
+
+					if (price > 0)
+					{
+						itemStringBuilder
+							.append(" (")
+							.append(QuantityFormatter.quantityToStackSize(price))
+							.append(" gp)");
+					}
 				}
 			}
 
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsPlugin.java
index 62ddd9b9d..991e3a15a 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsPlugin.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsPlugin.java
@@ -66,6 +66,7 @@ import net.runelite.api.MenuAction;
 import net.runelite.api.MenuEntry;
 import net.runelite.api.Tile;
 import net.runelite.api.TileItem;
+import net.runelite.api.Varbits;
 import net.runelite.api.coords.WorldPoint;
 import net.runelite.api.events.ClientTick;
 import net.runelite.api.events.FocusChanged;
@@ -387,6 +388,16 @@ public class GroundItemsPlugin extends Plugin
 		final int alchPrice = itemComposition.getHaPrice();
 		final int despawnTime = item.getDespawnTime() - client.getTickCount();
 		final int visibleTime = item.getVisibleTime() - client.getTickCount();
+		int ownership = item.getOwnership();
+		final int accountType = client.getVarbitValue(Varbits.ACCOUNT_TYPE);
+		boolean isGim = accountType >= 4 && accountType <= 6; // ~is_group_iron
+
+		// from ~script7240
+		if (ownership == TileItem.OWNERSHIP_GROUP && !isGim)
+		{
+			// non-gims see loot from other people as "group" loop since they are both group -1.
+			ownership = TileItem.OWNERSHIP_OTHER;
+		}
 
 		final GroundItem groundItem = GroundItem.builder()
 			.id(itemId)
@@ -397,7 +408,7 @@ public class GroundItemsPlugin extends Plugin
 			.haPrice(alchPrice)
 			.height(tile.getItemLayer().getHeight())
 			.tradeable(itemComposition.isTradeable())
-			.ownership(item.getOwnership())
+			.ownership(ownership)
 			.isPrivate(item.isPrivate())
 			.spawnTime(Instant.now())
 			.stackable(itemComposition.isStackable())
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/InterfaceStylesPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/InterfaceStylesPlugin.java
index f624f4d10..f64bb624b 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/InterfaceStylesPlugin.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/InterfaceStylesPlugin.java
@@ -58,7 +58,7 @@ import net.runelite.client.util.ImageUtil;
 @PluginDescriptor(
 	name = "Interface Styles",
 	description = "Change the interface style to the 2005/2010 interface",
-	tags = {"2005", "2010", "skin", "theme", "ui"},
+	tags = {"2005", "2010", "skin", "theme", "ui", "hp", "bar"},
 	enabledByDefault = false
 )
 public class InterfaceStylesPlugin extends Plugin
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatChanges.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatChanges.java
index d9aecadbb..e526a7be6 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatChanges.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatChanges.java
@@ -113,6 +113,12 @@ public class ItemStatChanges
 		add(range(food(5), food(8)), LEAN_SNAIL_MEAT);
 		add(range(food(7), food(9)), FAT_SNAIL_MEAT);
 		add(range(food(7), food(10)), SPIDER_ON_STICK_6297, SPIDER_ON_SHAFT_6299);
+		add(combo(food(8), food(6)), COOKED_GRAAHK);
+		add(combo(food(9), food(8)), COOKED_KYATT);
+		add(combo(food(11), food(8)), COOKED_PYRE_FOX);
+		add(combo(food(13), food(10), heal(RUN_ENERGY, 10)), COOKED_DASHING_KEBBIT);
+		add(combo(food(12), food(9)), COOKED_SUNLIGHT_ANTELOPE);
+		add(combo(food(14), food(12)), COOKED_MOONLIGHT_ANTELOPE);
 
 		// Dorgeshuun Cuisine
 		add(food(2), BAT_SHISH, COATED_FROGS_LEGS, FILLETS, FINGERS, FROGBURGER, FROGSPAWN_GUMBO, GREEN_GLOOP_SOUP,
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeConfig.java
index 777b831eb..e59fd611e 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeConfig.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeConfig.java
@@ -64,16 +64,6 @@ public interface MotherlodeConfig extends Config
 		return 5;
 	}
 
-	@ConfigItem(
-		keyName = "showSack",
-		name = "Show pay-dirt sack",
-		description = "Configures whether the pay-dirt sack is displayed or not."
-	)
-	default boolean showSack()
-	{
-		return true;
-	}
-
 	@ConfigItem(
 		keyName = "showMiningStats",
 		name = "Show mining session stats",
@@ -84,16 +74,6 @@ public interface MotherlodeConfig extends Config
 		return true;
 	}
 
-	@ConfigItem(
-		keyName = "showDepositsLeft",
-		name = "Show deposits left",
-		description = "Displays deposits left before sack is full"
-	)
-	default boolean showDepositsLeft()
-	{
-		return true;
-	}
-
 	@ConfigItem(
 		keyName = "showMiningState",
 		name = "Show current mining state",
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodePlugin.java
index 8130c714b..183e4bed3 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodePlugin.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodePlugin.java
@@ -47,7 +47,6 @@ import net.runelite.api.Client;
 import net.runelite.api.GameObject;
 import net.runelite.api.GameState;
 import net.runelite.api.InventoryID;
-import net.runelite.api.Item;
 import net.runelite.api.ItemContainer;
 import net.runelite.api.ItemID;
 import static net.runelite.api.ObjectID.BROKEN_STRUT;
@@ -58,6 +57,7 @@ import static net.runelite.api.ObjectID.ORE_VEIN_26664;
 import static net.runelite.api.ObjectID.ROCKFALL;
 import static net.runelite.api.ObjectID.ROCKFALL_26680;
 import net.runelite.api.Perspective;
+import net.runelite.api.ScriptID;
 import net.runelite.api.Varbits;
 import net.runelite.api.WallObject;
 import net.runelite.api.coords.LocalPoint;
@@ -66,6 +66,7 @@ import net.runelite.api.events.GameObjectDespawned;
 import net.runelite.api.events.GameObjectSpawned;
 import net.runelite.api.events.GameStateChanged;
 import net.runelite.api.events.ItemContainerChanged;
+import net.runelite.api.events.ScriptPostFired;
 import net.runelite.api.events.VarbitChanged;
 import net.runelite.api.events.WallObjectDespawned;
 import net.runelite.api.events.WallObjectSpawned;
@@ -85,7 +86,7 @@ import net.runelite.http.api.loottracker.LootRecordType;
 
 @PluginDescriptor(
 	name = "Motherlode Mine",
-	description = "Show helpful information inside the Motherload Mine",
+	description = "Show helpful information inside the Motherlode Mine",
 	tags = {"pay", "dirt", "mining", "mlm", "skilling", "overlay"},
 	enabledByDefault = false
 )
@@ -97,10 +98,8 @@ public class MotherlodePlugin extends Plugin
 		ItemID.MITHRIL_ORE, ItemID.GOLD_ORE, ItemID.COAL, ItemID.GOLDEN_NUGGET);
 	private static final Set<Integer> ROCK_OBSTACLES = ImmutableSet.of(ROCKFALL, ROCKFALL_26680);
 
-	private static final int MAX_INVENTORY_SIZE = 28;
-
-	private static final int SACK_LARGE_SIZE = 162;
-	private static final int SACK_SIZE = 81;
+	private static final int SACK_LARGE_SIZE = 189;
+	private static final int SACK_SIZE = 108;
 
 	private static final int UPPER_FLOOR_HEIGHT = -490;
 
@@ -113,9 +112,6 @@ public class MotherlodePlugin extends Plugin
 	@Inject
 	private MotherlodeSceneOverlay sceneOverlay;
 
-	@Inject
-	private MotherlodeSackOverlay motherlodeSackOverlay;
-
 	@Inject
 	private MotherlodeConfig config;
 
@@ -131,12 +127,7 @@ public class MotherlodePlugin extends Plugin
 	@Getter(AccessLevel.PACKAGE)
 	private boolean inMlm;
 
-	@Getter(AccessLevel.PACKAGE)
 	private int curSackSize;
-	@Getter(AccessLevel.PACKAGE)
-	private int maxSackSize;
-	@Getter(AccessLevel.PACKAGE)
-	private Integer depositsLeft;
 
 	@Inject
 	private MotherlodeSession session;
@@ -161,7 +152,6 @@ public class MotherlodePlugin extends Plugin
 	{
 		overlayManager.add(miningOverlay);
 		overlayManager.add(sceneOverlay);
-		overlayManager.add(motherlodeSackOverlay);
 
 		inMlm = checkInMlm();
 
@@ -176,20 +166,9 @@ public class MotherlodePlugin extends Plugin
 	{
 		overlayManager.remove(miningOverlay);
 		overlayManager.remove(sceneOverlay);
-		overlayManager.remove(motherlodeSackOverlay);
 		veins.clear();
 		rocks.clear();
 		brokenStruts.clear();
-
-		Widget sack = client.getWidget(ComponentID.MLM_CONTAINER);
-
-		clientThread.invokeLater(() ->
-		{
-			if (sack != null && sack.isHidden())
-			{
-				sack.setHidden(false);
-			}
-		});
 	}
 
 	void reset()
@@ -288,8 +267,6 @@ public class MotherlodePlugin extends Plugin
 			return;
 		}
 
-		depositsLeft = calculateDepositsLeft();
-
 		Instant lastPayDirtMined = session.getLastPayDirtMined();
 		if (lastPayDirtMined == null)
 		{
@@ -306,6 +283,45 @@ public class MotherlodePlugin extends Plugin
 		}
 	}
 
+	@Subscribe
+	private void onScriptPostFired(ScriptPostFired event)
+	{
+		if (event.getScriptId() == ScriptID.MOTHERLODE_HUD_UPDATE)
+		{
+			recolorSackOverlay();
+		}
+	}
+
+	private void recolorSackOverlay()
+	{
+		ItemContainer inv = client.getItemContainer(InventoryID.INVENTORY);
+		if (inv == null)
+		{
+			return;
+		}
+
+		int sackSize = client.getVarbitValue(Varbits.SACK_NUMBER);
+		boolean sackUpgraded = client.getVarbitValue(Varbits.SACK_UPGRADED) == 1;
+		int sackCapacity = sackUpgraded ? SACK_LARGE_SIZE : SACK_SIZE;
+		int payDir = inv.count(ItemID.PAYDIRT);
+
+		Widget sackSizeWidget = client.getWidget(ComponentID.MLM_SACK_SIZE_TEXT);
+		Widget spaceTextWidget = client.getWidget(ComponentID.MLM_SPACE_TEXT);
+		if (sackSizeWidget != null && spaceTextWidget != null)
+		{
+			if (payDir >= sackCapacity - sackSize)
+			{
+				sackSizeWidget.setTextColor(0xff0000);
+				spaceTextWidget.setTextColor(0xff0000);
+			}
+			else
+			{
+				sackSizeWidget.setTextColor(0xc8c8c8);
+				spaceTextWidget.setTextColor(0xffffff);
+			}
+		}
+	}
+
 	@Subscribe
 	public void onWallObjectSpawned(WallObjectSpawned event)
 	{
@@ -377,13 +393,20 @@ public class MotherlodePlugin extends Plugin
 	@Subscribe
 	public void onItemContainerChanged(ItemContainerChanged event)
 	{
-		final ItemContainer container = event.getItemContainer();
+		if (!inMlm)
+		{
+			return;
+		}
+
+		recolorSackOverlay();
 
-		if (!inMlm || !shouldUpdateOres || inventorySnapshot == null || container.getId() != InventoryID.INVENTORY.getId())
+		if (!shouldUpdateOres || inventorySnapshot == null || event.getContainerId() != InventoryID.INVENTORY.getId())
 		{
 			return;
 		}
 
+		final ItemContainer container = event.getItemContainer();
+
 		// Build set of current inventory
 		Multiset<Integer> current = HashMultiset.create();
 		Arrays.stream(container.getItems())
@@ -411,52 +434,6 @@ public class MotherlodePlugin extends Plugin
 		shouldUpdateOres = false;
 	}
 
-	private Integer calculateDepositsLeft()
-	{
-		if (maxSackSize == 0) // check if maxSackSize has been initialized
-		{
-			refreshSackValues();
-		}
-
-		double depositsLeft = 0;
-		int nonPayDirtItems = 0;
-
-		ItemContainer inventory = client.getItemContainer(InventoryID.INVENTORY);
-		if (inventory == null)
-		{
-			return null;
-		}
-
-		Item[] result = inventory.getItems();
-		assert result != null;
-
-		for (Item item : result)
-		{
-			// Assume that MLM ores are being banked and exclude them from the check,
-			// so the user doesn't see the Overlay switch between deposits left and N/A.
-			//
-			// Count other items at nonPayDirtItems so depositsLeft is calculated accordingly.
-			if (item.getId() != ItemID.PAYDIRT && item.getId() != -1 && !MLM_ORE_TYPES.contains(item.getId()))
-			{
-				nonPayDirtItems += 1;
-			}
-		}
-
-		double inventorySpace = MAX_INVENTORY_SIZE - nonPayDirtItems;
-		double sackSizeRemaining = maxSackSize - curSackSize;
-
-		if (inventorySpace > 0 && sackSizeRemaining > 0)
-		{
-			depositsLeft = Math.ceil(sackSizeRemaining / inventorySpace);
-		}
-		else if (inventorySpace == 0)
-		{
-			return null;
-		}
-
-		return (int) depositsLeft;
-	}
-
 	private boolean checkInMlm()
 	{
 		GameState gameState = client.getGameState();
@@ -483,8 +460,6 @@ public class MotherlodePlugin extends Plugin
 	private void refreshSackValues()
 	{
 		curSackSize = client.getVarbitValue(Varbits.SACK_NUMBER);
-		boolean sackUpgraded = client.getVarbitValue(Varbits.SACK_UPGRADED) == 1;
-		maxSackSize = sackUpgraded ? SACK_LARGE_SIZE : SACK_SIZE;
 	}
 
 	/**
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeSackOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeSackOverlay.java
deleted file mode 100644
index 9a15581f2..000000000
--- a/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeSackOverlay.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Copyright (c) 2018, Seth <Sethtroll3@gmail.com>
- * Copyright (c) 2018, Adam <Adam@sigterm.info>
- * Copyright (c) 2018, Lars <lars.oernlo@gmail.com>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this
- *    list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions and the following disclaimer in the documentation
- *    and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-package net.runelite.client.plugins.motherlode;
-
-import java.awt.Color;
-import java.awt.Dimension;
-import java.awt.Graphics2D;
-import javax.inject.Inject;
-import net.runelite.api.Client;
-import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG;
-import net.runelite.api.Varbits;
-import net.runelite.api.widgets.ComponentID;
-import net.runelite.api.widgets.Widget;
-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.components.ComponentConstants;
-import net.runelite.client.ui.overlay.components.LineComponent;
-
-class MotherlodeSackOverlay extends OverlayPanel
-{
-	private static final Color DANGER = new Color(150, 0, 0, 150);
-	private final Client client;
-	private final MotherlodeConfig config;
-	private final MotherlodePlugin plugin;
-
-	@Inject
-	MotherlodeSackOverlay(Client client, MotherlodeConfig config, MotherlodePlugin plugin)
-	{
-		super(plugin);
-		setPosition(OverlayPosition.TOP_LEFT);
-		this.client = client;
-		this.config = config;
-		this.plugin = plugin;
-		addMenuEntry(RUNELITE_OVERLAY_CONFIG, OPTION_CONFIGURE, "Sack overlay");
-	}
-
-	@Override
-	public Dimension render(Graphics2D graphics)
-	{
-		if (!plugin.isInMlm())
-		{
-			return null;
-		}
-
-		Widget sack = client.getWidget(ComponentID.MLM_CONTAINER);
-
-		panelComponent.setBackgroundColor(ComponentConstants.STANDARD_BACKGROUND_COLOR);
-
-		if (sack != null)
-		{
-			sack.setHidden(true);
-
-			if (config.showSack())
-			{
-				if (plugin.getCurSackSize() >= plugin.getMaxSackSize())
-				{
-					panelComponent.setBackgroundColor(DANGER);
-				}
-
-				panelComponent.getChildren().add(LineComponent.builder()
-					.left("Pay-dirt in sack:")
-					.right(String.valueOf(client.getVarbitValue(Varbits.SACK_NUMBER)))
-					.build());
-			}
-
-			if (config.showDepositsLeft())
-			{
-				final Integer depositsLeft = plugin.getDepositsLeft();
-				Color color = Color.WHITE;
-
-				if (depositsLeft != null)
-				{
-					if (depositsLeft == 0)
-					{
-						panelComponent.setBackgroundColor(DANGER);
-					}
-					else if (depositsLeft == 1)
-					{
-						color = Color.RED;
-					}
-				}
-
-				panelComponent.getChildren().add(LineComponent.builder()
-					.left("Deposits left:")
-					.leftColor(color)
-					.right(depositsLeft == null ? "N/A" : String.valueOf(depositsLeft))
-					.rightColor(color)
-					.build());
-			}
-		}
-
-		return super.render(graphics);
-	}
-}
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/regenmeter/RegenMeterOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/regenmeter/RegenMeterOverlay.java
index 810cab5e9..8681aec32 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/regenmeter/RegenMeterOverlay.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/regenmeter/RegenMeterOverlay.java
@@ -34,7 +34,6 @@ import java.awt.Stroke;
 import java.awt.geom.Arc2D;
 import javax.inject.Inject;
 import net.runelite.api.Client;
-import net.runelite.api.VarPlayer;
 import net.runelite.api.annotations.Component;
 import net.runelite.api.widgets.ComponentID;
 import net.runelite.api.widgets.Widget;
@@ -46,7 +45,6 @@ class RegenMeterOverlay extends Overlay
 {
 	private static final Color HITPOINTS_COLOR = brighter(0x9B0703);
 	private static final Color SPECIAL_COLOR = brighter(0x1E95B0);
-	private static final Color OVERLAY_COLOR = new Color(255, 255, 255, 60);
 	private static final double DIAMETER = 26D;
 	private static final int OFFSET = 27;
 
@@ -83,21 +81,6 @@ class RegenMeterOverlay extends Overlay
 
 		if (config.showSpecial())
 		{
-			if (client.getVarpValue(VarPlayer.SPECIAL_ATTACK_ENABLED) == 1)
-			{
-				final Widget widget = client.getWidget(ComponentID.MINIMAP_SPEC_ORB);
-
-				if (widget != null && !widget.isHidden())
-				{
-					final Rectangle bounds = widget.getBounds();
-					g.setColor(RegenMeterOverlay.OVERLAY_COLOR);
-					g.fillOval(
-						bounds.x + OFFSET,
-						bounds.y + (int) (bounds.height / 2 - (DIAMETER) / 2),
-						(int) DIAMETER, (int) DIAMETER);
-				}
-			}
-
 			renderRegen(g, ComponentID.MINIMAP_SPEC_ORB, plugin.getSpecialPercentage(), SPECIAL_COLOR);
 		}
 
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 2d954ee01..984dc2480 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
@@ -106,7 +106,8 @@ public class WidgetOverlay extends Overlay
 			new WidgetOverlay(client, ComponentID.MTA_GRAVEYARD_VALUES, "MTA_GRAVEYARD_VALUES", OverlayPosition.BOTTOM_RIGHT),
 			new WidgetOverlay(client, ComponentID.STRANGLER_OVERLAY, "STRANGLER_INFECTION_OVERLAY", OverlayPosition.TOP_LEFT),
 			new WidgetOverlay(client, ComponentID.SANITY_OVERLAY, "SANITY_OVERLAY", OverlayPosition.TOP_LEFT),
-			new WidgetOverlay(client, ComponentID.MOONS_OF_PERIL_LAYER, "MOONS_OF_PERIL", OverlayPosition.BOTTOM_RIGHT)
+			new WidgetOverlay(client, ComponentID.MOONS_OF_PERIL_LAYER, "MOONS_OF_PERIL", OverlayPosition.BOTTOM_RIGHT),
+			new WidgetOverlay(client, ComponentID.MLM_LAYER, "MLM_LAYER", OverlayPosition.TOP_LEFT)
 		);
 	}
 
diff --git a/runelite-jshell/pom.xml b/runelite-jshell/pom.xml
index 704852cdb..77bd2bc3f 100644
--- a/runelite-jshell/pom.xml
+++ b/runelite-jshell/pom.xml
@@ -30,7 +30,7 @@
     <parent>
         <groupId>net.runelite</groupId>
         <artifactId>runelite-parent</artifactId>
-        <version>1.10.29-SNAPSHOT</version>
+        <version>1.10.30-SNAPSHOT</version>
     </parent>
 
     <artifactId>jshell</artifactId>
diff --git a/runelite-maven-plugin/pom.xml b/runelite-maven-plugin/pom.xml
index 2fb805abb..01db4646b 100644
--- a/runelite-maven-plugin/pom.xml
+++ b/runelite-maven-plugin/pom.xml
@@ -29,7 +29,7 @@
 	<parent>
 		<groupId>net.runelite</groupId>
 		<artifactId>runelite-parent</artifactId>
-		<version>1.10.29-SNAPSHOT</version>
+		<version>1.10.30-SNAPSHOT</version>
 	</parent>
 
 	<artifactId>runelite-maven-plugin</artifactId>


Test patch:
diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/motherlode/MotherlodePluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/motherlode/MotherlodePluginTest.java
index d2d42a444..91e1c3def 100644
--- a/runelite-client/src/test/java/net/runelite/client/plugins/motherlode/MotherlodePluginTest.java
+++ b/runelite-client/src/test/java/net/runelite/client/plugins/motherlode/MotherlodePluginTest.java
@@ -77,10 +77,6 @@ public class MotherlodePluginTest
 	@Bind
 	private MotherlodeSceneOverlay motherlodeSceneOverlay;
 
-	@Mock
-	@Bind
-	private MotherlodeSackOverlay motherlodeSackOverlay;
-
 	@Mock
 	@Bind
 	private ScheduledExecutorService scheduledExecutorService;
@@ -150,7 +146,6 @@ public class MotherlodePluginTest
 		};
 		when(inventory.getItems())
 			.thenReturn(items);
-		when(inventory.getId()).thenReturn(InventoryID.INVENTORY.getId());
 
 		// Trigger comparison
 		when(motherlodeConfig.trackOresFound()).thenReturn(true);