From 2482dc6068fd9ff632f51955fa94a972b8e37965 Mon Sep 17 00:00:00 2001 From: chsami <23292806+chsami@users.noreply.github.com> Date: Sat, 17 Oct 2026 18:08:59 +0200 Subject: [PATCH] fix(MahoganyHomes): skip hotspots beyond home object count in getFixableObjects (0.0.16) getFixableObjects indexed HotspotObjects.objects by Hotspot ordinal without a bounds check, so a broken hotspot 8 varbit at a 7-object home (or 7/8 at SARAH) threw ArrayIndexOutOfBoundsException and aborted the script loop. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01LjtEMzQHGuq4M1Mpqk9pPV --- .../mahoganyhomez/MahoganyHomesPlugin.java | 2 +- .../mahoganyhomez/MahoganyHomesScript.java | 12 ++++++--- .../MahoganyHomesScriptTest.java | 25 +++++++++++++++++++ 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/src/main/java/net/runelite/client/plugins/microbot/mahoganyhomez/MahoganyHomesPlugin.java b/src/main/java/net/runelite/client/plugins/microbot/mahoganyhomez/MahoganyHomesPlugin.java index 9ad95f8239..41f53b416c 100644 --- a/src/main/java/net/runelite/client/plugins/microbot/mahoganyhomez/MahoganyHomesPlugin.java +++ b/src/main/java/net/runelite/client/plugins/microbot/mahoganyhomez/MahoganyHomesPlugin.java @@ -55,7 +55,7 @@ isExternal = PluginConstants.IS_EXTERNAL ) public class MahoganyHomesPlugin extends Plugin { - public static final String version = "0.0.15"; + public static final String version = "0.0.16"; private static final List PLANKS = Arrays.asList(ItemID.PLANK, ItemID.OAK_PLANK, ItemID.TEAK_PLANK, ItemID.MAHOGANY_PLANK); private static final List PLANK_NAMES = Arrays.asList("Plank", "Oak plank", "Teak plank", "Mahogany plank"); private static final Map MAHOGANY_HOMES_REPAIRS = new HashMap<>(); diff --git a/src/main/java/net/runelite/client/plugins/microbot/mahoganyhomez/MahoganyHomesScript.java b/src/main/java/net/runelite/client/plugins/microbot/mahoganyhomez/MahoganyHomesScript.java index d6c4bc6fa6..2ee29bf5cb 100644 --- a/src/main/java/net/runelite/client/plugins/microbot/mahoganyhomez/MahoganyHomesScript.java +++ b/src/main/java/net/runelite/client/plugins/microbot/mahoganyhomez/MahoganyHomesScript.java @@ -74,10 +74,7 @@ private List getFixableObjects() { List fixableHotspots = Hotspot.getBrokenHotspots(); HotspotObjects hotspotObjects = plugin.getCurrentHome().getHotspotObjects(); - // Precompute the set of IDs - Set ids = fixableHotspots.stream() - .map(hotspot -> hotspotObjects.objects[hotspot.ordinal()].getObjectId()) - .collect(Collectors.toSet()); + Set ids = getFixableObjectIds(fixableHotspots, hotspotObjects); // Filter using the precomputed set return objects.stream() @@ -86,6 +83,13 @@ private List getFixableObjects() { .collect(Collectors.toList()); } + static Set getFixableObjectIds(List hotspots, HotspotObjects hotspotObjects) { + return hotspots.stream() + .filter(hotspot -> hotspot.ordinal() < hotspotObjects.objects.length) + .map(hotspot -> hotspotObjects.objects[hotspot.ordinal()].getObjectId()) + .collect(Collectors.toSet()); + } + // Custom logging methods private void log(String message) { if (plugin.getConfig().logMessages()) { diff --git a/src/test/java/net/runelite/client/plugins/microbot/mahoganyhomez/MahoganyHomesScriptTest.java b/src/test/java/net/runelite/client/plugins/microbot/mahoganyhomez/MahoganyHomesScriptTest.java index 3544b0d6ba..b2b80988c2 100644 --- a/src/test/java/net/runelite/client/plugins/microbot/mahoganyhomez/MahoganyHomesScriptTest.java +++ b/src/test/java/net/runelite/client/plugins/microbot/mahoganyhomez/MahoganyHomesScriptTest.java @@ -3,6 +3,9 @@ import net.runelite.api.coords.WorldPoint; import org.junit.jupiter.api.Test; +import java.util.Arrays; +import java.util.Set; + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNull; @@ -42,6 +45,28 @@ void isAwayFromHomeComparesPlayerLocationToHomeArea() { assertFalse(script.isAwayFromHome(Home.JESS, new WorldPoint(2615, 3293, 1))); } + @Test + void fixableObjectIdsSkipsHotspotsBeyondHomeObjectCount() { + Set ids = MahoganyHomesScript.getFixableObjectIds(Arrays.asList(Hotspot.values()), HotspotObjects.ROSS); + assertEquals(HotspotObjects.ROSS.objects.length, ids.size()); + assertTrue(ids.contains(HotspotObjects.ROSS.objects[6].getObjectId())); + } + + @Test + void fixableObjectIdsSkipsHotspotsBeyondSixObjectHome() { + Set ids = MahoganyHomesScript.getFixableObjectIds( + Arrays.asList(Hotspot.MAHOGANY_HOMES_HOTSPOT_1, Hotspot.MAHOGANY_HOMES_HOTSPOT_7, Hotspot.MAHOGANY_HOMES_HOTSPOT_8), + HotspotObjects.SARAH); + assertEquals(Set.of(HotspotObjects.SARAH.objects[0].getObjectId()), ids); + } + + @Test + void fixableObjectIdsMapsAllHotspotsForEightObjectHome() { + Set ids = MahoganyHomesScript.getFixableObjectIds(Arrays.asList(Hotspot.values()), HotspotObjects.JESS); + assertEquals(8, ids.size()); + assertTrue(ids.contains(HotspotObjects.JESS.objects[7].getObjectId())); + } + private static MahoganyHomesScript scriptWithPlugin() { MahoganyHomesScript script = new MahoganyHomesScript(); script.plugin = new MahoganyHomesPlugin();