From 63a8eaafc350f185fa26177fe62b223bb9152610 Mon Sep 17 00:00:00 2001 From: Lake David Date: Thu, 2 Jul 2026 15:23:37 -0500 Subject: [PATCH 01/27] hunter: add letvek traps --- .../net/runelite/client/plugins/hunter/HunterPlugin.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/hunter/HunterPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/hunter/HunterPlugin.java index c54c231b1b8..bdb70902514 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/hunter/HunterPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/hunter/HunterPlugin.java @@ -178,6 +178,7 @@ public void onGameObjectSpawned(GameObjectSpawned event) case ObjectID.HUNTING_BOXTRAP_FULL_CHINCHOMPA_BIG: // Red chinchompa caught case ObjectID.HUNTING_BOXTRAP_FULL_FERRET: // Ferret caught case ObjectID.HUNTING_BOXTRAP_FULL_JERBOA: // Embertailed jerboa caught + case ObjectID.HUNTING_BOXTRAP_FULL_LETVEK: // Letvek caught case ObjectID.HUNTING_DEADFALL_FULL_SPIKE: // Prickly kebbit caught case ObjectID.HUNTING_DEADFALL_FULL_SABRE: // Sabre-tooth kebbit caught case ObjectID.HUNTING_DEADFALL_FULL_BARBED: // Barb-tailed kebbit caught @@ -261,6 +262,12 @@ public void onGameObjectSpawned(GameObjectSpawned event) case ObjectID.HUNTING_BOXTRAP_TRAPPING_JERBOA_S: case ObjectID.HUNTING_BOXTRAP_TRAPPING_JERBOA_W: + // Letvek box + case ObjectID.HUNTING_BOXTRAP_TRAPPING_LETVEK_N: + case ObjectID.HUNTING_BOXTRAP_TRAPPING_LETVEK_E: + case ObjectID.HUNTING_BOXTRAP_TRAPPING_LETVEK_S: + case ObjectID.HUNTING_BOXTRAP_TRAPPING_LETVEK_W: + // Bird traps case ObjectID.HUNTING_OJIBWAY_TRAP_FAILING: case ObjectID.HUNTING_OJIBWAY_TRAP_TRAPPING_COLOURED: From d502eb017456a58b7bb5a8901434a0f9ceb635c5 Mon Sep 17 00:00:00 2001 From: Lake David Date: Wed, 1 Jul 2026 09:41:04 -0500 Subject: [PATCH 02/27] itemstats: Add vampyrium consumables --- .../client/plugins/itemstats/ItemStatChanges.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) 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 0b2f8d5d173..b09abae9820 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 @@ -108,11 +108,11 @@ private void init() add(food(15), ItemID.PREMADE_TANGLED_TOADS_LEGS, ItemID.TANGLED_TOADS_LEGS, ItemID.PREMADE_CHOCOLATE_BOMB, ItemID.CHOCOLATE_BOMB, ItemID._100_JUBBLY_MEAT_COOKED, ItemID.SWORDTIP_SQUID); add(food(16), ItemID.MONKFISH, ItemID.POTATO_CHEESE, ItemID.POTATO_EGG_TOMATO, ItemID.GAUNTLET_COMBO_FOOD, ItemID.GAUNTLET_COMBO_FOOD_HM); add(food(17), ItemID.RAIDS_FISH4_COOKED, ItemID.RAIDS_BAT4_COOKED, ItemID.GIANT_KRILL, ItemID.JUMBO_SQUID); - add(food(18), ItemID.TBWT_COOKED_KARAMBWAN, ItemID.BLIGHTED_KARAMBWAN, ItemID.BR_TBWT_COOKED_KARAMBWAN /* LMS */); + add(food(18), ItemID.TBWT_COOKED_KARAMBWAN, ItemID.BLIGHTED_KARAMBWAN, ItemID.BR_TBWT_COOKED_KARAMBWAN /* LMS */, ItemID.VAMPYRIUM_MYSTERY_KEBAB); add(food(19), ItemID.CURRY, ItemID.UGTHANKI_KEBAB_BAD, ItemID.UGTHANKI_KEBAB, ItemID.RAINBOW_CRAB_MEAT); add(food(20), ItemID.POTATO_MUSHROOM_ONION, ItemID.SHARK, ItemID.RAIDS_FISH5_COOKED, ItemID.RAIDS_BAT5_COOKED, ItemID.HUNDRED_ILM_COOKED_STUFFED_SNAKE, ItemID.BR_SHARK /* LMS */, ItemID.GAUNTLET_FOOD, ItemID.EVENT_CORRUPTED_SHARK, ItemID.HALIBUT); add(food(21), ItemID.SEATURTLE); - add(food(22), ItemID.MANTARAY, ItemID.BLIGHTED_MANTARAY, ItemID.DARK_CRAB, ItemID.POTATO_TUNA_SWEETCORN); + add(food(22), ItemID.MANTARAY, ItemID.BLIGHTED_MANTARAY, ItemID.DARK_CRAB, ItemID.POTATO_TUNA_SWEETCORN, ItemID.VAMPYRIUM_MYSTERY_JERKY); add(food(23), ItemID.RAIDS_FISH6_COOKED, ItemID.RAIDS_BAT6_COOKED); add(food(24), ItemID.MARLIN); add(new Anglerfish(), ItemID.ANGLERFISH, ItemID.BLIGHTED_ANGLERFISH); @@ -240,7 +240,8 @@ private void init() add(SUPER_STRENGTH_POT, ItemID._1DOSE2STRENGTH, ItemID._2DOSE2STRENGTH, ItemID._3DOSE2STRENGTH, ItemID._4DOSE2STRENGTH); add(SUPER_DEFENCE_POT, ItemID._1DOSE2DEFENSE, ItemID._2DOSE2DEFENSE, ItemID._3DOSE2DEFENSE, ItemID._4DOSE2DEFENSE); add(magicEssence, ItemID._1DOSEMAGICESS, ItemID._2DOSEMAGICESS, ItemID._3DOSEMAGICESS, ItemID._4DOSEMAGICESS); - add(combo(SUPER_ATTACK_POT, SUPER_STRENGTH_POT, SUPER_DEFENCE_POT), ItemID._1DOSE2COMBAT, ItemID._2DOSE2COMBAT, ItemID._3DOSE2COMBAT, ItemID._4DOSE2COMBAT); + add(combo(SUPER_ATTACK_POT, SUPER_STRENGTH_POT, SUPER_DEFENCE_POT), ItemID._1DOSE2COMBAT, ItemID._2DOSE2COMBAT, ItemID._3DOSE2COMBAT, ItemID._4DOSE2COMBAT, + ItemID.VAMPYRIUM_FROTHY_POTION_1, ItemID.VAMPYRIUM_FROTHY_POTION_2, ItemID.VAMPYRIUM_FROTHY_POTION_3, ItemID.VAMPYRIUM_FROTHY_POTION_4); add(zamorakBrew, ItemID._1DOSEPOTIONOFZAMORAK, ItemID._2DOSEPOTIONOFZAMORAK, ItemID._3DOSEPOTIONOFZAMORAK, ItemID._4DOSEPOTIONOFZAMORAK); add(new SaradominBrew(0.15, 0.2, 0.1, 2, 2), ItemID._1DOSEPOTIONOFSARADOMIN, ItemID._2DOSEPOTIONOFSARADOMIN, ItemID._3DOSEPOTIONOFSARADOMIN, ItemID._4DOSEPOTIONOFSARADOMIN, ItemID.BR_4DOSEPOTIONOFSARADOMIN, ItemID.BR_3DOSEPOTIONOFSARADOMIN, ItemID.BR_2DOSEPOTIONOFSARADOMIN, ItemID.BR_1DOSEPOTIONOFSARADOMIN /* LMS */); @@ -265,6 +266,7 @@ private void init() add(new MoonlightPotion(), ItemID._1DOSEMOONLIGHTPOTION, ItemID._2DOSEMOONLIGHTPOTION, ItemID._3DOSEMOONLIGHTPOTION, ItemID._4DOSEMOONLIGHTPOTION); add(combo(boost(HITPOINTS, perc(.10, 2)), boost(RANGED, perc(.10, 4)), new BoostedStatBoost(ATTACK, false, perc(.10, -2)), new BoostedStatBoost(STRENGTH, false, perc(.10, -2)), new BoostedStatBoost(DEFENCE, false, perc(.10, -2)), new BoostedStatBoost(MAGIC, false, perc(.10, -2))), ItemID._1DOSEARMADYLBREW, ItemID._2DOSEARMADYLBREW, ItemID._3DOSEARMADYLBREW, ItemID._4DOSEARMADYLBREW); + add(new SaradominBrew(0.15, 0.2, 0.0, 2, 1), ItemID.VAMPYRIUM_SLIMY_POTION_1, ItemID.VAMPYRIUM_SLIMY_POTION_2, ItemID.VAMPYRIUM_SLIMY_POTION_3, ItemID.VAMPYRIUM_SLIMY_POTION_4); // Mixed combat potions add(new MixedPotion(3, ATTACK_POT), ItemID.BRUTAL_1DOSE1ATTACK, ItemID.BRUTAL_2DOSE1ATTACK); @@ -305,13 +307,16 @@ private void init() add(superEnergyPot, ItemID._1DOSE2ENERGY, ItemID._2DOSE2ENERGY, ItemID._3DOSE2ENERGY, ItemID._4DOSE2ENERGY); add(superRestorePot, ItemID._1DOSE2RESTORE, ItemID._2DOSE2RESTORE, ItemID._3DOSE2RESTORE, ItemID._4DOSE2RESTORE, ItemID.BLIGHTED_1DOSE2RESTORE, ItemID.BLIGHTED_2DOSE2RESTORE, ItemID.BLIGHTED_3DOSE2RESTORE, ItemID.BLIGHTED_4DOSE2RESTORE, - ItemID.BR_4DOSE2RESTORE, ItemID.BR_3DOSE2RESTORE, ItemID.BR_2DOSE2RESTORE, ItemID.BR_1DOSE2RESTORE /* LMS */); + ItemID.BR_4DOSE2RESTORE, ItemID.BR_3DOSE2RESTORE, ItemID.BR_2DOSE2RESTORE, ItemID.BR_1DOSE2RESTORE, /* LMS */ + ItemID.VAMPYRIUM_CHUNKY_POTION_1, ItemID.VAMPYRIUM_CHUNKY_POTION_2, ItemID.VAMPYRIUM_CHUNKY_POTION_3, ItemID.VAMPYRIUM_CHUNKY_POTION_4); add(new SuperRestore(.30, 4), ItemID.SANFEW_SALVE_1_DOSE, ItemID.SANFEW_SALVE_2_DOSE, ItemID.SANFEW_SALVE_3_DOSE, ItemID.SANFEW_SALVE_4_DOSE, ItemID.BR_SANFEW_SALVE_4_DOSE, ItemID.BR_SANFEW_SALVE_3_DOSE, ItemID.BR_SANFEW_SALVE_2_DOSE, ItemID.BR_SANFEW_SALVE_1_DOSE /* LMS */); add(combo(heal(ATTACK, remedyHeal), heal(STRENGTH, remedyHeal), heal(DEFENCE, remedyHeal), heal(RANGED, remedyHeal), heal(MAGIC, remedyHeal)), ItemID._1DOSESTATRENEWAL, ItemID._2DOSESTATRENEWAL, ItemID._3DOSESTATRENEWAL, ItemID._4DOSESTATRENEWAL); - add(staminaPot, ItemID._1DOSESTAMINA, ItemID._2DOSESTAMINA, ItemID._3DOSESTAMINA, ItemID._4DOSESTAMINA); + add(staminaPot, ItemID._1DOSESTAMINA, ItemID._2DOSESTAMINA, ItemID._3DOSESTAMINA, ItemID._4DOSESTAMINA, + ItemID.VAMPYRIUM_STICKY_POTION_1, ItemID.VAMPYRIUM_STICKY_POTION_2, ItemID.VAMPYRIUM_STICKY_POTION_3, ItemID.VAMPYRIUM_STICKY_POTION_4); add(new StaminaPotion(40), ItemID._1DOSE2STAMINA, ItemID._2DOSE2STAMINA, ItemID._3DOSE2STAMINA, ItemID._4DOSE2STAMINA); add(heal(RUN_ENERGY, 40), ItemID._1DOSE3ENERGY, ItemID._2DOSE3ENERGY, ItemID._3DOSE3ENERGY, ItemID._4DOSE3ENERGY); + add(combo(heal(HITPOINTS, 99), heal(PRAYER, 99), heal(RUN_ENERGY, 100)), ItemID.VAMPYRIUM_CONGEALED_BLOOD); // Mixed recovery potions add(new MixedPotion(3, restorePot), ItemID.BRUTAL_1DOSESTATRESTORE, ItemID.BRUTAL_2DOSESTATRESTORE); From f7530663d6341c16d9571fda389ca3c83f949783 Mon Sep 17 00:00:00 2001 From: Jordan Atwood Date: Thu, 2 Jul 2026 17:27:11 -0700 Subject: [PATCH 03/27] item stats: remove inline comments These comments were useful prior to item IDs being referenced from gamevals, where items with the same ingame name would only be differentiated by ID. Now that we have the names given by Jagex, they are unambiguous, and usually include the same commented information in the name itself. --- .../plugins/itemstats/ItemStatChanges.java | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) 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 b09abae9820..0252e9286a5 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 @@ -73,7 +73,7 @@ private void init() { add(food(-5), ItemID.TBWT_POORLY_COOKED_KARAMBWAN); add(food(1), ItemID.POTATO, ItemID.ONION, ItemID.CABBAGE, ItemID.POT_OF_CREAM, ItemID.BOWL_ONION, ItemID.ANCHOVIES, ItemID.BOWL_NETTLEWATER, ItemID.EQUA_LEAVES, - ItemID.SWAN_MONKFISH /* Cooked */, ItemID.COOKED_CHICKEN_UNDEAD /* Undead */, ItemID.COOKED_MEAT_UNDEAD /* Undead */); + ItemID.SWAN_MONKFISH, ItemID.COOKED_CHICKEN_UNDEAD, ItemID.COOKED_MEAT_UNDEAD); add(food(2), ItemID.TOMATO, ItemID.BOWL_TOMATO, ItemID.BANANA, ItemID.TBWT_SLICED_BANANA, ItemID.ORANGE, ItemID.ORANGE_SLICES, ItemID.ORANGE_CHUNKS, ItemID.PINEAPPLE_RING, ItemID.PINEAPPLE_CHUNKS, ItemID.BOWL_CHILLI, ItemID.CHEESE, ItemID.SPINACH_ROLL, ItemID.LEMON, ItemID.LEMON_CHUNKS, ItemID.LEMON_SLICES, ItemID.LIME, ItemID.LIME_CHUNKS, ItemID.LIME_SLICES, ItemID.DWELLBERRIES, ItemID.KING_WORM, ItemID.BOWL_CARNE, ItemID.BOWL_SPICYTOMATO, ItemID.MDAUGHTER_WHITE_PEARL_FRUIT); @@ -97,7 +97,7 @@ private void init() add(food(9), ItemID.PREMADE_PINEAPPLE_PUNCH, ItemID.PINEAPPLE_PUNCH, ItemID.PREMADE_FRUIT_BLAST, ItemID.FRUIT_BLAST, ItemID.SALMON, ItemID.ANCHOVIE_PIZZA, ItemID.HALF_ANCHOVIE_PIZZA); add(food(10), ItemID.TUNA, ItemID.HUNDRED_PIRATE_GIANT_CRAB_MEAT_5, ItemID.BOWL_TUNA, ItemID.COOKED_CHOMPY, ItemID.PEST_FIELD_RATION, ItemID.DRAGONFRUIT, - ItemID.DEADMAN_STARTER_TUNA /* Deadman Starter Pack */); + ItemID.DEADMAN_STARTER_TUNA); add(food(11), ItemID.HUNTING_FISH_SPECIAL, ItemID.STEW, ItemID.PINEAPPLE_PIZZA, ItemID.HALF_PINEAPPLE_PIZZA, ItemID.HUNDRED_PIRATE_FISHCAKE, ItemID.PREMADE_VEGETABLE_BATTA, ItemID.VEGETABLE_BATTA, ItemID.PREMADE_WORM_BATTA, ItemID.WORM_BATTA, ItemID.PREMADE_TOAD_BATTA, ItemID.TOAD_BATTA, ItemID.PREMADE_CHEESE_TOM_BATTA, ItemID.CHEESE_TOM_BATTA, ItemID.PREMADE_FRUIT_BATTA, ItemID.FRUIT_BATTA, ItemID.BOWL_MUSHROOM_ONION, ItemID.RAIDS_BAT2_COOKED, ItemID.LAVA_EEL, ItemID.RAIDS_FISH2_COOKED, ItemID.MM_BANANA_STEW); @@ -108,9 +108,9 @@ private void init() add(food(15), ItemID.PREMADE_TANGLED_TOADS_LEGS, ItemID.TANGLED_TOADS_LEGS, ItemID.PREMADE_CHOCOLATE_BOMB, ItemID.CHOCOLATE_BOMB, ItemID._100_JUBBLY_MEAT_COOKED, ItemID.SWORDTIP_SQUID); add(food(16), ItemID.MONKFISH, ItemID.POTATO_CHEESE, ItemID.POTATO_EGG_TOMATO, ItemID.GAUNTLET_COMBO_FOOD, ItemID.GAUNTLET_COMBO_FOOD_HM); add(food(17), ItemID.RAIDS_FISH4_COOKED, ItemID.RAIDS_BAT4_COOKED, ItemID.GIANT_KRILL, ItemID.JUMBO_SQUID); - add(food(18), ItemID.TBWT_COOKED_KARAMBWAN, ItemID.BLIGHTED_KARAMBWAN, ItemID.BR_TBWT_COOKED_KARAMBWAN /* LMS */, ItemID.VAMPYRIUM_MYSTERY_KEBAB); + add(food(18), ItemID.TBWT_COOKED_KARAMBWAN, ItemID.BLIGHTED_KARAMBWAN, ItemID.BR_TBWT_COOKED_KARAMBWAN, ItemID.VAMPYRIUM_MYSTERY_KEBAB); add(food(19), ItemID.CURRY, ItemID.UGTHANKI_KEBAB_BAD, ItemID.UGTHANKI_KEBAB, ItemID.RAINBOW_CRAB_MEAT); - add(food(20), ItemID.POTATO_MUSHROOM_ONION, ItemID.SHARK, ItemID.RAIDS_FISH5_COOKED, ItemID.RAIDS_BAT5_COOKED, ItemID.HUNDRED_ILM_COOKED_STUFFED_SNAKE, ItemID.BR_SHARK /* LMS */, ItemID.GAUNTLET_FOOD, ItemID.EVENT_CORRUPTED_SHARK, ItemID.HALIBUT); + add(food(20), ItemID.POTATO_MUSHROOM_ONION, ItemID.SHARK, ItemID.RAIDS_FISH5_COOKED, ItemID.RAIDS_BAT5_COOKED, ItemID.HUNDRED_ILM_COOKED_STUFFED_SNAKE, ItemID.BR_SHARK, ItemID.GAUNTLET_FOOD, ItemID.EVENT_CORRUPTED_SHARK, ItemID.HALIBUT); add(food(21), ItemID.SEATURTLE); add(food(22), ItemID.MANTARAY, ItemID.BLIGHTED_MANTARAY, ItemID.DARK_CRAB, ItemID.POTATO_TUNA_SWEETCORN, ItemID.VAMPYRIUM_MYSTERY_JERKY); add(food(23), ItemID.RAIDS_FISH6_COOKED, ItemID.RAIDS_BAT6_COOKED); @@ -118,13 +118,13 @@ private void init() add(new Anglerfish(), ItemID.ANGLERFISH, ItemID.BLIGHTED_ANGLERFISH); add(food(maxHP -> (int) Math.ceil(maxHP * .06)), ItemID.STRAWBERRY); add(food(maxHP -> (int) Math.ceil(maxHP * .05)), ItemID.WATERMELON_SLICE); - add(food(perc(.1, 1)), ItemID.SWEETCORN_COOKED, ItemID.BOWL_SWEETCORN /* Bowl of cooked sweetcorn */); + add(food(perc(.1, 1)), ItemID.SWEETCORN_COOKED, ItemID.BOWL_SWEETCORN); add(new CookedBream(), ItemID.BREAM_FISH_COOKED); add(new CookedMossLizard(), ItemID.COOKED_LIZARD); - add(combo(food(1), boost(DEFENCE, perc(.02, 1))), ItemID.MAGIC_CABBAGE /* Draynor Manor */); + add(combo(food(1), boost(DEFENCE, perc(.02, 1))), ItemID.MAGIC_CABBAGE); add(combo(food(8), heal(RUN_ENERGY, 5)), ItemID.PAPAYA); - add(combo(food(3), boost(ATTACK, perc(.02, 2))), ItemID.CUP_OF_TEA /* Standard tea */); - add(combo(food(3), new NettleTeaRunEnergy()), ItemID.BOWL_NETTLETEA, ItemID.BOWL_NETTLETEA_MILKY /* Milky */, ItemID.CUP_OF_NETTLETEA /* Nettle */, ItemID.CUP_OF_NETTLETEA_MILKY /* Milky nettle */); + add(combo(food(3), boost(ATTACK, perc(.02, 2))), ItemID.CUP_OF_TEA); + add(combo(food(3), new NettleTeaRunEnergy()), ItemID.BOWL_NETTLETEA, ItemID.BOWL_NETTLETEA_MILKY, ItemID.CUP_OF_NETTLETEA, ItemID.CUP_OF_NETTLETEA_MILKY); add(range(food(5), food(7)), ItemID.SNAIL_CORPSE_COOKED1); add(range(food(5), food(8)), ItemID.SNAIL_CORPSE_COOKED2); add(range(food(7), food(9)), ItemID.SNAIL_CORPSE_COOKED3); @@ -162,7 +162,7 @@ private void init() add(combo(food(3), new SimpleStatBoost(STRENGTH, true, perc(.04, 1)), new BoostedStatBoost(ATTACK, false, perc(.05, -3))), ItemID.GROG); add(combo(food(1), boost(STRENGTH, perc(.02, 1)), new BoostedStatBoost(ATTACK, false, perc(.06, -1))), ItemID.BEER, ItemID.POH_BEER); add(combo(food(4), boost(STRENGTH, perc(.04, 2)), new BoostedStatBoost(ATTACK, false, perc(.1, -2))), ItemID.VIKING_TANKARD_FULL); - add(combo(food(15), boost(STRENGTH, perc(.1, 2)), new BoostedStatBoost(ATTACK, false, perc(.5, -4))), ItemID.KEG_OF_BEER /* Non-quest version */); + add(combo(food(15), boost(STRENGTH, perc(.1, 2)), new BoostedStatBoost(ATTACK, false, perc(.5, -4))), ItemID.KEG_OF_BEER); add(combo(boost(ATTACK, 5), boost(STRENGTH, 5), heal(MAGIC, -5), heal(PRAYER, -5)), ItemID.BLOOD_PINT); add(combo(food(1), boost(STRENGTH, 2), new BoostedStatBoost(ATTACK, false, perc(.05, -2))), ItemID.ASGARNIAN_ALE, ItemID.KEG_ASGARNIAN_ALE_1, ItemID.KEG_ASGARNIAN_ALE_2, ItemID.KEG_ASGARNIAN_ALE_3, ItemID.KEG_ASGARNIAN_ALE_4, ItemID.POH_ASGARNIAN_ALE); add(combo(food(1), boost(STRENGTH, 3), new BoostedStatBoost(ATTACK, false, perc(.05, -3))), ItemID.MATURE_ASGARNIAN_ALE, ItemID.KEG_MATURE_ASGARNIAN_ALE_1, ItemID.KEG_MATURE_ASGARNIAN_ALE_2, ItemID.KEG_MATURE_ASGARNIAN_ALE_3, ItemID.KEG_MATURE_ASGARNIAN_ALE_4); @@ -233,9 +233,9 @@ private void init() add(DEFENCE_POT, ItemID._1DOSE1DEFENSE, ItemID._2DOSE1DEFENSE, ItemID._3DOSE1DEFENSE, ItemID._4DOSE1DEFENSE); add(magicPot, ItemID._1DOSE1MAGIC, ItemID._2DOSE1MAGIC, ItemID._3DOSE1MAGIC, ItemID._4DOSE1MAGIC); add(rangingPot, ItemID._1DOSERANGERSPOTION, ItemID._2DOSERANGERSPOTION, ItemID._3DOSERANGERSPOTION, ItemID._4DOSERANGERSPOTION, - ItemID.BR_4DOSERANGERSPOTION, ItemID.BR_3DOSERANGERSPOTION, ItemID.BR_2DOSERANGERSPOTION, ItemID.BR_1DOSERANGERSPOTION /* LMS */); + ItemID.BR_4DOSERANGERSPOTION, ItemID.BR_3DOSERANGERSPOTION, ItemID.BR_2DOSERANGERSPOTION, ItemID.BR_1DOSERANGERSPOTION); add(combatPot, ItemID._1DOSECOMBAT, ItemID._2DOSECOMBAT, ItemID._3DOSECOMBAT, ItemID._4DOSECOMBAT, - ItemID._4DOSECOMBAT_DEADMAN_STARTER, ItemID._3DOSECOMBAT_DEADMAN_STARTER, ItemID._2DOSECOMBAT_DEADMAN_STARTER, ItemID._1DOSECOMBAT_DEADMAN_STARTER /* Deadman starter pack */); + ItemID._4DOSECOMBAT_DEADMAN_STARTER, ItemID._3DOSECOMBAT_DEADMAN_STARTER, ItemID._2DOSECOMBAT_DEADMAN_STARTER, ItemID._1DOSECOMBAT_DEADMAN_STARTER); add(SUPER_ATTACK_POT, ItemID._1DOSE2ATTACK, ItemID._2DOSE2ATTACK, ItemID._3DOSE2ATTACK, ItemID._4DOSE2ATTACK); add(SUPER_STRENGTH_POT, ItemID._1DOSE2STRENGTH, ItemID._2DOSE2STRENGTH, ItemID._3DOSE2STRENGTH, ItemID._4DOSE2STRENGTH); add(SUPER_DEFENCE_POT, ItemID._1DOSE2DEFENSE, ItemID._2DOSE2DEFENSE, ItemID._3DOSE2DEFENSE, ItemID._4DOSE2DEFENSE); @@ -244,7 +244,7 @@ private void init() ItemID.VAMPYRIUM_FROTHY_POTION_1, ItemID.VAMPYRIUM_FROTHY_POTION_2, ItemID.VAMPYRIUM_FROTHY_POTION_3, ItemID.VAMPYRIUM_FROTHY_POTION_4); add(zamorakBrew, ItemID._1DOSEPOTIONOFZAMORAK, ItemID._2DOSEPOTIONOFZAMORAK, ItemID._3DOSEPOTIONOFZAMORAK, ItemID._4DOSEPOTIONOFZAMORAK); add(new SaradominBrew(0.15, 0.2, 0.1, 2, 2), ItemID._1DOSEPOTIONOFSARADOMIN, ItemID._2DOSEPOTIONOFSARADOMIN, ItemID._3DOSEPOTIONOFSARADOMIN, - ItemID._4DOSEPOTIONOFSARADOMIN, ItemID.BR_4DOSEPOTIONOFSARADOMIN, ItemID.BR_3DOSEPOTIONOFSARADOMIN, ItemID.BR_2DOSEPOTIONOFSARADOMIN, ItemID.BR_1DOSEPOTIONOFSARADOMIN /* LMS */); + ItemID._4DOSEPOTIONOFSARADOMIN, ItemID.BR_4DOSEPOTIONOFSARADOMIN, ItemID.BR_3DOSEPOTIONOFSARADOMIN, ItemID.BR_2DOSEPOTIONOFSARADOMIN, ItemID.BR_1DOSEPOTIONOFSARADOMIN); add(superRangingPot, ItemID.NZONE1DOSE2RANGERSPOTION, ItemID.NZONE2DOSE2RANGERSPOTION, ItemID.NZONE3DOSE2RANGERSPOTION, ItemID.NZONE4DOSE2RANGERSPOTION); add(superMagicPot, ItemID.NZONE1DOSE2MAGICPOTION, ItemID.NZONE2DOSE2MAGICPOTION, ItemID.NZONE3DOSE2MAGICPOTION, ItemID.NZONE4DOSE2MAGICPOTION); add(combo(rangingPot, SUPER_DEFENCE_POT), ItemID._1DOSEBASTION, ItemID._2DOSEBASTION, ItemID._3DOSEBASTION, ItemID._4DOSEBASTION); @@ -260,7 +260,7 @@ private void init() add(combo(SUPER_ATTACK_POT, SUPER_STRENGTH_POT, SUPER_DEFENCE_POT, rangingPot, imbuedHeart), ItemID._4DOSE_CASTLEWARS_SKILL_POTION, ItemID._3DOSE_CASTLEWARS_SKILL_POTION, ItemID._2DOSE_CASTLEWARS_SKILL_POTION, ItemID._1DOSE_CASTLEWARS_SKILL_POTION); add(combo(SUPER_ATTACK_POT, SUPER_STRENGTH_POT), - ItemID.BR_4DOSE2COMBAT, ItemID.BR_3DOSE2COMBAT, ItemID.BR_2DOSE2COMBAT, ItemID.BR_1DOSE2COMBAT /* LMS */); + ItemID.BR_4DOSE2COMBAT, ItemID.BR_3DOSE2COMBAT, ItemID.BR_2DOSE2COMBAT, ItemID.BR_1DOSE2COMBAT); add(ancientBrew, ItemID._1DOSEANCIENTBREW, ItemID._2DOSEANCIENTBREW, ItemID._3DOSEANCIENTBREW, ItemID._4DOSEANCIENTBREW); add(new AncientBrew(.08, 3), ItemID._1DOSEFORGOTTENBREW, ItemID._2DOSEFORGOTTENBREW, ItemID._3DOSEFORGOTTENBREW, ItemID._4DOSEFORGOTTENBREW); add(new MoonlightPotion(), ItemID._1DOSEMOONLIGHTPOTION, ItemID._2DOSEMOONLIGHTPOTION, ItemID._3DOSEMOONLIGHTPOTION, ItemID._4DOSEMOONLIGHTPOTION); @@ -307,10 +307,10 @@ private void init() add(superEnergyPot, ItemID._1DOSE2ENERGY, ItemID._2DOSE2ENERGY, ItemID._3DOSE2ENERGY, ItemID._4DOSE2ENERGY); add(superRestorePot, ItemID._1DOSE2RESTORE, ItemID._2DOSE2RESTORE, ItemID._3DOSE2RESTORE, ItemID._4DOSE2RESTORE, ItemID.BLIGHTED_1DOSE2RESTORE, ItemID.BLIGHTED_2DOSE2RESTORE, ItemID.BLIGHTED_3DOSE2RESTORE, ItemID.BLIGHTED_4DOSE2RESTORE, - ItemID.BR_4DOSE2RESTORE, ItemID.BR_3DOSE2RESTORE, ItemID.BR_2DOSE2RESTORE, ItemID.BR_1DOSE2RESTORE, /* LMS */ + ItemID.BR_4DOSE2RESTORE, ItemID.BR_3DOSE2RESTORE, ItemID.BR_2DOSE2RESTORE, ItemID.BR_1DOSE2RESTORE, ItemID.VAMPYRIUM_CHUNKY_POTION_1, ItemID.VAMPYRIUM_CHUNKY_POTION_2, ItemID.VAMPYRIUM_CHUNKY_POTION_3, ItemID.VAMPYRIUM_CHUNKY_POTION_4); add(new SuperRestore(.30, 4), ItemID.SANFEW_SALVE_1_DOSE, ItemID.SANFEW_SALVE_2_DOSE, ItemID.SANFEW_SALVE_3_DOSE, ItemID.SANFEW_SALVE_4_DOSE, - ItemID.BR_SANFEW_SALVE_4_DOSE, ItemID.BR_SANFEW_SALVE_3_DOSE, ItemID.BR_SANFEW_SALVE_2_DOSE, ItemID.BR_SANFEW_SALVE_1_DOSE /* LMS */); + ItemID.BR_SANFEW_SALVE_4_DOSE, ItemID.BR_SANFEW_SALVE_3_DOSE, ItemID.BR_SANFEW_SALVE_2_DOSE, ItemID.BR_SANFEW_SALVE_1_DOSE); add(combo(heal(ATTACK, remedyHeal), heal(STRENGTH, remedyHeal), heal(DEFENCE, remedyHeal), heal(RANGED, remedyHeal), heal(MAGIC, remedyHeal)), ItemID._1DOSESTATRENEWAL, ItemID._2DOSESTATRENEWAL, ItemID._3DOSESTATRENEWAL, ItemID._4DOSESTATRENEWAL); add(staminaPot, ItemID._1DOSESTAMINA, ItemID._2DOSESTAMINA, ItemID._3DOSESTAMINA, ItemID._4DOSESTAMINA, ItemID.VAMPYRIUM_STICKY_POTION_1, ItemID.VAMPYRIUM_STICKY_POTION_2, ItemID.VAMPYRIUM_STICKY_POTION_3, ItemID.VAMPYRIUM_STICKY_POTION_4); From 1b747c7c1d55f211382febf753bd46d210f4f2f8 Mon Sep 17 00:00:00 2001 From: Jordan Atwood Date: Thu, 2 Jul 2026 17:29:05 -0700 Subject: [PATCH 04/27] item stats: add Stymphike tatare --- .../net/runelite/client/plugins/itemstats/ItemStatChanges.java | 1 + 1 file changed, 1 insertion(+) 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 0252e9286a5..c25cefb0d64 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 @@ -115,6 +115,7 @@ private void init() add(food(22), ItemID.MANTARAY, ItemID.BLIGHTED_MANTARAY, ItemID.DARK_CRAB, ItemID.POTATO_TUNA_SWEETCORN, ItemID.VAMPYRIUM_MYSTERY_JERKY); add(food(23), ItemID.RAIDS_FISH6_COOKED, ItemID.RAIDS_BAT6_COOKED); add(food(24), ItemID.MARLIN); + add(food(26), ItemID.STYMPHIKE_TARTARE); add(new Anglerfish(), ItemID.ANGLERFISH, ItemID.BLIGHTED_ANGLERFISH); add(food(maxHP -> (int) Math.ceil(maxHP * .06)), ItemID.STRAWBERRY); add(food(maxHP -> (int) Math.ceil(maxHP * .05)), ItemID.WATERMELON_SLICE); From a88ac64d5a154020cdc21612fc0f1eb32aa8d0f8 Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 2 Jul 2026 20:28:18 -0400 Subject: [PATCH 05/27] gpu: add model transparency support --- .../src/main/java/net/runelite/api/Model.java | 2 + .../plugins/gpu/FacePrioritySorter.java | 49 ++++++++++++++----- .../client/plugins/gpu/GpuPlugin.java | 2 +- 3 files changed, 39 insertions(+), 14 deletions(-) diff --git a/runelite-api/src/main/java/net/runelite/api/Model.java b/runelite-api/src/main/java/net/runelite/api/Model.java index 456b82e87f4..598f2dabfbc 100644 --- a/runelite-api/src/main/java/net/runelite/api/Model.java +++ b/runelite-api/src/main/java/net/runelite/api/Model.java @@ -52,6 +52,8 @@ public interface Model extends Mesh, Renderable void calculateBoundsCylinder(); + byte getTransparency(); + byte[] getFaceRenderPriorities(); byte[] getFaceBias(); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/gpu/FacePrioritySorter.java b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/FacePrioritySorter.java index eb20b4887da..789d40a8463 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/gpu/FacePrioritySorter.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/FacePrioritySorter.java @@ -106,6 +106,7 @@ int uploadSortedModel(Projection proj, Model model, int orientation, int x, int final short[] faceTextures = model.getFaceTextures(); final byte[] transparencies = model.getFaceTransparencies(); + final byte modelTransparency = model.getTransparency(); final byte[] bias = model.getFaceBias(); float orientSine = 0; @@ -232,7 +233,7 @@ int uploadSortedModel(Projection proj, Model model, int orientation, int x, int } int alphaBias = 0; - alphaBias |= transparencies != null ? (transparencies[faceIdx] & 0xff) << 24 : 0; + alphaBias |= faceTransparency(modelTransparency, transparencies != null ? transparencies[faceIdx] & 0xff : 0) << 24; alphaBias |= bias != null ? (bias[faceIdx] & 0xff) << 16 : 0; int texture = faceTextures != null ? faceTextures[faceIdx] + 1 : 0; @@ -268,8 +269,9 @@ int uploadSortedModel(Projection proj, Model model, int orientation, int x, int { for (char face = zsortHead[i]; face != (char) -1; face = zsortNext[face]) { - var b = transparencies != null && transparencies[face] != 0 ? alphaBuffer : opaqueBuffer; - b.put(vertexBuffer, face * FACE_SIZE, FACE_SIZE); + int offset = face * FACE_SIZE; + var b = (vertexBuffer[offset + 3] & 0xff000000) != 0 ? alphaBuffer : opaqueBuffer; + b.put(vertexBuffer, offset, FACE_SIZE); } } } @@ -346,8 +348,9 @@ else if (pri == 10) while (pri == 0 && currFaceDistance > avg12) { final int face = dynFaces[drawnFaces++]; - var b = transparencies != null && transparencies[face] != 0 ? alphaBuffer : opaqueBuffer; - b.put(vertexBuffer, face * FACE_SIZE, FACE_SIZE); + int offset = face * FACE_SIZE; + var b = (vertexBuffer[offset + 3] & 0xff000000) != 0 ? alphaBuffer : opaqueBuffer; + b.put(vertexBuffer, offset, FACE_SIZE); if (drawnFaces == numDynFaces && dynFaces != orderedFaces[11]) { @@ -370,8 +373,9 @@ else if (pri == 10) while (pri == 3 && currFaceDistance > avg34) { final int face = dynFaces[drawnFaces++]; - var b = transparencies != null && transparencies[face] != 0 ? alphaBuffer : opaqueBuffer; - b.put(vertexBuffer, face * FACE_SIZE, FACE_SIZE); + int offset = face * FACE_SIZE; + var b = (vertexBuffer[offset + 3] & 0xff000000) != 0 ? alphaBuffer : opaqueBuffer; + b.put(vertexBuffer, offset, FACE_SIZE); if (drawnFaces == numDynFaces && dynFaces != orderedFaces[11]) { @@ -394,8 +398,9 @@ else if (pri == 10) while (pri == 5 && currFaceDistance > avg68) { final int face = dynFaces[drawnFaces++]; - var b = transparencies != null && transparencies[face] != 0 ? alphaBuffer : opaqueBuffer; - b.put(vertexBuffer, face * FACE_SIZE, FACE_SIZE); + int offset = face * FACE_SIZE; + var b = (vertexBuffer[offset + 3] & 0xff000000) != 0 ? alphaBuffer : opaqueBuffer; + b.put(vertexBuffer, offset, FACE_SIZE); if (drawnFaces == numDynFaces && dynFaces != orderedFaces[11]) { @@ -421,16 +426,18 @@ else if (pri == 10) for (int faceIdx = 0; faceIdx < priNum; ++faceIdx) { final int face = priFaces[faceIdx]; - var b = transparencies != null && transparencies[face] != 0 ? alphaBuffer : opaqueBuffer; - b.put(vertexBuffer, face * FACE_SIZE, FACE_SIZE); + int offset = face * FACE_SIZE; + var b = (vertexBuffer[offset + 3] & 0xff000000) != 0 ? alphaBuffer : opaqueBuffer; + b.put(vertexBuffer, offset, FACE_SIZE); } } while (currFaceDistance != -1000) { final int face = dynFaces[drawnFaces++]; - var b = transparencies != null && transparencies[face] != 0 ? alphaBuffer : opaqueBuffer; - b.put(vertexBuffer, face * FACE_SIZE, FACE_SIZE); + int offset = face * FACE_SIZE; + var b = (vertexBuffer[offset + 3] & 0xff000000) != 0 ? alphaBuffer : opaqueBuffer; + b.put(vertexBuffer, offset, FACE_SIZE); if (drawnFaces == numDynFaces && dynFaces != orderedFaces[11]) { @@ -453,4 +460,20 @@ else if (pri == 10) return len; } + + private static int faceTransparency(byte modelTransparency, int faceTransparency) + { + if (modelTransparency == -1) + { + return 255; + } + int t = modelTransparency & 255; + if (t > 0 && faceTransparency < 253) + { + int a = (253 - faceTransparency) * t >> 8; + assert (faceTransparency & 255) == faceTransparency; + return faceTransparency + a; + } + return faceTransparency; + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java index 7556fbb4ad8..80b9a2a4bf3 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java @@ -1220,7 +1220,7 @@ public void drawTemp(Projection worldProjection, Scene scene, GameObject gameObj Renderable renderable = gameObject.getRenderable(); int size = m.getFaceCount() * 3 * VAO.VERT_SIZE; int renderMode = renderable.getRenderMode(); - if (renderMode == Renderable.RENDERMODE_SORTED_NO_DEPTH || m.getFaceTransparencies() != null) + if (renderMode == Renderable.RENDERMODE_SORTED_NO_DEPTH || m.getFaceTransparencies() != null || m.getTransparency() != 0) { VAO o = vaoO.get(size); VAO a = vaoA.get(size); From 6f338c069e03f0b731e2b80f74734aaf96ddc8a6 Mon Sep 17 00:00:00 2001 From: LlemonDuck Date: Tue, 30 Jun 2026 02:19:51 -0400 Subject: [PATCH 06/27] api: RLO rendermodes --- .../net/runelite/api/RuneLiteObjectController.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/runelite-api/src/main/java/net/runelite/api/RuneLiteObjectController.java b/runelite-api/src/main/java/net/runelite/api/RuneLiteObjectController.java index 2d120e6591e..b2b6ce7e900 100644 --- a/runelite-api/src/main/java/net/runelite/api/RuneLiteObjectController.java +++ b/runelite-api/src/main/java/net/runelite/api/RuneLiteObjectController.java @@ -27,6 +27,7 @@ import lombok.Getter; import lombok.Setter; import net.runelite.api.coords.LocalPoint; +import org.intellij.lang.annotations.MagicConstant; @Getter @Setter @@ -62,6 +63,19 @@ public abstract class RuneLiteObjectController */ private int orientation = 0; + /** + * The render mode to use when drawing the model. + * @see net.runelite.api.Renderable + */ + @MagicConstant(intValues = { + Renderable.RENDERMODE_DEFAULT, + Renderable.RENDERMODE_SORTED, + Renderable.RENDERMODE_SORTED_NO_DEPTH, + Renderable.RENDERMODE_UNSORTED, + Renderable.RENDERMODE_UNSORTED_NO_DEPTH, + }) + private int renderMode = Renderable.RENDERMODE_DEFAULT; + /** * Sets the location in the scene for the RuneLiteObjectController */ From d4d714579577f7f32405d0d16285abe29e04deb4 Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 4 Jul 2026 14:56:09 -0400 Subject: [PATCH 07/27] api: add animation left/right hand item --- .../src/main/java/net/runelite/api/Animation.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/runelite-api/src/main/java/net/runelite/api/Animation.java b/runelite-api/src/main/java/net/runelite/api/Animation.java index fcfecbb131f..95adf226984 100644 --- a/runelite-api/src/main/java/net/runelite/api/Animation.java +++ b/runelite-api/src/main/java/net/runelite/api/Animation.java @@ -75,4 +75,18 @@ public interface Animation * {@code null} for {@link #isMayaAnim()} animations */ int[] getFrameLengths(); + + /** + * Get the left hand item for this animation + * @see net.runelite.api.gameval.ItemID + * @return the item id or -1 + */ + int getLeftHandItem(); + + /** + * Get the right hand item for this animation + * @see net.runelite.api.gameval.ItemID + * @return the item id or -1 + */ + int getRightHandItem(); } From fdceaf8bf3ab58d511878a8059a199b168e528c4 Mon Sep 17 00:00:00 2001 From: RuneLite Cache-Code Autoupdater Date: Wed, 8 Jul 2026 10:35:52 +0000 Subject: [PATCH 08/27] Update Item variations to 2026-07-08-rev239 --- .../src/main/resources/item_variations.json | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/runelite-client/src/main/resources/item_variations.json b/runelite-client/src/main/resources/item_variations.json index 7ca35830253..bed50ae044c 100644 --- a/runelite-client/src/main/resources/item_variations.json +++ b/runelite-client/src/main/resources/item_variations.json @@ -1636,6 +1636,10 @@ 8282, 11710 ], + "stake": [ + 1549, + 16492 + ], "pet kitten": [ 1555, 1556, @@ -3026,9 +3030,14 @@ 2888, 2889 ], + "golden key": [ + 2944, + 16494 + ], "iron key": [ 2945, - 8869 + 8869, + 16495 ], "golden feather": [ 2950, @@ -11874,7 +11883,9 @@ ], "ancient sceptre": [ 27624, - 27626 + 27626, + 33827, + 33829 ], "forgotten brew": [ 27629, @@ -14009,10 +14020,6 @@ 33673, 33675 ], - "tarnished necklace": [ - 33689, - 33691 - ], "drakan emblem": [ 33731, 33732, From 620c4c944dff40f93c1c258417cb616a1b8cd9e6 Mon Sep 17 00:00:00 2001 From: RuneLite Cache-Code Autoupdater Date: Wed, 8 Jul 2026 10:35:54 +0000 Subject: [PATCH 09/27] Update Legacy ID classes to 2026-07-08-rev239 --- runelite-api/src/main/java/net/runelite/api/ItemID.java | 9 +++++++-- runelite-api/src/main/java/net/runelite/api/NpcID.java | 2 +- .../src/main/java/net/runelite/api/NullItemID.java | 2 ++ 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/runelite-api/src/main/java/net/runelite/api/ItemID.java b/runelite-api/src/main/java/net/runelite/api/ItemID.java index b8d0b9058d3..810f1abca37 100644 --- a/runelite-api/src/main/java/net/runelite/api/ItemID.java +++ b/runelite-api/src/main/java/net/runelite/api/ItemID.java @@ -8629,6 +8629,9 @@ public final class ItemID public static final int CABBAGE_RUNE = 13680; public static final int CRUCIFEROUS_CODEX = 13681; public static final int PHARAOHS_SCEPTRE_16176 = 16176; + public static final int STAKE_16492 = 16492; + public static final int GOLDEN_KEY_16494 = 16494; + public static final int IRON_KEY_16495 = 16495; public static final int USELESS_KEY_16684 = 16684; public static final int NEW_CRYSTAL_BOW_16888 = 16888; public static final int NEW_CRYSTAL_BOW_I_16889 = 16889; @@ -16395,8 +16398,8 @@ public final class ItemID public static final int TARNISHED_BATTLEAXE = 33683; public static final int TARNISHED_HALBERD = 33685; public static final int TARNISHED_RING = 33687; - public static final int TARNISHED_NECKLACE = 33689; - public static final int TARNISHED_NECKLACE_33691 = 33691; + public static final int TARNISHED_BRACELET = 33689; + public static final int TARNISHED_NECKLACE = 33691; public static final int TARNISHED_AMULET = 33693; public static final int VENATOR_HEART = 33695; public static final int DRIED_OUT_VENATOR_HEART = 33697; @@ -16519,5 +16522,7 @@ public final class ItemID public static final int STYMPHIKE = 33824; public static final int LETVEK_33825 = 33825; public static final int VENATOR = 33826; + public static final int ANCIENT_SCEPTRE_L_BROKEN = 33827; + public static final int ANCIENT_SCEPTRE_L_MANGLED = 33829; /* This file is automatically generated. Do not edit. */ } diff --git a/runelite-api/src/main/java/net/runelite/api/NpcID.java b/runelite-api/src/main/java/net/runelite/api/NpcID.java index d719f1104a8..675835fee59 100644 --- a/runelite-api/src/main/java/net/runelite/api/NpcID.java +++ b/runelite-api/src/main/java/net/runelite/api/NpcID.java @@ -13108,7 +13108,7 @@ public final class NpcID public static final int VENATOR_15767 = 15767; public static final int VENATOR_15768 = 15768; public static final int VENATOR_15769 = 15769; - public static final int SUPERIOR_VENATOR = 15770; + public static final int BLOODSTARVED_VENATOR = 15770; public static final int VASILE = 15772; public static final int VASILE_15773 = 15773; public static final int OLD_MAN_RAL = 15774; diff --git a/runelite-api/src/main/java/net/runelite/api/NullItemID.java b/runelite-api/src/main/java/net/runelite/api/NullItemID.java index a10f7862afc..2a3d4a319cd 100644 --- a/runelite-api/src/main/java/net/runelite/api/NullItemID.java +++ b/runelite-api/src/main/java/net/runelite/api/NullItemID.java @@ -16990,5 +16990,7 @@ public final class NullItemID public static final int NULL_33723 = 33723; public static final int NULL_33822 = 33822; public static final int NULL_33823 = 33823; + public static final int NULL_33828 = 33828; + public static final int NULL_33830 = 33830; /* This file is automatically generated. Do not edit. */ } From b33a991783926b2d51e009f6f0d63df592e0d131 Mon Sep 17 00:00:00 2001 From: RuneLite Cache-Code Autoupdater Date: Wed, 8 Jul 2026 10:36:17 +0000 Subject: [PATCH 10/27] Update GameVals to 2026-07-08-rev239 --- .../net/runelite/api/gameval/AnimationID.java | 1 + .../net/runelite/api/gameval/DBTableID.java | 20 ++++++++-- .../net/runelite/api/gameval/InterfaceID.java | 18 +++++++++ .../java/net/runelite/api/gameval/ItemID.java | 29 +++++++++++++- .../java/net/runelite/api/gameval/NpcID.java | 2 +- .../net/runelite/api/gameval/SpotanimID.java | 1 + .../net/runelite/api/gameval/SpriteID.java | 2 + .../net/runelite/api/gameval/VarPlayerID.java | 3 ++ .../net/runelite/api/gameval/VarbitID.java | 39 +++++++++++++++++++ 9 files changed, 110 insertions(+), 5 deletions(-) diff --git a/runelite-api/src/main/java/net/runelite/api/gameval/AnimationID.java b/runelite-api/src/main/java/net/runelite/api/gameval/AnimationID.java index 7bd742765a5..60e574d4d06 100644 --- a/runelite-api/src/main/java/net/runelite/api/gameval/AnimationID.java +++ b/runelite-api/src/main/java/net/runelite/api/gameval/AnimationID.java @@ -570,6 +570,7 @@ public final class AnimationID public static final int CHATBORED2 = 563; public static final int CHATBORED3 = 564; public static final int CHATBORED4 = 565; + public static final int HUMAN_WEAPONS_CRIMSON_KISTEN_ATTACK_ALT = 566; public static final int CHATHAP1 = 567; public static final int CHATHAP2 = 568; public static final int CHATHAP3 = 569; diff --git a/runelite-api/src/main/java/net/runelite/api/gameval/DBTableID.java b/runelite-api/src/main/java/net/runelite/api/gameval/DBTableID.java index 8806b676944..c74cd09120d 100644 --- a/runelite-api/src/main/java/net/runelite/api/gameval/DBTableID.java +++ b/runelite-api/src/main/java/net/runelite/api/gameval/DBTableID.java @@ -5045,15 +5045,20 @@ public static final class Music */ public static final int COL_SECONDARY_TRACK = 11; + /** + * dbrow + */ + public static final int COL_PARENT_TRACK = 12; + /** * integer */ - public static final int COL_RELEASE_TYPE = 12; + public static final int COL_RELEASE_TYPE = 13; /** * integer */ - public static final int COL_RELATED_CONTENT = 13; + public static final int COL_RELATED_CONTENT = 14; public static final class Row { @@ -22272,7 +22277,6 @@ public static final class Row public static final int SKILL_FEATURE_AGILITY_VAMPYRIUM_CRAWL = 16895; public static final int SKILL_FEATURE_AGILITY_VAMPYRIUM_PILLAR_JUMPS = 16896; public static final int SKILL_FEATURE_AGILITY_VAMPYRIUM_SLIDES = 16897; - public static final int SKILL_FEATURE_CRAFTING_NECKLACE_OF_RUPTURE = 16898; public static final int SKILL_FEATURE_FISHING_LEECHFIN = 16899; public static final int SKILL_FEATURE_HITPOINTS_NECKLACEOFRUPTURE = 16900; public static final int SKILL_FEATURE_HUNTER_STYMPHIKE = 16901; @@ -23609,6 +23613,16 @@ public static final class CastleDrakanDoor */ public static final int COL_MAP_DETAILS = 9; + /** + * dbrow + */ + public static final int COL_UNLOCK_SIDE = 10; + + /** + * namedobj + */ + public static final int COL_KEY = 11; + /** * integer */ diff --git a/runelite-api/src/main/java/net/runelite/api/gameval/InterfaceID.java b/runelite-api/src/main/java/net/runelite/api/gameval/InterfaceID.java index 39c727293c4..b652d7b8272 100644 --- a/runelite-api/src/main/java/net/runelite/api/gameval/InterfaceID.java +++ b/runelite-api/src/main/java/net/runelite/api/gameval/InterfaceID.java @@ -934,6 +934,7 @@ public final class InterfaceID public static final int EVENT_REWARDS = 927; public static final int BALLOT = 928; public static final int TUTORIAL_PLAYER_EXPERIENCE = 929; + public static final int SANGVESTI_WORLD_MAP = 930; public static final int SAILING_BT_HUD = 931; public static final int SAILING_BT_SELECTION = 932; public static final int SAILING_BT_STATISTICS = 933; @@ -30464,6 +30465,22 @@ public static final class TutorialPlayerExperience public static final int BUTTON_EXPERIENCED = 0x03a1_0007; } + public static final class SangvestiWorldMap + { + public static final int UNIVERSE = 0x03a2_0000; + public static final int CONTENTS = 0x03a2_0001; + public static final int FRAME = 0x03a2_0002; + public static final int BACKGROUND = 0x03a2_0003; + public static final int DRAG = 0x03a2_0004; + public static final int MAIN = 0x03a2_0005; + public static final int MAP = 0x03a2_0006; + public static final int MAP_GRAPHIC0 = 0x03a2_0007; + public static final int MAP_BACK = 0x03a2_0008; + public static final int MAP_FRONT = 0x03a2_0009; + public static final int CLOSE = 0x03a2_000a; + public static final int TOOLTIP = 0x03a2_000b; + } + public static final class SailingBtHud { public static final int UNIVERSE = 0x03a3_0000; @@ -31328,6 +31345,7 @@ public static final class CastleDrakanWorldMap public static final int MAP_BACK = 0x03c7_000c; public static final int MAP_FRONT = 0x03c7_000d; public static final int CLOSE = 0x03c7_000e; + public static final int TOOLTIP = 0x03c7_000f; } public static final class Myq6IntegrityBar diff --git a/runelite-api/src/main/java/net/runelite/api/gameval/ItemID.java b/runelite-api/src/main/java/net/runelite/api/gameval/ItemID.java index 0d774943843..d75f8d97d4b 100644 --- a/runelite-api/src/main/java/net/runelite/api/gameval/ItemID.java +++ b/runelite-api/src/main/java/net/runelite/api/gameval/ItemID.java @@ -46496,6 +46496,21 @@ public final class ItemID */ public static final int PLACEHOLDER_NTK_JEWELLED_SCEPTRE_8 = 16176; + /** + * Stake + */ + public static final int PLACEHOLDER_STAKE = 16492; + + /** + * Golden key + */ + public static final int PLACEHOLDER_PIPKEY_GOLD = 16494; + + /** + * Iron key + */ + public static final int PLACEHOLDER_PIPKEY_IRON = 16495; + /** * Useless key */ @@ -88044,7 +88059,7 @@ public final class ItemID public static final int TARNISHED_RING = 33687; /** - * Tarnished necklace + * Tarnished bracelet */ public static final int TARNISHED_BRACELET = 33689; @@ -88663,6 +88678,16 @@ public final class ItemID */ public static final int SLAYERGUIDE_VENATOR = 33826; + /** + * Ancient sceptre (l) (broken) + */ + public static final int ANCIENT_SCEPTRE_TROUVER_BROKEN = 33827; + + /** + * Ancient sceptre (l) (mangled) + */ + public static final int ANCIENT_SCEPTRE_TROUVER_MANGLED = 33829; + public static final class Cert { public static final int TWPART1 = 7; @@ -102963,6 +102988,8 @@ public static final class Placeholder public static final int HALLOWED_FLAIL = 33719; public static final int SUNSPEAR = 33723; public static final int RAW_IMPALER_MEAT = 33823; + public static final int ANCIENT_SCEPTRE_TROUVER_BROKEN = 33828; + public static final int ANCIENT_SCEPTRE_TROUVER_MANGLED = 33830; } /* This file is automatically generated. Do not edit. */ } diff --git a/runelite-api/src/main/java/net/runelite/api/gameval/NpcID.java b/runelite-api/src/main/java/net/runelite/api/gameval/NpcID.java index fbf9e81f7b7..b6d811857c9 100644 --- a/runelite-api/src/main/java/net/runelite/api/gameval/NpcID.java +++ b/runelite-api/src/main/java/net/runelite/api/gameval/NpcID.java @@ -68279,7 +68279,7 @@ public final class NpcID public static final int VENATOR_5 = 15769; /** - * Superior venator + * Blood-starved venator */ public static final int SUPERIOR_VENATOR = 15770; public static final int BURGH_BREWING_HELPER = 15771; diff --git a/runelite-api/src/main/java/net/runelite/api/gameval/SpotanimID.java b/runelite-api/src/main/java/net/runelite/api/gameval/SpotanimID.java index b158cd0bb28..7bbac1fc73c 100644 --- a/runelite-api/src/main/java/net/runelite/api/gameval/SpotanimID.java +++ b/runelite-api/src/main/java/net/runelite/api/gameval/SpotanimID.java @@ -1796,6 +1796,7 @@ public final class SpotanimID public static final int ELDRITCH_SMOKE_IMPACT = 1789; public static final int VANSTROM_BLOODVELD_BURST = 1790; public static final int VANSTROM_ORB_EXPLODE = 1791; + public static final int MAGGOT_KING_POISON_PROJECTILE = 1792; public static final int VANSTROM_ENRAGE_POWERUP = 1793; public static final int VANSTROM_LIGHTNING = 1794; public static final int HALLOWED_GRAPPLE_SPOT = 1795; diff --git a/runelite-api/src/main/java/net/runelite/api/gameval/SpriteID.java b/runelite-api/src/main/java/net/runelite/api/gameval/SpriteID.java index 5d95cd3e551..fdcc37063c6 100644 --- a/runelite-api/src/main/java/net/runelite/api/gameval/SpriteID.java +++ b/runelite-api/src/main/java/net/runelite/api/gameval/SpriteID.java @@ -857,6 +857,7 @@ public final class SpriteID public static final int CASTLE_DRAKAN_ROOM_51 = 8511; public static final int LEAFYTREE_DARKWOOD = 8512; public static final int LEAFYTREE_DARKWOOD_TILED = 8513; + public static final int SANGVESTI = 8515; public static final class _2XStandardSpellsOn { @@ -12315,5 +12316,6 @@ public static final class CastleDrakanRoomIcons public static final int _1 = 8455; public static final int _2 = 8456; public static final int _3 = 8457; + public static final int _4 = 8514; } } diff --git a/runelite-api/src/main/java/net/runelite/api/gameval/VarPlayerID.java b/runelite-api/src/main/java/net/runelite/api/gameval/VarPlayerID.java index 4cd6bc5fc26..cb386dd122e 100644 --- a/runelite-api/src/main/java/net/runelite/api/gameval/VarPlayerID.java +++ b/runelite-api/src/main/java/net/runelite/api/gameval/VarPlayerID.java @@ -2918,5 +2918,8 @@ public final class VarPlayerID public static final int MAGGOT_KING_ATTEMPTS = 5665; public static final int DRAKAN_ENCOUNTER_ATTEMPTS = 5666; public static final int DRAKAN_FINAL_MIN_HP = 5667; + public static final int SANGVESTI_GENERAL_3 = 5668; + public static final int SANGVESTI_PLAYER_POS = 5669; + public static final int SANGVESTI_PLAYER_LAST_DEATH_POS = 5670; /* This file is automatically generated. Do not edit. */ } diff --git a/runelite-api/src/main/java/net/runelite/api/gameval/VarbitID.java b/runelite-api/src/main/java/net/runelite/api/gameval/VarbitID.java index d50b66250b2..7705c126cce 100644 --- a/runelite-api/src/main/java/net/runelite/api/gameval/VarbitID.java +++ b/runelite-api/src/main/java/net/runelite/api/gameval/VarbitID.java @@ -10230,6 +10230,28 @@ public final class VarbitID public static final int DRAKAN_ENCOUNTER_3_ATTEMPTS = 15622; public static final int DRAKAN_ENCOUNTER_4_ATTEMPTS = 15623; public static final int VAMPYRE_AGGRESSION_DARKMEYER = 15624; + public static final int VAMPYRIUM_AGILITY_FLAVOUR_DIALOGUE = 15625; + public static final int MAGGOT_KING_REDUCED_DEATH_FEE_KILLS = 15626; + public static final int MYQ6_OWED_SPEAR = 15627; + public static final int CASTLE_DRAKAN_EMBLEM_HOLDER_USED = 15628; + public static final int SANGVESTI_CLOTHES_SHOP_DOOR_FOUND = 15629; + public static final int SANGVESTI_CLOTHES_SHOP_BACK_DOOR_FOUND = 15630; + public static final int SANGVESTI_FANCY_HOUSE_3_DOOR_FOUND = 15631; + public static final int SANGVESTI_FANCY_HOUSE_3_BACK_DOOR_FOUND = 15632; + public static final int SANGVESTI_CHAPEL_BACK_DOOR_1_FOUND = 15633; + public static final int SANGVESTI_CHAPEL_BACK_DOOR_2_FOUND = 15634; + public static final int SANGVESTI_TRAPDOOR_FOUND = 15635; + public static final int SANGVESTI_BLACKSMITH_DOOR_FOUND = 15636; + public static final int SANGVESTI_BASIC_HOUSE_DOOR_FOUND = 15637; + public static final int SANGVESTI_PUB_DOOR_FOUND = 15638; + public static final int SANGVESTI_PUB_BACK_DOOR_FOUND = 15639; + public static final int SANGVESTI_MYRMEL_MANOR_DOOR_FOUND = 15640; + public static final int SANGVESTI_MYRMEL_MANOR_BACK_DOOR_FOUND = 15641; + public static final int SANGVESTI_BANK_DOOR_FOUND = 15642; + public static final int SANGVESTI_INTERIOR_BANK_DOOR_FOUND = 15643; + public static final int SANGVESTI_SHADUM_MANOR_DOOR_FOUND = 15644; + public static final int SANGVESTI_FANCY_HOUSE_1_DOOR_FOUND = 15645; + public static final int SANGVESTI_FANCY_HOUSE_1_BACK_DOOR_FOUND = 15646; public static final int LEAGUE_HASNT_USED_BOOTS_FOR_MOUNT_QUID = 15647; public static final int LEAGUE_ELVES_KILLED = 15648; public static final int LEAGUE_BASALT_STONES_STARTED = 15649; @@ -10249,7 +10271,24 @@ public final class VarbitID public static final int LEAGUE_RUNE_DART_TIPS_IN_PRIF = 15663; public static final int LEAGUE_RED_CHINCHOMPAS_IN_TIRANNWN = 15664; public static final int LEAGUE_ZAHUR_POTION_COUNTER = 15665; + public static final int SANGVESTI_VITUR_MANOR_DOOR_FOUND = 15666; + public static final int SANGVESTI_FANCY_HOUSE_2_DOOR_FOUND = 15667; + public static final int SANGVESTI_FANCY_HOUSE_2_BACK_DOOR_FOUND = 15668; + public static final int SANGVESTI_FOOD_SHOP_DOOR_FOUND = 15669; + public static final int SANGVESTI_FOOD_SHOP_BACK_DOOR_FOUND = 15670; public static final int XMAS24_INVITE_GERTRUDE = 15671; + public static final int SANGVESTI_GENERAL_STORE_DOOR_FOUND = 15672; + public static final int SANGVESTI_BASIC_HOUSE_2_DOOR_FOUND = 15673; + public static final int SANGVESTI_BASIC_HOUSE_3_DOOR_FOUND = 15674; + public static final int SANGVESTI_HINT_FANCY_HOUSE_3 = 15675; + public static final int SANGVESTI_HINT_VITUR_MANOR = 15676; + public static final int SANGVESTI_HINT_CHAPEL = 15677; + public static final int SANGVESTI_HINT_FOOD_SHOP = 15678; + public static final int SANGVESTI_HINT_BASIC_HOUSE_3 = 15679; + public static final int SANGVESTI_HINT_PUB = 15680; + public static final int SANGVESTI_HINT_CLOTHES_SHOP = 15681; + public static final int SANGVESTI_HINT_FANCY_HOUSE_1 = 15682; + public static final int SANGVESTI_HINT_BLACKSMITH = 15683; public static final int XMAS24_INVITE_CHARLIE = 15796; public static final int XMAS24_INVITES = 15800; public static final int XMAS24_MATCH_AMIK = 15892; From aba169bf349bb5b56b04f81303f83068c56930b6 Mon Sep 17 00:00:00 2001 From: coopermor Date: Tue, 7 Jul 2026 23:08:39 -0700 Subject: [PATCH 11/27] agility: Add Vampyrium shortcuts --- .../net/runelite/client/game/AgilityShortcut.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) 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 3b7c6fbfb66..57f667bef0c 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 @@ -228,6 +228,8 @@ public boolean matches(Client client, TileObject object) GREAT_CONCH_STEPPING_STONE(61, "Stepping Stone", new WorldPoint(3208, 2394, 0), ObjectID.GREAT_CONCH_STEPPING_STONE), LAGUNA_AURORAE_SHORTCUT_1(61, "Rocks", new WorldPoint(1152, 2804, 0), ObjectID.LAGUNA_AURORAE_SHORTCUT_1), LAGUNA_AURORAE_SHORTCUT_2(61, "Rocks", new WorldPoint(1142, 2803, 0), ObjectID.LAGUNA_AURORAE_SHORTCUT_2), + CASTLE_DRAKAN_ROCKS_UP(61, "Rocks", new WorldPoint(2555, 7821, 0), ObjectID.VOROS_ROCKSLIDE02_SHORTCUT_UP), + APSUL_HUNTING_GROUND_ROCKS_UP(61, "Rocks", new WorldPoint(2576, 7768, 0), ObjectID.VOROS_ROCKSLIDE02_SHORTCUT_UP_BIG), MOUNT_KARUULM_UPPER(62, "Rocks", new WorldPoint(1322, 3791, 0), ObjectID.MOUNT_KARUULM_SHORTCUT_ROCKS), NECROPOLIS_STEPPING_STONE_NORTH(62, "Stepping Stone", new WorldPoint(3293, 2706, 0), ObjectID.NECROPOLIS_STEPPING_STONE_2), NECROPOLIS_STEPPING_STONES_SOUTH(62, "Stepping Stones", new WorldPoint(3291, 2700, 0), ObjectID.NECROPOLIS_STEPPING_STONE_1), @@ -237,6 +239,8 @@ public boolean matches(Client client, TileObject object) TROLLHEIM_WILDERNESS_ROCKS_EAST(64, "Rocks", new WorldPoint(2945, 3678, 0), ObjectID.TROLLHEIM_WILDY_CLIMB_ROCKS), TROLLHEIM_WILDERNESS_ROCKS_WEST(64, "Rocks", new WorldPoint(2917, 3672, 0), ObjectID.TROLLHEIM_WILDY_CLIMB_ROCKS), FOSSIL_ISLAND_VOLCANO(64, "Rope", new WorldPoint(3780, 3822, 0), ObjectID.FOSSIL_VOLCANO_AGILITY_ROPE_BOTTOM, ObjectID.FOSSIL_VOLCANO_AGILITY_ROPE_TOP), + SANGVESTI_BUSH_WEST(64, "Bush", new WorldPoint(2656, 7816, 0), ObjectID.BUSH_SHORTCUT), + SANGVESTI_BUSH_EAST(64, "Bush", new WorldPoint(2666, 7837, 0), ObjectID.BUSH_SHORTCUT), MORYTANIA_TEMPLE(65, "Loose Railing", new WorldPoint(3422, 3476, 0), ObjectID.MORYTANIA_CLIMBINGROCKS_SC_TOP, ObjectID.MORYTANIA_CLIMBINGROCKS_SC_BOTTOM, ObjectID.MORYTANIA_RAILING_SC_FENCE_1, ObjectID.MORYTANIA_RAILING_SC_FENCE_2), REVENANT_CAVES_GREEN_DRAGONS(65, "Jump", new WorldPoint(3220, 10086, 0), ObjectID.WILD_CAVE_AGILITY_JUMP), COSMIC_ALTAR_ADVANCED_WALKWAY(66, "Narrow Walkway", new WorldPoint(2408, 4401, 0), ObjectID.FAIRY_SC_JUTTINGWALL), @@ -289,6 +293,14 @@ public boolean matches(Client client, TileObject object) COF_PLATFORM_TOP(73, "Platform Edge", new WorldPoint(1309, 10099, 0), new WorldPoint(1438, 10098, 2), ObjectID.COF_AGILITY_LIP), COF_PLATFORM_MID(73, "Jump", new WorldPoint(1314, 10002, 0), new WorldPoint(1443, 10097, 1), ObjectID.COF_AGILITY_JUMP), ARCEUUS_ESSENSE_MINE_WEST(73, "Rock Climb", new WorldPoint(1742, 3853, 0), ObjectID.ARCHEUUS_RUNESTONE_SHORTCUT_GREY_TOP, ObjectID.ARCHEUUS_RUNESTONE_SHORTCUT_GREY_BOTTOM), + VAMPYRIUM_PILLAR(73, "Pillar Jump", new WorldPoint(2571, 7797, 0), ObjectID.VAMPYRIUM_STEPPING_STONE_SHORTCUT_PILLAR) + { + @Override + public boolean matches(Client client, TileObject object) + { + return client.getVarbitValue(VarbitID.VAMPYRIUM_TRAVERSAL_ROCK_MINED) == 1; + } + }, LAVA_DRAGON_ISLE_JUMP(74, "Stepping Stone", new WorldPoint(3200, 3807, 0), ObjectID.WILDERNESS_LAVA_DRAGONS_SHORTCUT), MEIYERDITCH_LAB_TUNNELS_NORTH(74, "Cave", new WorldPoint(3623, 9747, 0), ObjectID.MYQ5_WALL_CAVE_SHORTCUT_1, ObjectID.MYQ5_WALL_CAVE_SHORTCUT_2), MEIYERDITCH_LAB_TUNNELS_SOUTH(74, "Cave", new WorldPoint(3618, 9722, 0), ObjectID.MYQ5_WALL_CAVE_SHORTCUT_3, ObjectID.MYQ5_WALL_CAVE_SHORTCUT_4), @@ -305,6 +317,8 @@ public boolean matches(Client client, TileObject object) WILDERNESS_SLAYER_CAVE_CREVICE_SOUTH_WEST(77, "Crevice", new WorldPoint(3333, 10119, 0), ObjectID.WILDERNESS_SLAYER_CAVE_CREVICE), IORWERTHS_DUNGEON_NORTHERN_SHORTCUT_EAST(78, "Tight Gap", new WorldPoint(3221, 12441, 0), ObjectID.PRIF_SLAYER_DUNGEON_SHORTCUT_1A), IORWERTHS_DUNGEON_NORTHERN_SHORTCUT_WEST(78, "Tight Gap", new WorldPoint(3215, 12441, 0), ObjectID.PRIF_SLAYER_DUNGEON_SHORTCUT_1B), + CASTLE_DRAKAN_ROCKS_DOWN(78, "Rocks", new WorldPoint(2555, 7821, 0), ObjectID.VOROS_ROCKSLIDE02_SHORTCUT_DOWN_BIG), + APSUL_HUNTING_GROUND_ROCKS_DOWN(78, "Rocks", new WorldPoint(2576, 7768, 0), ObjectID.VOROS_ROCKSLIDE02_SHORTCUT_UP_BIG), SHILO_VILLAGE_ROCKS(79, "Rocks", new WorldPoint(2870, 3003, 0), ObjectID.SHORTCUT_SHILO_ROCKS_TOP, ObjectID.SHORTCUT_SHILO_ROCKS_BOTTOM), KHARAZI_JUNGLE_VINE_CLIMB(79, "Vine", new WorldPoint(2897, 2939, 0), ObjectID.KHARAZI_SHORTCUT_VINE_END, ObjectID.KHARAZI_SHORTCUT_VINE_DIAG1), TAVERLEY_DUNGEON_SPIKED_BLADES(80, "Strange Floor", new WorldPoint(2877, 9813, 0), ObjectID.TAVERLY_DUNGEON_FLOOR_SPIKES_SC), From c2604d8ed432914bbf4862c6ff2632c6fd747280 Mon Sep 17 00:00:00 2001 From: coopermor Date: Tue, 7 Jul 2026 23:49:14 -0700 Subject: [PATCH 12/27] agility: add Stalker Den stepping stone --- .../src/main/java/net/runelite/client/game/AgilityShortcut.java | 1 + 1 file changed, 1 insertion(+) 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 57f667bef0c..cca4d950af5 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 @@ -238,6 +238,7 @@ public boolean matches(Client client, TileObject object) DARKMEYER_WALL(63, "Wall (Long rope)", new WorldPoint(3669, 3375, 0), ObjectID.DARKM_OUTER_WALL_3H_SHORTCUT, ObjectID.DARKM_OUTER_WALL_2H_SHORTCUT), TROLLHEIM_WILDERNESS_ROCKS_EAST(64, "Rocks", new WorldPoint(2945, 3678, 0), ObjectID.TROLLHEIM_WILDY_CLIMB_ROCKS), TROLLHEIM_WILDERNESS_ROCKS_WEST(64, "Rocks", new WorldPoint(2917, 3672, 0), ObjectID.TROLLHEIM_WILDY_CLIMB_ROCKS), + STALKER_DEN_STEEPING_STONE(64, "Stepping Stone", new WorldPoint(1372, 9720, 0), ObjectID.STALKER_DEN_STEPPING_STONE), FOSSIL_ISLAND_VOLCANO(64, "Rope", new WorldPoint(3780, 3822, 0), ObjectID.FOSSIL_VOLCANO_AGILITY_ROPE_BOTTOM, ObjectID.FOSSIL_VOLCANO_AGILITY_ROPE_TOP), SANGVESTI_BUSH_WEST(64, "Bush", new WorldPoint(2656, 7816, 0), ObjectID.BUSH_SHORTCUT), SANGVESTI_BUSH_EAST(64, "Bush", new WorldPoint(2666, 7837, 0), ObjectID.BUSH_SHORTCUT), From 05e098ed62b5bc0418d402d17a4f30162598e343 Mon Sep 17 00:00:00 2001 From: coopermor Date: Tue, 7 Jul 2026 23:56:45 -0700 Subject: [PATCH 13/27] worldmap: add Great Conch dungeons --- .../runelite/client/plugins/worldmap/DungeonLocation.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/DungeonLocation.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/DungeonLocation.java index cdf20c886d0..7b91fc59d2b 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/DungeonLocation.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/DungeonLocation.java @@ -98,12 +98,14 @@ enum DungeonLocation FORTHOS_W("Forthos Dungeon", new WorldPoint(1669, 3567, 0)), FORTIS_COLOSSEUM("Fortis Colosseum", new WorldPoint(1794, 3107, 0)), FREMENNIK_SLAYER("Fremennik Slayer Dungeon", new WorldPoint(2796, 3615, 0)), + GAUNTLET("The Gauntlet", new WorldPoint(3227, 6116, 0)), GIANTS_DEN("Giants' Den", new WorldPoint(1419, 3588, 0)), GIANTS_FOUNDRY("Giants' Foundry", new WorldPoint(3360, 3150, 0)), GOBLIN_CAVE("Goblin Cave", new WorldPoint(2622, 3393, 0)), GOD_WARS("God Wars Dungeon", new WorldPoint(2917, 3747, 0)), GRAND_TREE("Grand Tree Tunnels", new WorldPoint(2462, 3496, 0)), - GAUNTLET("The Gauntlet", new WorldPoint(3227, 6116, 0)), + GRYPHON_NORTH("Gryphon Dungeon", new WorldPoint(3120, 2490, 0)), + GRYPHON_SOUTH("Gryphon Dungeon", new WorldPoint(3234, 2418, 0)), HAM_HIDEOUT("H.A.M. Hideout", new WorldPoint(3164, 3252, 0)), HEADLESS_BEAST_CAVE("Headless Beast Cave", new WorldPoint(1211, 3647, 0)), HEROES_GUILD("Heroes' Guild mine", new WorldPoint(2891, 3507, 0)), @@ -193,6 +195,7 @@ enum DungeonLocation SHADE_CATACOMBS("Shade Catacombs", new WorldPoint(3484, 3321, 0)), SHAYZIEN_CRYPTS("Shayzien Crypts", new WorldPoint(1482, 3549, 0)), SHAYZIEN_PRISON("Shayzien Prison", new WorldPoint(1464, 3569, 0)), + SHELLBANE_GRYPHON_CAVE("Shellbane Gryphon Cave", new WorldPoint(3175, 2478, 0)), SHILO_VILLAGE_MINE("Shilo Village mine", new WorldPoint(2823, 3001, 0)), SILK_CHASM("Silk Chasm", new WorldPoint(3320, 3798, 0)), SISTERHOOD_SANCTUARY("Sisterhood Sanctuary", new WorldPoint(3727, 3300, 0)), From 08244aee35ddb23c73b1f266941d6db89f10189b Mon Sep 17 00:00:00 2001 From: Cooper Morris Date: Wed, 8 Jul 2026 08:50:36 -0500 Subject: [PATCH 14/27] worldmap: Vampyrium --- .../runelite/client/plugins/worldmap/HunterAreaLocation.java | 5 +++++ .../runelite/client/plugins/worldmap/MiningSiteLocation.java | 1 + .../runelite/client/plugins/worldmap/RareTreeLocation.java | 5 +++++ 3 files changed, 11 insertions(+) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/HunterAreaLocation.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/HunterAreaLocation.java index 958d114a99e..cbea0989272 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/HunterAreaLocation.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/HunterAreaLocation.java @@ -90,6 +90,9 @@ enum HunterAreaLocation TLATI_RAINFOREST_SOUTH(new WorldPoint(1282, 3021, 0), HunterCreature.BLACK_WARLOCK), UZER_HUNTER_AREA(new WorldPoint(3401, 3104, 0), HunterCreature.GOLDEN_WARBLER, HunterCreature.DESERT_DEVIL, HunterCreature.ORANGE_SALAMANDER), + VAMPYRIUM_EAST(new WorldPoint(2564, 7772, 0), HunterCreature.LETVEK), + VAMPYRIUM_WEST(new WorldPoint(2540, 7766, 0), HunterCreature.LETVEK), + VAMPYRIUM_NORTH(new WorldPoint(2653, 7845, 0), HunterCreature.STYMPHIKE), WILDERNESS(new WorldPoint(3142, 3771, 0), HunterCreature.BLACK_CHINCHOMPA), ; @@ -129,6 +132,7 @@ private enum HunterCreature HERBIBOAR("Herbiboar", 80), HORNED_GRAAHK("Horned graahk", 41), // IMP and MANIACAL_MONKEY do not have a specific hunter area + LETVEK("Letvek", 76), MOONLIGHT_ANTELOPE("Moonlight Antelope", 91), MOTTLED_EEL("Mottled eel", 68), ORANGE_SALAMANDER("Orange salamander", 47), @@ -145,6 +149,7 @@ private enum HunterCreature SNOWY_KNIGHT("Snowy knight", 35), SPINED_LARUPIA("Spined larupia", 31), SPOTTED_KEBBIT("Spotted kebbit", 43), + STYMPHIKE("Stymphike", 82), SUNLIGHT_ANTELOPE("Sunlight Antelope", 72), SUNLIGHT_MOTH("Sunlight Moth", 65), SWAMP_LIZARD("Swamp lizard", 29), diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/MiningSiteLocation.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/MiningSiteLocation.java index 929c2ee897d..4151e81d6ea 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/MiningSiteLocation.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/MiningSiteLocation.java @@ -242,6 +242,7 @@ enum MiningSiteLocation new Rock(7, Ore.MITHRIL), new Rock(10, Ore.SOFT_CLAY), new Rock(7, Ore.ADAMANTITE), new Rock(4, Ore.RUNITE)), // TUTORIAL ISLAND -- NOT AVAILABLE ON WORLD MAP UZER(new WorldPoint(3415, 3160, 0), new Rock(10, Ore.CLAY)), + VAMPYRIUM(new WorldPoint(2567, 7735, 0), new Rock(14, Ore.IRON)), VARROCK_SOUTH_EAST(new WorldPoint(3286, 3365, 0), new Rock(9, Ore.COPPER), new Rock(6, Ore.TIN), new Rock(4, Ore.IRON)), VARROCK_SOUTH_WEST(new WorldPoint(3176, 3370, 0), diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/RareTreeLocation.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/RareTreeLocation.java index 2abd402748d..64b649e1b4b 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/RareTreeLocation.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/RareTreeLocation.java @@ -358,6 +358,11 @@ enum RareTreeLocation // Wilderness new WorldPoint(3175, 3931, 0)), + BLOODWOOD("Bloodwood tree", 77, + // Vampyrium + new WorldPoint(2599, 7780, 0), + new WorldPoint(2696, 7823, 0)), + IRONWOOD("Ironwood tree", 80, // Sunbleak Island new WorldPoint(2223, 2341, 0), From 1f484914a31c2f002e20e7ed728c6cd50f271faa Mon Sep 17 00:00:00 2001 From: samszotkowski Date: Mon, 29 Jun 2026 18:38:39 -0400 Subject: [PATCH 15/27] time tracking: fix special patch showing ready due to empty compost bins --- .../client/plugins/timetracking/farming/FarmingTracker.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/FarmingTracker.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/FarmingTracker.java index a462d18cfd9..400c3cca2db 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/FarmingTracker.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/FarmingTracker.java @@ -460,7 +460,10 @@ private void updateCompletionTime() allUnknown = false; - if (prediction.getProduce() != Produce.WEEDS && prediction.getProduce() != Produce.SCARECROW) + if (prediction.getProduce() != Produce.WEEDS + && prediction.getProduce() != Produce.SCARECROW + && prediction.getCropState() != CropState.EMPTY + && prediction.getCropState() != CropState.FILLING) { allEmpty = false; From a45f011881fa0de7a80f45608589da1a6a7603f2 Mon Sep 17 00:00:00 2001 From: samszotkowski <94253934+samszotkowski@users.noreply.github.com> Date: Wed, 8 Jul 2026 11:00:16 -0400 Subject: [PATCH 16/27] loot tracker: tarnished items and maggot king eggs --- .../loottracker/LootTrackerPlugin.java | 91 ++++++++++++++++++- 1 file changed, 88 insertions(+), 3 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java index ec2f62908e2..77d157dbff1 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java @@ -326,6 +326,13 @@ public class LootTrackerPlugin extends Plugin private static final String DOM = "Doom of Mokhaiotl"; + private static final String MAGGOT_KING = "Maggot King"; + private static final String MAGGOT_KING_TAKE_EGGS_SUPPLY_MESSAGE = "A pile of half digested food spills out as you try to take the eggs."; + private static final String MAGGOT_KING_TAKE_EGGS_NO_LOOT_MESSAGE = "The eggs pop as you try to take them."; + private static final String MAGGOT_KING_POP_EGG_NO_LOOT_MESSAGE = "The egg pops and reveals a dead maggot."; + + private static final Pattern TARNISHED_PATTERN = Pattern.compile("You rub the tarnished (?.+) on your clothes.*"); + private static final Set VOWELS = ImmutableSet.of('a', 'e', 'i', 'o', 'u'); @Inject @@ -379,6 +386,7 @@ public class LootTrackerPlugin extends Plugin private boolean lastLoadingIntoInstance; private String lastPickpocketTarget; private int ignorePickpocketLoot; + private int lastMaggotEggPopped; private List ignoredItems = new ArrayList<>(); private List ignoredEvents = new ArrayList<>(); @@ -670,10 +678,13 @@ void addLoot(@NonNull String name, int combatLevel, LootRecordType type, Object void addLoot(@NonNull String name, int combatLevel, LootRecordType type, Object metadata, Collection items, int amount) { - initLoot(type, name); + if (!items.isEmpty()) + { + initLoot(type, name); - final LootTrackerItem[] entries = buildEntries(stack(items)); - SwingUtilities.invokeLater(() -> panel.add(name, type, combatLevel, entries, amount)); + final LootTrackerItem[] entries = buildEntries(stack(items)); + SwingUtilities.invokeLater(() -> panel.add(name, type, combatLevel, entries, amount)); + } LootRecord lootRecord = new LootRecord(name, type, metadata, toGameItems(items), Instant.now(), getLootWorldId(), amount, null); synchronized (queuedLoots) @@ -733,6 +744,10 @@ else if (npc.getName() != null && npc.getName().equals("Cave horror")) "world", client.getWorld() ); } + else if (npc.getName() != null && npc.getName().equals(MAGGOT_KING)) + { + return Map.of("item", lastMaggotEggPopped); + } else { return npc.getId(); @@ -1133,6 +1148,49 @@ public void onChatMessage(ChatMessage event) return; } + final Matcher tarnishedMatcher = TARNISHED_PATTERN.matcher(message); + if (tarnishedMatcher.matches()) + { + final String type = tarnishedMatcher.group("type").toLowerCase(); + String eventType; + switch (type) + { + case "2h sword": + eventType = itemManager.getItemComposition(ItemID.TARNISHED_2H_SWORD).getMembersName(); + break; + case "amulet": + eventType = itemManager.getItemComposition(ItemID.TARNISHED_AMULET).getMembersName(); + break; + case "battleaxe": + eventType = itemManager.getItemComposition(ItemID.TARNISHED_BATTLEAXE).getMembersName(); + break; + case "halberd": + eventType = itemManager.getItemComposition(ItemID.TARNISHED_HALBERD).getMembersName(); + break; + case "longsword": + eventType = itemManager.getItemComposition(ItemID.TARNISHED_LONGSWORD).getMembersName(); + break; + case "necklace": + eventType = itemManager.getItemComposition(ItemID.TARNISHED_NECKLACE).getMembersName(); + break; + case "ring": + eventType = itemManager.getItemComposition(ItemID.TARNISHED_RING).getMembersName(); + break; + case "spear": + eventType = itemManager.getItemComposition(ItemID.TARNISHED_SPEAR).getMembersName(); + break; + case "bracelet": + eventType = itemManager.getItemComposition(ItemID.TARNISHED_BRACELET).getMembersName(); + break; + default: + log.debug("Unrecognized tarnished item: {}", type); + return; + } + + onInvChange(collectInvItems(LootRecordType.EVENT, eventType, client.getBoostedSkillLevel(Skill.CRAFTING))); + return; + } + if (regionID == TEMPOROSS_REGION && message.startsWith(TEMPOROSS_LOOT_STRING)) { onInvChange(collectInvItems(LootRecordType.EVENT, TEMPOROSS_EVENT, client.getBoostedSkillLevel(Skill.FISHING))); @@ -1176,6 +1234,15 @@ else if (message.equals("You crack open the rubium geode and obtain some rubium { countChangedItems(ItemID.RUBIUM_GEODE, client.getBoostedSkillLevel(Skill.MINING)); } + else if (message.equals(MAGGOT_KING_TAKE_EGGS_SUPPLY_MESSAGE) + || message.equals(MAGGOT_KING_TAKE_EGGS_NO_LOOT_MESSAGE)) + { + addLoot(MAGGOT_KING, -1, LootRecordType.UNKNOWN, Map.of("message", message), Collections.emptyList(), 1); + } + else if (message.equals(MAGGOT_KING_POP_EGG_NO_LOOT_MESSAGE)) + { + addLoot(MAGGOT_KING, -1, LootRecordType.UNKNOWN, Map.of("message", message, "item", lastMaggotEggPopped), Collections.emptyList(), 1); + } } private void countChangedItems(int itemId, Object metadata) @@ -1342,6 +1409,20 @@ else if (event.getMenuOption().equals("Open")) break; } } + else if (event.getMenuOption().equals("Pop")) + { + switch (event.getItemId()) + { + case ItemID.MAGGOT_EGG: + case ItemID.SICKLY_MAGGOT_EGG: + case ItemID.WARM_MAGGOT_EGG: + case ItemID.PULSATING_MAGGOT_EGG: + case ItemID.WRIGGLING_MAGGOT_EGG: + case ItemID.WRITHING_MAGGOT_EGG: + lastMaggotEggPopped = event.getItemId(); + break; + } + } } } @@ -1390,6 +1471,10 @@ private Collection combine(List records) Map map = new HashMap<>(); for (LootRecord record : records) { + if (record.getDrops().isEmpty()) + { + continue; + } ConfigLoot key = new ConfigLoot(record.getType(), record.getEventId()); ConfigLoot loot = map.computeIfAbsent(key, k -> key); loot.kills += record.getAmount(); From 4152ea05b2d65f09b9df4ce8c52c6650a768f10a Mon Sep 17 00:00:00 2001 From: Adam Date: Wed, 8 Jul 2026 11:00:36 -0400 Subject: [PATCH 17/27] mes: remove knock-out/lure block OSRS CM has requested this block be removed --- .../plugins/menuentryswapper/MenuEntrySwapperPlugin.java | 7 ------- 1 file changed, 7 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java index 65482f9cd91..ca6a56ee1de 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java @@ -768,13 +768,6 @@ private void configureNpcClick(MenuOpened event) continue; } - if ("Knock-Out".equals(actions[actionIdx]) - || "Lure".equals(actions[actionIdx])) - { - // https://secure.runescape.com/m=news/third-party-client-guidelines?oldschool=1 - continue; - } - final MenuAction menuAction = NPC_MENU_TYPES.get(actionIdx); if (menuAction != currentAction) { From 4f6cf9134eb0178e13a4ca1d920ac721a3496139 Mon Sep 17 00:00:00 2001 From: RuneLite updater Date: Wed, 8 Jul 2026 16:58:07 +0000 Subject: [PATCH 18/27] Release 1.12.32 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 299dffa2416..c703a880756 100644 --- a/gradle.properties +++ b/gradle.properties @@ -28,6 +28,6 @@ org.gradle.parallel=true org.gradle.caching=false project.build.group=net.runelite -project.build.version=1.12.32-SNAPSHOT +project.build.version=1.12.32 glslang.path= From cde648a2fa9a0c2252b8a9d32e21a584be73e9ed Mon Sep 17 00:00:00 2001 From: RuneLite updater Date: Wed, 8 Jul 2026 16:58:09 +0000 Subject: [PATCH 19/27] Bump for 1.12.33-SNAPSHOT [ci skip] --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index c703a880756..19d6785decd 100644 --- a/gradle.properties +++ b/gradle.properties @@ -28,6 +28,6 @@ org.gradle.parallel=true org.gradle.caching=false project.build.group=net.runelite -project.build.version=1.12.32 +project.build.version=1.12.33-SNAPSHOT glslang.path= From ea1154b53f58da23c43ef1765b9891d6b90e1db0 Mon Sep 17 00:00:00 2001 From: coopermor Date: Wed, 8 Jul 2026 22:52:33 -0700 Subject: [PATCH 20/27] agility: Fix Vampyrium shortcut IDs --- .../main/java/net/runelite/client/game/AgilityShortcut.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 cca4d950af5..f5cbce8f3bc 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 @@ -318,8 +318,8 @@ public boolean matches(Client client, TileObject object) WILDERNESS_SLAYER_CAVE_CREVICE_SOUTH_WEST(77, "Crevice", new WorldPoint(3333, 10119, 0), ObjectID.WILDERNESS_SLAYER_CAVE_CREVICE), IORWERTHS_DUNGEON_NORTHERN_SHORTCUT_EAST(78, "Tight Gap", new WorldPoint(3221, 12441, 0), ObjectID.PRIF_SLAYER_DUNGEON_SHORTCUT_1A), IORWERTHS_DUNGEON_NORTHERN_SHORTCUT_WEST(78, "Tight Gap", new WorldPoint(3215, 12441, 0), ObjectID.PRIF_SLAYER_DUNGEON_SHORTCUT_1B), - CASTLE_DRAKAN_ROCKS_DOWN(78, "Rocks", new WorldPoint(2555, 7821, 0), ObjectID.VOROS_ROCKSLIDE02_SHORTCUT_DOWN_BIG), - APSUL_HUNTING_GROUND_ROCKS_DOWN(78, "Rocks", new WorldPoint(2576, 7768, 0), ObjectID.VOROS_ROCKSLIDE02_SHORTCUT_UP_BIG), + CASTLE_DRAKAN_ROCKS_DOWN(78, "Rocks", new WorldPoint(2555, 7821, 0), ObjectID.VOROS_ROCKSLIDE02_SHORTCUT_DOWN), + APSUL_HUNTING_GROUND_ROCKS_DOWN(78, "Rocks", new WorldPoint(2576, 7768, 0), ObjectID.VOROS_ROCKSLIDE02_SHORTCUT_DOWN_BIG), SHILO_VILLAGE_ROCKS(79, "Rocks", new WorldPoint(2870, 3003, 0), ObjectID.SHORTCUT_SHILO_ROCKS_TOP, ObjectID.SHORTCUT_SHILO_ROCKS_BOTTOM), KHARAZI_JUNGLE_VINE_CLIMB(79, "Vine", new WorldPoint(2897, 2939, 0), ObjectID.KHARAZI_SHORTCUT_VINE_END, ObjectID.KHARAZI_SHORTCUT_VINE_DIAG1), TAVERLEY_DUNGEON_SPIKED_BLADES(80, "Strange Floor", new WorldPoint(2877, 9813, 0), ObjectID.TAVERLY_DUNGEON_FLOOR_SPIKES_SC), From bc2f398360eec53f36570150839c124c2f7599be Mon Sep 17 00:00:00 2001 From: coopermor Date: Wed, 8 Jul 2026 23:00:57 -0700 Subject: [PATCH 21/27] itemcharges: Add vampyrium consumables --- .../plugins/itemcharges/ItemWithCharge.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemWithCharge.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemWithCharge.java index 2f3b6c3bf44..ac23d4680d0 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemWithCharge.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemWithCharge.java @@ -238,6 +238,10 @@ enum ItemWithCharge FISHING4(POTION, ItemID._4DOSEFISHERSPOTION, 4), FISHING_MIX_1(POTION, ItemID.BRUTAL_1DOSEFISHERSPOTION, 1), FISHING_MIX_2(POTION, ItemID.BRUTAL_2DOSEFISHERSPOTION, 2), + FOUL_CHUNKY1(POTION, ItemID.VAMPYRIUM_CHUNKY_POTION_1, 1), + FOUL_CHUNKY2(POTION, ItemID.VAMPYRIUM_CHUNKY_POTION_2, 2), + FOUL_CHUNKY3(POTION, ItemID.VAMPYRIUM_CHUNKY_POTION_3, 3), + FOUL_CHUNKY4(POTION, ItemID.VAMPYRIUM_CHUNKY_POTION_4, 4), FUNGICIDE0(FUNGICIDE_SPRAY, ItemID.SLAYER_SPRAY_PUMP_0, 0), FUNGICIDE1(FUNGICIDE_SPRAY, ItemID.SLAYER_SPRAY_PUMP_1, 1), FUNGICIDE2(FUNGICIDE_SPRAY, ItemID.SLAYER_SPRAY_PUMP_2, 2), @@ -318,12 +322,24 @@ enum ItemWithCharge PRAYER4(POTION, ItemID._4DOSEPRAYERRESTORE, 4), PRAYER_MIX_1(POTION, ItemID.BRUTAL_1DOSEPRAYERRESTORE, 1), PRAYER_MIX_2(POTION, ItemID.BRUTAL_2DOSEPRAYERRESTORE, 2), + PUTRID_STICKY1(POTION, ItemID.VAMPYRIUM_STICKY_POTION_1, 1), + PUTRID_STICKY2(POTION, ItemID.VAMPYRIUM_STICKY_POTION_2, 2), + PUTRID_STICKY3(POTION, ItemID.VAMPYRIUM_STICKY_POTION_3, 3), + PUTRID_STICKY4(POTION, ItemID.VAMPYRIUM_STICKY_POTION_4, 4), + RANCID_SLIMY1(POTION, ItemID.VAMPYRIUM_SLIMY_POTION_1, 1), + RANCID_SLIMY2(POTION, ItemID.VAMPYRIUM_SLIMY_POTION_2, 2), + RANCID_SLIMY3(POTION, ItemID.VAMPYRIUM_SLIMY_POTION_3, 3), + RANCID_SLIMY4(POTION, ItemID.VAMPYRIUM_SLIMY_POTION_4, 4), RANGING1(POTION, ItemID._1DOSERANGERSPOTION, 1), RANGING2(POTION, ItemID._2DOSERANGERSPOTION, 2), RANGING3(POTION, ItemID._3DOSERANGERSPOTION, 3), RANGING4(POTION, ItemID._4DOSERANGERSPOTION, 4), RANGING_MIX_1(POTION, ItemID.BRUTAL_1DOSERANGERSPOTION, 1), RANGING_MIX_2(POTION, ItemID.BRUTAL_2DOSERANGERSPOTION, 2), + RANK_FROTHY1(POTION, ItemID.VAMPYRIUM_FROTHY_POTION_1, 1), + RANK_FROTHY2(POTION, ItemID.VAMPYRIUM_FROTHY_POTION_2, 2), + RANK_FROTHY3(POTION, ItemID.VAMPYRIUM_FROTHY_POTION_3, 3), + RANK_FROTHY4(POTION, ItemID.VAMPYRIUM_FROTHY_POTION_4, 4), RELICYMS1(POTION, ItemID.RELICYMS_BALM1, 1), RELICYMS2(POTION, ItemID.RELICYMS_BALM2, 2), RELICYMS3(POTION, ItemID.RELICYMS_BALM3, 3), From c59561dda8a6d5d3d8eae98131d0d9eb34778bb4 Mon Sep 17 00:00:00 2001 From: Robbejj Date: Tue, 7 Jul 2026 00:24:33 +0300 Subject: [PATCH 22/27] slayer: maggot king task --- .../src/main/java/net/runelite/client/plugins/slayer/Task.java | 1 + 1 file changed, 1 insertion(+) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/slayer/Task.java b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/Task.java index 5f3db8237b9..469e66d8611 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/slayer/Task.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/Task.java @@ -129,6 +129,7 @@ enum Task LESSER_NAGUA("Lesser Nagua", ItemID.SLAYERGUIDE_LESSER_NAGUA, "Sulphur Nagua", "Frost Nagua", "Amoxliatl"), LIZARDMEN("Lizardmen", ItemID.LIZARDMAN_FANG, "Lizardman"), LIZARDS("Lizards", ItemID.SLAYERGUIDE_LIZARD), + MAGGOT_KING("The Maggot King", ItemID.MAGGOTKINGPET), MAGIC_AXES("Magic axes", ItemID.IRON_BATTLEAXE), MAMMOTHS("Mammoths", ItemID.BARBASSAULT_ATT_HORN_01), METAL_DRAGONS("Metal dragons", ItemID.POH_STEEL_DRAGON, "Bronze dragon", "Iron Dragon", "Steel dragon", "Mithril dragon", "Adamant dragon", "Rune dragon"), From ee8a62b38dce0277b746aaf4e83bc9d96322ba00 Mon Sep 17 00:00:00 2001 From: connorhet <153812527+connorhet@users.noreply.github.com> Date: Thu, 9 Jul 2026 23:17:53 +1000 Subject: [PATCH 23/27] motherlode: fix broken struts overlay early return --- .../client/plugins/motherlode/MotherlodeSceneOverlay.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeSceneOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeSceneOverlay.java index c51338d5af5..52d2f587992 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeSceneOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeSceneOverlay.java @@ -76,7 +76,7 @@ class MotherlodeSceneOverlay extends Overlay @Override public Dimension render(Graphics2D graphics) { - if ((!config.showVeins() && !config.showRockFalls()) || !plugin.isInMlm()) + if (!plugin.isInMlm()) { return null; } From 9a084853d53cf15520c7cdcbbb95d6be2541613e Mon Sep 17 00:00:00 2001 From: emerald000 Date: Thu, 9 Jul 2026 17:52:20 -0500 Subject: [PATCH 24/27] clues: fix Arandar pass hot-cold location --- .../plugins/cluescrolls/clues/hotcold/HotColdLocation.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/hotcold/HotColdLocation.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/hotcold/HotColdLocation.java index 107bfbe5218..3c393fb61c8 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/hotcold/HotColdLocation.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/hotcold/HotColdLocation.java @@ -161,7 +161,7 @@ public enum HotColdLocation WESTERN_PROVINCE_EAGLES_PEAK(MASTER, new WorldPoint(2297, 3529, 0), WESTERN_PROVINCE, "North-west of Eagles' Peak.", BRASSICAN_MAGE), WESTERN_PROVINCE_PISCATORIS(MASTER, new WorldPoint(2334, 3685, 0), WESTERN_PROVINCE, "Piscatoris Fishing Colony", ANCIENT_WIZARDS), WESTERN_PROVINCE_PISCATORIS_HUNTER_AREA(MASTER, new WorldPoint(2359, 3564, 0), WESTERN_PROVINCE, "Eastern part of Piscatoris Hunter area, south-west of the Falconry.", BRASSICAN_MAGE), - WESTERN_PROVINCE_ARANDAR(MASTER, new WorldPoint(2370, 3319, 0), WESTERN_PROVINCE, "South-west of the crystal gate to Arandar.", BRASSICAN_OR_WIZARDS), + WESTERN_PROVINCE_ARANDAR(MASTER, new WorldPoint(2370, 3318, 0), WESTERN_PROVINCE, "South-west of the crystal gate to Arandar.", BRASSICAN_OR_WIZARDS), WESTERN_PROVINCE_ELF_CAMP_EAST(MASTER, new WorldPoint(2268, 3242, 0), WESTERN_PROVINCE, "East of Iorwerth Camp.", BRASSICAN_MAGE), WESTERN_PROVINCE_ELF_CAMP_NW(MASTER, new WorldPoint(2177, 3282, 0), WESTERN_PROVINCE, "North-west of Iorwerth Camp.", BRASSICAN_MAGE), WESTERN_PROVINCE_LLETYA(MASTER, new WorldPoint(2337, 3166, 0), WESTERN_PROVINCE, "In Lletya.", BRASSICAN_MAGE), From 0c6debb097d973b219c1099438c7c486261b8bc8 Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 9 Jul 2026 21:01:23 -0400 Subject: [PATCH 25/27] bank tags: add option to place items at end of tag Add a `BankTagsService` option to place items in the bank but not in the layout at the end of layout. This is relevant for variation items. When variation via `*` is added to a tag, the items would normally appear in the first available empty slot in the layout. This can clutter layouts that place items in particular patterns like `ZigZag` or `Preset`. To minimize this, an option to place those items at the bottom of the layout is added for plugins to use when interfacing with `BankTagsService`. Co-authored-by: dillydill123 --- .../plugins/banktags/BankTagsService.java | 4 ++++ .../client/plugins/banktags/tabs/Layout.java | 12 +++++++++++ .../plugins/banktags/tabs/LayoutManager.java | 21 ++++++++++--------- 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/banktags/BankTagsService.java b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/BankTagsService.java index 48301c22162..cca7f39509d 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/banktags/BankTagsService.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/BankTagsService.java @@ -49,6 +49,10 @@ public interface BankTagsService * Option to prevent {@link #openBankTag(String, int)} from performing a layout */ int OPTION_NO_LAYOUT = 0x4; + /** + * Option to put items in the bank but not in the layout at the bottom + */ + int OPTION_ITEMS_NOT_IN_LAYOUT_AT_BOTTOM = 0x8; /** * Open the given bank tag. The tag may have an associated {@link net.runelite.client.plugins.banktags.tabs.TagTab}, diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/Layout.java b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/Layout.java index 1ac4778e730..98912df77f2 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/Layout.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/Layout.java @@ -197,4 +197,16 @@ public void resize(int size) } layout = n; } + + int lastItemIndex() + { + for (int i = layout.length - 1; i >= 0; --i) + { + if (layout[i] != -1) + { + return i; + } + } + return -1; + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/LayoutManager.java b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/LayoutManager.java index 5b4da2127dc..c30740dca4c 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/LayoutManager.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/LayoutManager.java @@ -272,24 +272,24 @@ private void layout(Layout l) drawItem(l, c, bank, bankItemId, pos); } - int lastEmptySlot = -1; + int insertionSlot = (plugin.getOptions() & BankTagsService.OPTION_ITEMS_NOT_IN_LAYOUT_AT_BOTTOM) != 0 ? l.lastItemIndex() : -1; boolean modified = false; // Items from the bank but not in the layout. for (int itemId : bankItems) { do { - ++lastEmptySlot; + ++insertionSlot; } - while (lastEmptySlot < layout.length && layout[lastEmptySlot] > -1); + while (l.getItemAtPos(insertionSlot) > -1); - Widget c = itemContainer.getChild(lastEmptySlot); + Widget c = itemContainer.getChild(insertionSlot); if (c == null || c.getOriginalHeight() != BANK_ITEM_HEIGHT) // check for tabs { break; } - drawItem(l, c, bank, itemId, lastEmptySlot); + drawItem(l, c, bank, itemId, insertionSlot); if (log.isDebugEnabled()) { @@ -300,26 +300,27 @@ private void layout(Layout l) } int layoutItemId = itemManager.canonicalize(itemId); - l.addItem(layoutItemId); + l.addItemAfter(layoutItemId, insertionSlot); modified = true; } // Fill the remaining slots with -1 so that items can be dragged to them + insertionSlot = -1; while (true) { do { - ++lastEmptySlot; + ++insertionSlot; } - while (lastEmptySlot < layout.length && layout[lastEmptySlot] > -1); + while (l.getItemAtPos(insertionSlot) > -1); - Widget c = itemContainer.getChild(lastEmptySlot); + Widget c = itemContainer.getChild(insertionSlot); if (c == null || c.getOriginalHeight() != BANK_ITEM_HEIGHT) // check for tabs { break; } - drawItem(l, c, bank, -1, lastEmptySlot); + drawItem(l, c, bank, -1, insertionSlot); } if (modified) From 43c5dbbda6e38ef3e9dc8dd2ab09ec2672fd41c6 Mon Sep 17 00:00:00 2001 From: Sami Date: Sat, 11 Jul 2026 07:40:02 +0200 Subject: [PATCH 26/27] chore: bump microbot version to 2.6.13 Co-Authored-By: Claude Fable 5 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 0b6316e3485..fa21b0fedf0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -32,7 +32,7 @@ project.build.version=1.12.32.1 runelite.injected-client.version=1.12.32.1 glslang.path= -microbot.version=2.6.12 +microbot.version=2.6.13 microbot.commit.sha=nogit microbot.repo.url=http://138.201.81.246:8081/repository/microbot-snapshot/ microbot.repo.username= From 3edc92d62cf3ef5c45f2e4aa68fcccfb0463e546 Mon Sep 17 00:00:00 2001 From: Sami Date: Sat, 11 Jul 2026 07:50:50 +0200 Subject: [PATCH 27/27] chore: update project build version to 1.12.31.1 --- gradle.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index fa21b0fedf0..42d4cbeb03e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -28,8 +28,8 @@ org.gradle.parallel=true org.gradle.caching=false project.build.group=net.runelite -project.build.version=1.12.32.1 -runelite.injected-client.version=1.12.32.1 +project.build.version=1.12.32 +runelite.injected-client.version=1.12.32 glslang.path= microbot.version=2.6.13