From fd18be1892273a0e10912fe3979d5e60b3d9af2a Mon Sep 17 00:00:00 2001 From: itsbotzilla <25913563+itsBOTzilla@users.noreply.github.com> Date: Sat, 5 Sep 2026 11:41:22 -0500 Subject: [PATCH] fix(questhelper): handle locationless detailed steps --- .../questhelper/QuestHelperPlugin.java | 2 +- .../microbot/questhelper/QuestScript.java | 18 +++++++++------ .../questhelper/QuestDetailedStepTest.java | 22 +++++++++++++++++++ 3 files changed, 34 insertions(+), 8 deletions(-) create mode 100644 runelite-client/src/test/java/net/runelite/client/plugins/microbot/questhelper/QuestDetailedStepTest.java diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/QuestHelperPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/QuestHelperPlugin.java index 20bd10751a..cebe26e283 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/QuestHelperPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/QuestHelperPlugin.java @@ -79,7 +79,7 @@ @PluginDescriptor( name = "Quest Helper", - version = "1.0.7", + version = "1.0.8", description = "Helps you with questing", tags = { "quest", "helper", "overlay" } ) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/QuestScript.java b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/QuestScript.java index 9ca5491300..4e624029a2 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/QuestScript.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/questhelper/QuestScript.java @@ -1977,11 +1977,15 @@ private String chooseCorrectItemOption(QuestStep step, int itemId) { private boolean applyDetailedQuestStep(DetailedQuestStep conditionalStep) { if (conditionalStep instanceof NpcStep) return false; + WorldPoint stepWorldPoint = conditionalStep.getDefinedPoint() == null + ? null + : conditionalStep.getDefinedPoint().getWorldPoint(); + if (conditionalStep.getIconItemID() != -1 - && conditionalStep.getDefinedPoint().getWorldPoint() != null - && !conditionalStep.getDefinedPoint().getWorldPoint().toWorldArea().hasLineOfSightTo(Microbot.getClient().getTopLevelWorldView(), Rs2Player.getWorldLocation())) { - if (Rs2Tile.areSurroundingTilesWalkable(conditionalStep.getDefinedPoint().getWorldPoint(), 1, 1)) { - WorldPoint nearestUnreachableWalkableTile = Rs2Tile.getNearestWalkableTileWithLineOfSight(conditionalStep.getDefinedPoint().getWorldPoint()); + && stepWorldPoint != null + && !stepWorldPoint.toWorldArea().hasLineOfSightTo(Microbot.getClient().getTopLevelWorldView(), Rs2Player.getWorldLocation())) { + if (Rs2Tile.areSurroundingTilesWalkable(stepWorldPoint, 1, 1)) { + WorldPoint nearestUnreachableWalkableTile = Rs2Tile.getNearestWalkableTileWithLineOfSight(stepWorldPoint); if (nearestUnreachableWalkableTile != null) { return Rs2Walker.walkTo(nearestUnreachableWalkableTile, 0); } @@ -2008,11 +2012,11 @@ private boolean applyDetailedQuestStep(DetailedQuestStep conditionalStep) { } } - if (!usingItems && conditionalStep.getDefinedPoint().getWorldPoint() != null && !Rs2Walker.walkTo(conditionalStep.getDefinedPoint().getWorldPoint())) + if (!usingItems && stepWorldPoint != null && !Rs2Walker.walkTo(stepWorldPoint)) return true; - if (conditionalStep.getIconItemID() != -1 && conditionalStep.getDefinedPoint().getWorldPoint() != null - && conditionalStep.getDefinedPoint().getWorldPoint().toWorldArea().hasLineOfSightTo(Microbot.getClient().getTopLevelWorldView(), Rs2Player.getWorldLocation())) { + if (conditionalStep.getIconItemID() != -1 && stepWorldPoint != null + && stepWorldPoint.toWorldArea().hasLineOfSightTo(Microbot.getClient().getTopLevelWorldView(), Rs2Player.getWorldLocation())) { if (conditionalStep.getQuestHelper().getQuest() == QuestHelperQuest.ZOGRE_FLESH_EATERS) { if (conditionalStep.getIconItemID() == 4836) { // strange potion lootGroundItem(ItemID.CUP_OF_TEA_4838, 20); diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/microbot/questhelper/QuestDetailedStepTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/microbot/questhelper/QuestDetailedStepTest.java new file mode 100644 index 0000000000..cb59a32fbd --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/plugins/microbot/questhelper/QuestDetailedStepTest.java @@ -0,0 +1,22 @@ +package net.runelite.client.plugins.microbot.questhelper; + +import java.lang.reflect.Method; +import net.runelite.client.plugins.microbot.questhelper.steps.DetailedQuestStep; +import org.junit.Test; + +import static org.junit.Assert.assertFalse; + +public class QuestDetailedStepTest +{ + @Test + public void locationlessDetailedStepDoesNotCrash() throws Exception + { + QuestScript script = new QuestScript(); + DetailedQuestStep step = new DetailedQuestStep(null, "Read the notes."); + Method applyDetailedQuestStep = QuestScript.class.getDeclaredMethod( + "applyDetailedQuestStep", DetailedQuestStep.class); + applyDetailedQuestStep.setAccessible(true); + + assertFalse((boolean) applyDetailedQuestStep.invoke(script, step)); + } +}