diff --git a/src/main/java/net/runelite/client/plugins/microbot/AmmoniteCrabs/AmmoniteCrabPlugin.java b/src/main/java/net/runelite/client/plugins/microbot/AmmoniteCrabs/AmmoniteCrabPlugin.java index 6233dd29c1..d23df32335 100644 --- a/src/main/java/net/runelite/client/plugins/microbot/AmmoniteCrabs/AmmoniteCrabPlugin.java +++ b/src/main/java/net/runelite/client/plugins/microbot/AmmoniteCrabs/AmmoniteCrabPlugin.java @@ -28,7 +28,7 @@ @Slf4j public class AmmoniteCrabPlugin extends Plugin { - public final static String version = "1.1.6"; + public final static String version = "1.1.7"; @Inject public AmmoniteCrabScript ammoniteCrabScript; @Inject diff --git a/src/main/java/net/runelite/client/plugins/microbot/AmmoniteCrabs/AmmoniteCrabScript.java b/src/main/java/net/runelite/client/plugins/microbot/AmmoniteCrabs/AmmoniteCrabScript.java index 4706db437b..d7da445bcd 100644 --- a/src/main/java/net/runelite/client/plugins/microbot/AmmoniteCrabs/AmmoniteCrabScript.java +++ b/src/main/java/net/runelite/client/plugins/microbot/AmmoniteCrabs/AmmoniteCrabScript.java @@ -46,11 +46,12 @@ public boolean run(AmmoniteCrabConfig config) { switch (ammoniteCrabState) { case FIGHT: - if (!Microbot.getClient().getLocalPlayer().isInteracting() && !Rs2Combat.inCombat()) { + if (!Rs2Player.isInteracting() && !Rs2Combat.inCombat()) { Rs2Combat.enableAutoRetialiate(); } - if (Rs2Player.getWorldLocation().distanceTo(config.crabLocation().getFightLocation()) > 0) { + WorldPoint fightPlayerLocation = Rs2Player.getWorldLocation(); + if (fightPlayerLocation != null && fightPlayerLocation.distanceTo(config.crabLocation().getFightLocation()) > 0) { Rs2Walker.walkFastCanvas(config.crabLocation().getFightLocation()); } @@ -132,7 +133,8 @@ private void preStateChecks(AmmoniteCrabConfig config) { ammoniteCrabState = AmmoniteCrabState.HOP_WORLD; } - if (Microbot.getClientThread().invoke(() -> Microbot.getClient().getLocalPlayer().getWorldLocation()).distanceTo(config.crabLocation().getWorldhopLocation()) > 10 && (ammoniteCrabState != AmmoniteCrabState.RESET_AGGRO && ammoniteCrabState != AmmoniteCrabState.WALK_BACK && ammoniteCrabState != AmmoniteCrabState.BANK)) { + WorldPoint playerLocation = Rs2Player.getWorldLocation(); + if (playerLocation != null && playerLocation.distanceTo(config.crabLocation().getWorldhopLocation()) > 10 && (ammoniteCrabState != AmmoniteCrabState.RESET_AGGRO && ammoniteCrabState != AmmoniteCrabState.WALK_BACK && ammoniteCrabState != AmmoniteCrabState.BANK)) { ammoniteCrabState = AmmoniteCrabState.WALK_BACK; resetAggro(config); resetAfkTimer(); @@ -178,7 +180,11 @@ private void scanAmmoniteCrabLocation(AmmoniteCrabConfig config) { ammoniteCrabState = AmmoniteCrabState.FIGHT; return; } - if (config.crabLocation().getWorldhopLocation().distanceTo(Microbot.getClientThread().invoke(() -> Microbot.getClient().getLocalPlayer().getWorldLocation())) > 2) { + WorldPoint playerLocation = Rs2Player.getWorldLocation(); + if (playerLocation == null) { + return; + } + if (config.crabLocation().getWorldhopLocation().distanceTo(playerLocation) > 2) { Rs2Walker.walkTo(config.crabLocation().getWorldhopLocation()); return; } @@ -188,7 +194,7 @@ private void scanAmmoniteCrabLocation(AmmoniteCrabConfig config) { return; } else { Rs2Walker.walkTo(config.crabLocation().getFightLocation(), 0); - if (Rs2Player.getWorldLocation().distanceTo(config.crabLocation().getFightLocation()) <= 3) { + if (isWithin(Rs2Player.getWorldLocation(), config.crabLocation().getFightLocation(), 3)) { resetAfkTimer(); ammoniteCrabState = AmmoniteCrabState.FIGHT; } else { @@ -208,7 +214,7 @@ private void usePotions(AmmoniteCrabConfig config) { private void walkBack(AmmoniteCrabConfig config) { Rs2Walker.walkTo(config.crabLocation().getFightLocation()); - if (Microbot.getClientThread().invoke(() -> Microbot.getClient().getLocalPlayer().getWorldLocation()).distanceTo(config.crabLocation().getFightLocation()) <= 3) { + if (isWithin(Rs2Player.getWorldLocation(), config.crabLocation().getFightLocation(), 3)) { attackScatteredCrabs(config); resetAfkTimer(); ammoniteCrabState = AmmoniteCrabState.FIGHT; @@ -256,7 +262,7 @@ private boolean isNpcAggressive() { private void resetAggro(AmmoniteCrabConfig config) { Rs2Walker.walkTo(config.crabLocation().getResetLocation()); - if (Microbot.getClientThread().invoke(() -> Microbot.getClient().getLocalPlayer().getWorldLocation()).distanceTo(config.crabLocation().getResetLocation()) <= 3) { + if (isWithin(Rs2Player.getWorldLocation(), config.crabLocation().getResetLocation(), 3)) { ammoniteCrabState = AmmoniteCrabState.WALK_BACK; } } @@ -273,10 +279,17 @@ private void resetAfkTimer() { } private boolean otherPlayerDetected() { - return otherPlayerDetected(Microbot.getClientThread().invoke(() -> Microbot.getClient().getLocalPlayer().getWorldLocation())); + return otherPlayerDetected(Rs2Player.getWorldLocation()); } - private boolean otherPlayerDetected(WorldPoint worldPoint) { + static boolean isWithin(WorldPoint location, WorldPoint target, int distance) { + return location != null && location.distanceTo(target) <= distance; + } + + static boolean otherPlayerDetected(WorldPoint worldPoint) { + if (worldPoint == null) { + return false; + } for (Rs2PlayerModel player : Rs2Player.getPlayers(player -> true).collect(Collectors.toList())) { if (player.getWorldLocation().distanceTo(worldPoint) > 3) continue; diff --git a/src/test/java/net/runelite/client/plugins/microbot/AmmoniteCrabs/AmmoniteCrabScriptTest.java b/src/test/java/net/runelite/client/plugins/microbot/AmmoniteCrabs/AmmoniteCrabScriptTest.java new file mode 100644 index 0000000000..6b1d2e8e70 --- /dev/null +++ b/src/test/java/net/runelite/client/plugins/microbot/AmmoniteCrabs/AmmoniteCrabScriptTest.java @@ -0,0 +1,36 @@ +package net.runelite.client.plugins.microbot.AmmoniteCrabs; + +import net.runelite.api.coords.WorldPoint; +import net.runelite.client.plugins.microbot.util.player.Rs2Player; +import org.junit.jupiter.api.Test; +import org.mockito.MockedStatic; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mockStatic; +import static org.mockito.Mockito.never; + +class AmmoniteCrabScriptTest { + + private final WorldPoint fightLocation = new WorldPoint(3733, 3846, 0); + + @Test + void nullPlayerLocationIsNotWithinRange() { + assertFalse(AmmoniteCrabScript.isWithin(null, fightLocation, 3)); + } + + @Test + void playerLocationWithinRangeIsDetected() { + assertTrue(AmmoniteCrabScript.isWithin(new WorldPoint(3735, 3846, 0), fightLocation, 3)); + assertFalse(AmmoniteCrabScript.isWithin(new WorldPoint(3740, 3846, 0), fightLocation, 3)); + } + + @Test + void nullLocationDetectsNoOtherPlayerWithoutQueryingPlayers() { + try (MockedStatic player = mockStatic(Rs2Player.class)) { + assertFalse(AmmoniteCrabScript.otherPlayerDetected(null)); + player.verify(() -> Rs2Player.getPlayers(any()), never()); + } + } +}