Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
fdaae81
chore: prepare Varlamore Part 3 quests (#2188)
pajlada Jul 23, 2025
289d4f4
fix: Allow npcs to highlight based on composition id (#2192)
Zoinkwiz Jul 24, 2025
2720c31
feat: implement Vale Totems miniquest (#2190)
pajlada Jul 25, 2025
4c204e8
fix: Ensure rune pouch checks don't have invalid null items (#2196)
Zoinkwiz Jul 29, 2025
35b16e5
quest-helper: update sync tracking after partial sync
Voxsylvae Aug 28, 2025
8742d41
quest-helper: implement Shadows of Custodia quest (#2189)
Voxsylvae Aug 28, 2025
2b9b336
feat: implement the Scrambled! quest (#2194)
pajlada Jul 30, 2025
3c3db8a
feat: make quest section headers a JTextPane instead of JLabel (#2200)
pajlada Jul 30, 2025
480b453
Feat: the final dawn (#2193)
Zoinkwiz Jul 30, 2025
5a651fd
fix(Curse of Arrav): metal door solver (#2198)
pajlada Jul 30, 2025
bbf20b1
chore: update readme (#2201)
pajlada Jul 30, 2025
1907051
fix: Use correct title check for Clock Tower start check (#2210)
Zoinkwiz Jul 30, 2025
0ea0f8a
fix: remove varlamore part 3 quests that didn't exist (#2211)
pajlada Jul 30, 2025
3cebb0a
add food (#2185)
Zylviij Aug 9, 2025
25c6a32
fix: Allow for pure essence in ESSENCE_LOW ItemCollection (#2186)
Zoinkwiz Aug 9, 2025
0114881
fix: Update slashItem tooltip to include Noxius Halberd (#2202)
bfur66 Aug 9, 2025
3770531
Polish The Restless Ghost (#2203)
pajlada Aug 9, 2025
01a810b
fix: don't render arrow for itemsteps if option is disabled (#2204)
pajlada Aug 9, 2025
9aab9cb
feat: allow disabling of world map hint (#2205)
pajlada Aug 9, 2025
d89050f
chore: Devious Minds teleport Recommendation are more precise (#2207)
kappelhoj Aug 9, 2025
4dcb2b0
fix: The Great Brain Robbery correctly requires a disposable hammer (…
kappelhoj Aug 9, 2025
f285dc5
fix: add Amy's saw (offhand) as a possible Saw (#2213)
pajlada Aug 9, 2025
c34cab5
polish: Cook's Assistant (#2215)
pajlada Aug 9, 2025
d3b4103
Update RomeoAndJuliet.java (#2216)
mattmascolo Aug 9, 2025
573a442
fix(Scrambled!): Always suggest getting the nails (#2217)
pajlada Aug 9, 2025
f9b4982
feat: add a quest reload button in developer mode (#2224)
pajlada Aug 9, 2025
f51e870
feat(puzzle-wrapper): create with alternate text + default text (#2225)
pajlada Aug 9, 2025
5e055ee
feat(DigStep): allow customizing spade and highlight requirement (#2227)
pajlada Aug 9, 2025
04bd1ce
polish: Witch's Potion (#2229)
pajlada Aug 9, 2025
82b7dd3
polish: Sheep Shearer (#2219)
pajlada Aug 9, 2025
73a93b9
fix(The Final Dawn): step typo (#2234)
pajlada Aug 9, 2025
206d275
refactor: reformat/reorganize
pajlada Aug 2, 2025
c6998f0
fix: puzzlewrapper third & fourth puzzle
pajlada Aug 3, 2025
e230791
chore: add myself to copyright
pajlada Aug 4, 2025
02cc019
Costume needle substitution exceptions (#2233)
CritoCantCode Aug 15, 2025
240d2a3
polish: Tree Gnome Village (#2246)
pajlada Aug 15, 2025
f460892
Fremennik Isles: Go to next step after getting Jester outfit (#2249)
Zantier Aug 15, 2025
bcd43f4
polish: Barbarian training mithril dragon requirements (#2252)
jesmaail Aug 15, 2025
e697d00
feat: add option to always show debug overlay in developer mode (#2254)
pajlada Aug 15, 2025
53299fb
feat(PanelDetails): static locked panel creator (#2264)
pajlada Aug 25, 2025
a0f2b2c
polish: Pirate's Treasure (#2265)
pajlada Aug 25, 2025
cc78876
Shadows of Custodia: Change "all" damage to "most" (#2273)
Frosty-J Aug 27, 2025
9f160f1
Clarify 65 fishing is only needed for Tai Bwo Wannai trio as iron if …
ewnavilae Aug 27, 2025
07806c6
polish: Creature of Fenkenstrain (#2275)
pimpeters Aug 27, 2025
f1d432e
fix: hide mourner outfit req for ardy hard if SOTE completed (#2284)
Zoinkwiz Aug 27, 2025
649c9b0
quest-helper: complete sync to version 4.10.0
Voxsylvae Aug 28, 2025
cb416ef
quest-helper: polish Enakhras Lament
Voxsylvae Aug 29, 2025
b8014ab
quest-helper: move and update sync tracking file
Voxsylvae Aug 29, 2025
a787b6f
quest-helper: clean up old sync file location
Voxsylvae Aug 29, 2025
9d2a7bc
Update README.md
chsami Aug 30, 2025
1f5790b
Update README.md
chsami Aug 30, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,32 @@ If you have any questions, please join our [Discord](https://discord.gg/zaGrfqFE

If you enjoy my open source work and would like to support me, consider buying me a coffee! Your support helps me stay caffeinated and motivated to keep improving and creating awesome projects.

## Quest Helper Integration

The integrated Quest Helper works together with other plugins to give a nice unified experience while questing.

### Not Enough Runes

If you have the [Not Enough Runes](https://runelite.net/plugin-hub/show/not-enough-runes) plugin installed, you can
right-click item requirements and click `Go to NER...` to look that item up in Not Enough Runes.

![Not Enough Runes context menu](./images/not-enough-runes-01.png)

### Shortest Path

If you have the [Shortest Path](https://runelite.net/plugin-hub/show/shortest-path) plugin installed, you can enable the
the "Use 'Shortest Path' plugin" in the Quest Helper config.

Comment on lines +36 to +38
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Fix duplicate word.

Apply:

-If you have the [Shortest Path](https://runelite.net/plugin-hub/show/shortest-path) plugin installed, you can enable the
-the "Use 'Shortest Path' plugin" in the Quest Helper config.
+If you have the [Shortest Path](https://runelite.net/plugin-hub/show/shortest-path) plugin installed, you can enable
+the "Use 'Shortest Path' plugin" in the Quest Helper config.
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
If you have the [Shortest Path](https://runelite.net/plugin-hub/show/shortest-path) plugin installed, you can enable the
the "Use 'Shortest Path' plugin" in the Quest Helper config.
If you have the [Shortest Path](https://runelite.net/plugin-hub/show/shortest-path) plugin installed, you can enable
the "Use 'Shortest Path' plugin" in the Quest Helper config.
🧰 Tools
🪛 LanguageTool

[grammar] ~36-~36: There might be a mistake here.
Context: ...th) plugin installed, you can enable the the "Use 'Shortest Path' plugin" in the Que...

(QB_NEW_EN)

🤖 Prompt for AI Agents
In README.md around lines 36 to 38, there is a duplicated word "the the" in the
sentence about the Shortest Path plugin; remove the extra "the" so the sentence
reads "...you can enable the "Use 'Shortest Path' plugin" in the Quest Helper
config." Ensure spacing and punctuation remain correct after deletion.

![](./images/shortest-path-01.png)

Next time you start a quest, the Shortest Path plugin will help you take the shortest path to the destination.

![Shortest Path path overlay example](./images/shortest-path-02.png)

You can configure what teleportation methods, or the aesthetic of the path in the Shortest Path config.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Clarify sentence.

Apply:

-You can configure what teleportation methods, or the aesthetic of the path in the Shortest Path config.
+You can configure which teleportation methods to use and the path’s aesthetic in the Shortest Path config.
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
You can configure what teleportation methods, or the aesthetic of the path in the Shortest Path config.
You can configure which teleportation methods to use and the path’s aesthetic in the Shortest Path config.
🤖 Prompt for AI Agents
In README.md around line 45, the sentence "You can configure what teleportation
methods, or the aesthetic of the path in the Shortest Path config." is unclear
and grammatically incorrect; replace it with a clear, concise sentence such as
"You can configure teleportation methods and the aesthetic of the path in the
Shortest Path configuration." to fix the grammar, remove the stray comma, and
use "configuration" for clarity.


## Help and discussion

[![Buy Me a Coffee](https://img.shields.io/badge/Buy%20Me%20a%20Coffee-donate-yellow)](https://www.paypal.com/paypalme/MicrobotBE?country.x=BE)


Expand Down
Binary file added images/not-enough-runes-01.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/shortest-path-01.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/shortest-path-02.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
# Quest Helper Sync Tracking File
# This file tracks the last synchronized commit from the external quest-helper repository
#
# External Repository: https://github.com/Zoinkwiz/quest-helper
# Local Integration: runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/
#
# IMPORTANT: Do not manually edit this file unless you know what you're doing.
# Use the quest-helper update scripts to manage synchronization.

# Current sync position - this is the last external commit that has been integrated
5539626281a502ba8c44fe59b8b57bce32fe4f16

# Sync metadata (for script reference)
# External repo HEAD at last check: 5539626281a502ba8c44fe59b8b57bce32fe4f16
# Last sync date: 2025-08-29
# Sync method: automated script with manual package transformation
# Integration branch: quest-helper-update-20250829_063754
# Local commit: cb416ef02a (quest-helper: polish Enakhras Lament)

# Sync history log:
# 2025-08-29 07:14:46 - Applied commit 55396262 (Polish enahkras lament #2294)
# - Enhanced EnakhrasLament.java with better code organization
# - Fixed Shadow Room brazier puzzle sequence and locations
# - Added missing chisel icon for cutOffLimb step
# - Files changed: 1 Java file, +359/-204 lines
# - Package transformation: com.questhelper -> net.runelite.client.plugins.microbot.questhelper
# - Status: SUCCESS
#
# 2025-08-28 16:35:20 - Complete sync to version 4.10.0
# - Applied 76 patches successfully from external repository
# - Skipped 4 patches (build files, CI workflows not applicable to Microbot)
# - Base sync point: 6329d81ee15a07a4b4fb53217bd4305e978c7a0e
# - Status: SUCCESS
#
# 2025-08-28 16:28:12 - Partial sync (first 4 patches)
# - Initial automated sync setup and testing
# - Applied commits d2df892a..4c204e89
# - Status: SUCCESS
#
# 2025-08-28 16:13:45 - Initial sync tracking setup
# - Created sync file and established tracking
# - Method: manual setup
# - Status: INITIALIZED

# Integration status
# Current external version: 4.10.0+
# Integration health: HEALTHY
# Last validation: 2025-08-29
# Compilation status: SUCCESS
# Package transformation: COMPLETE
# Sync file location: CORRECT (moved from project root)
Original file line number Diff line number Diff line change
Expand Up @@ -534,6 +534,17 @@ default boolean showWidgetHints()
)
default boolean solvePuzzles() { return true; }

@ConfigItem(
keyName = "showWorldMapPoint",
name = "Display world map point",
description = "Choose whether the arrow & icon of your current step should be visible on the world map.<br>Changing this will take effect next time your quest step updates.",
section = hintsSection
)
default boolean showWorldMapPoint()
{
return true;
}

@ConfigItem(
keyName = "useShortestPath",
name = "Use 'Shortest Path' plugin",
Expand Down Expand Up @@ -681,4 +692,24 @@ default boolean showCompletedQuests()
{
return false;
}

@ConfigSection(
position = 5,
name = "Development",
description = "Options that configure the quest helper development experience",
closedByDefault = true
)
String developmentSection = "developmentSection";

@ConfigItem(
keyName = "devShowOverlayOnLaunch",
name = "Show overlay on launch",
description = "Show the dev overlay (::questhelperdebug) on launch",
position = 4,
section = developmentSection
)
default boolean devShowOverlayOnLaunch()
{
return false;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@
import net.runelite.client.util.Text;
import org.apache.commons.lang3.ArrayUtils;

import javax.annotation.Nullable;
import javax.inject.Inject;
import javax.inject.Named;
import javax.swing.*;
Expand Down Expand Up @@ -198,6 +199,14 @@ protected void startUp() throws IOException

questOverlayManager.startUp();

if (developerMode)
{
if (config.devShowOverlayOnLaunch())
{
questOverlayManager.addDebugOverlay();
}
}

final BufferedImage icon = Icon.QUEST_ICON.getImage();

panel = new QuestHelperPanel(this, questManager, configManager);
Expand Down Expand Up @@ -229,6 +238,11 @@ protected void shutDown()
eventBus.unregister(playerStateManager);
eventBus.unregister(runeliteObjectManager);
eventBus.unregister(worldMapAreaManager);
if (developerMode)
{
// We don't check if it was added, since removing an unadded overlay is a no-op
questOverlayManager.removeDebugOverlay();
}
questOverlayManager.shutDown();
playerStateManager.shutDown();

Expand Down Expand Up @@ -409,6 +423,18 @@ public void onConfigChanged(ConfigChanged event)
questManager.getSelectedQuest().setSidebarOrder(loadSidebarOrder(questManager.getSelectedQuest()));
}
}

if (developerMode && "devShowOverlayOnLaunch".equals(event.getKey()))
{
if (config.devShowOverlayOnLaunch())
{
questOverlayManager.addDebugOverlay();
}
else
{
questOverlayManager.removeDebugOverlay();
}
}
}

@Subscribe
Expand Down Expand Up @@ -462,7 +488,7 @@ public List<BankTabItems> getPluginBankTagItemsForSections()
return questBankManager.getBankTagService().getPluginBankTagItemsForSections(false);
}

public QuestHelper getSelectedQuest()
public @Nullable QuestHelper getSelectedQuest()
{
return questManager.getSelectedQuest();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,7 @@ public enum ItemCollections
SAW("Saw", ImmutableList.of(
ItemID.POH_SAW,
ItemID.WEARABLE_SAW,
ItemID.WEARABLE_SAW_OFFHAND,
ItemID.EYEGLO_CRYSTAL_SAW
)),

Expand Down Expand Up @@ -485,7 +486,14 @@ public enum ItemCollections
ItemID._4DOSEPRAYERRESTORE,
ItemID._3DOSEPRAYERRESTORE,
ItemID._2DOSEPRAYERRESTORE,
ItemID._1DOSEPRAYERRESTORE
ItemID._1DOSEPRAYERRESTORE,
ItemID._4DOSE2RESTORE,
ItemID._3DOSE2RESTORE,
ItemID._2DOSE2RESTORE,
ItemID._1DOSE2RESTORE,
ItemID.HUNTER_MIX_MOONMOTH_2DOSE,
ItemID.HUNTER_MIX_MOONMOTH_1DOSE,
ItemID.BUTTERFLY_JAR_MOONMOTH
)),

RESTORE_POTIONS(ImmutableList.of(
Expand Down Expand Up @@ -1218,17 +1226,16 @@ public enum ItemCollections
ItemID.DRAMEN_STAFF
)),

ESSENCE_LOW(ImmutableList.of(
ItemID.BLANKRUNE_DAEYALT,
ItemID.BLANKRUNE_HIGH,
ItemID.BLANKRUNE
)),

ESSENCE_HIGH(ImmutableList.of(
ItemID.BLANKRUNE_DAEYALT,
ItemID.BLANKRUNE_HIGH
)),

ESSENCE_LOW(new ImmutableList.Builder<Integer>()
.addAll(ESSENCE_HIGH.items).add(
ItemID.BLANKRUNE).build()
),

COINS(ImmutableList.of(
ItemID.COINS,
ItemID.MAGICTRAINING_COINS,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -184,16 +184,20 @@ protected void setupRequirements()
crystalTrink = new ItemRequirement("Crystal Trinket", ItemID.MOURNING_CRYSTAL_TRINKET).showConditioned(notDeathRune).isNotConsumed();
highEss = new ItemRequirement("Pure or Daeyalt essence", ItemCollections.ESSENCE_HIGH)
.showConditioned(notDeathRune);
newKey = new KeyringRequirement("New key", configManager, KeyringCollection.NEW_KEY).showConditioned(notDeathRune).isNotConsumed();

var hasCompletedSOTE = new QuestRequirement(QuestHelperQuest.SONG_OF_THE_ELVES, QuestState.FINISHED);

newKey = new KeyringRequirement("New key", configManager, KeyringCollection.NEW_KEY).showConditioned(notDeathRune).isNotConsumed().hideConditioned(hasCompletedSOTE);
newKey.setTooltip("Another can be found on the desk in the south-east room of the Mourner HQ basement.");
mournerBoots = new ItemRequirement("Mourner boots", ItemID.MOURNING_MOURNER_BOOTS).isNotConsumed();
gasMask = new ItemRequirement("Gas mask", ItemID.GASMASK).isNotConsumed();
mournerGloves = new ItemRequirement("Mourner gloves", ItemID.MOURNING_MOURNER_GLOVES).isNotConsumed();
mournerCloak = new ItemRequirement("Mourner cloak", ItemID.MOURNING_MOURNER_CLOAK).isNotConsumed();
mournerTop = new ItemRequirement("Mourner top", ItemID.MOURNING_MOURNER_TOP).isNotConsumed();
mournerTrousers = new ItemRequirement("Mourner trousers", ItemID.MOURNING_MOURNER_LEGS).isNotConsumed();

mournerBoots = new ItemRequirement("Mourner boots", ItemID.MOURNING_MOURNER_BOOTS).isNotConsumed().hideConditioned(hasCompletedSOTE);
gasMask = new ItemRequirement("Gas mask", ItemID.GASMASK).isNotConsumed().hideConditioned(hasCompletedSOTE);
mournerGloves = new ItemRequirement("Mourner gloves", ItemID.MOURNING_MOURNER_GLOVES).isNotConsumed().hideConditioned(hasCompletedSOTE);
mournerCloak = new ItemRequirement("Mourner cloak", ItemID.MOURNING_MOURNER_CLOAK).isNotConsumed().hideConditioned(hasCompletedSOTE);
mournerTop = new ItemRequirement("Mourner top", ItemID.MOURNING_MOURNER_TOP).isNotConsumed().hideConditioned(hasCompletedSOTE);
mournerTrousers = new ItemRequirement("Mourner trousers", ItemID.MOURNING_MOURNER_LEGS).isNotConsumed().hideConditioned(hasCompletedSOTE);
mournersOutfit = new ItemRequirements("Full mourners' outfit", gasMask, mournerTop, mournerTrousers,
mournerCloak, mournerBoots, mournerGloves).showConditioned(notDeathRune).isNotConsumed();
mournerCloak, mournerBoots, mournerGloves).showConditioned(notDeathRune).isNotConsumed().hideConditioned(hasCompletedSOTE);
mournersOutfit.setTooltip("Another set can be obtained at the north entrance to Arandar.");
rake = new ItemRequirement("Rake", ItemID.RAKE)
.showConditioned(new Conditions(LogicType.OR, notPalmTree, notPoisonIvy)).isNotConsumed();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -667,7 +667,8 @@ public List<ItemRequirement> getItemRequirements()
bow, oakLogs, tinderbox, axe,
feathers, knife,
hammer, bronzeBar.quantity(2), logs.quantity(3),
attackPotion, roe);
attackPotion, roe,
antifireShield, combatGear);
}

@Override
Expand All @@ -676,6 +677,12 @@ public List<ItemRequirement> getItemRecommended()
return Arrays.asList(gamesNecklace.quantity(5), catherbyTeleport);
}

@Override
public List<String> getCombatRequirements()
{
return Collections.singletonList("Mithril Dragon (level 304)");
}

@Override
public List<String> getNotes()
{
Expand Down
Loading