diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/breakhandler/BreakHandlerConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/breakhandler/BreakHandlerConfig.java index 4cf294a1c2c..53f089e6b1a 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/breakhandler/BreakHandlerConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/breakhandler/BreakHandlerConfig.java @@ -123,7 +123,7 @@ default boolean logoutAfterBreak() { @ConfigItem( keyName = "useRandomWorld", - name = "Use RandomWorld", + name = "Use Random World", description = "Change to a random world once break is finished", position = 2, section = breakBehaviorOptions @@ -132,11 +132,22 @@ default boolean useRandomWorld() { return false; } + @ConfigItem( + keyName = "regionFilter", + name = "Region Filter", + description = "Restrict random worlds to a specific region", + position = 3, + section = breakBehaviorOptions + ) + default RegionFilter regionFilter() { + return RegionFilter.ANY; + } + @ConfigItem( keyName = "shutdownClient", name = "Shutdown Client", description = "WARNING: This will completely shutdown the entire RuneLite client during breaks.
Use with caution - you will need to manually restart the client after breaks.", - position = 3, + position = 4, section = breakBehaviorOptions ) default boolean shutdownClient() { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/breakhandler/BreakHandlerScript.java b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/breakhandler/BreakHandlerScript.java index 65194d235cc..b7707ababd5 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/breakhandler/BreakHandlerScript.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/breakhandler/BreakHandlerScript.java @@ -43,7 +43,7 @@ */ @Slf4j public class BreakHandlerScript extends Script { - public static String version = "2.0.0"; + public static String version = "2.1.0"; // Constants for configuration and timing private static final int SCHEDULER_INTERVAL_MS = 1000; @@ -106,6 +106,10 @@ public static void setLockState(boolean state) { private String originalWindowTitle = ""; private BreakHandlerConfig config; + // Track world state across breaks + private int preBreakWorld = -1; + private boolean loggedOutDuringBreak = false; + /** * Checks if a break is currently active (any break state except waiting). */ @@ -323,8 +327,14 @@ private void handleInitiatingBreakState() { Microbot.pauseAllScripts.compareAndSet(false, true); PluginPauseEvent.setPaused(true); Rs2Walker.setTarget(null); + + // Remember the world we were in before the break + preBreakWorld = Microbot.getClient().getWorld(); + // Determine next state based on break type - if (Rs2AntibanSettings.microBreakActive && (config.onlyMicroBreaks() || !shouldLogout())) { + boolean logout = shouldLogout(); + loggedOutDuringBreak = logout && !(Rs2AntibanSettings.microBreakActive && config.onlyMicroBreaks()); + if (!logout || (Rs2AntibanSettings.microBreakActive && config.onlyMicroBreaks())) { setBreakDuration(); transitionToState(BreakHandlerState.MICRO_BREAK_ACTIVE); } else { @@ -447,9 +457,12 @@ private void handleLoginRequestedState() { try { // Use the Login utility class to handle login if (Login.activeProfile != null) { - new Login(); + int world = config.useRandomWorld() + ? Login.getRandomWorld(Rs2Player.isMember(), config.regionFilter().getRegion()) + : preBreakWorld; + new Login(world); } else { - // If no active profile, use default login + // If no active profile, fall back to default login new Login(); } transitionToState(BreakHandlerState.LOGGING_IN); @@ -551,7 +564,10 @@ private boolean isSafeToBreak() { * Determines if logout should occur based on configuration and conditions. */ private boolean shouldLogout() { - return isOutsidePlaySchedule() || config.logoutAfterBreak(); + // Only attempt to logout during a normal break. When a micro break is + // active we should remain logged in regardless of the logout setting. + return !Rs2AntibanSettings.microBreakActive && + (isOutsidePlaySchedule() || config.logoutAfterBreak()); } /** @@ -608,9 +624,9 @@ private void resumeFromBreak() { * Handles world switching based on configuration. */ private void handleWorldSwitching() { - if (config.useRandomWorld()) { + if (config.useRandomWorld() && !loggedOutDuringBreak) { try { - int randomWorld = Login.getRandomWorld(Rs2Player.isMember()); + int randomWorld = Login.getRandomWorld(Rs2Player.isMember(), config.regionFilter().getRegion()); Microbot.hopToWorld(randomWorld); log.info("Switched to world {}", randomWorld); } catch (Exception ex) { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/breakhandler/RegionFilter.java b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/breakhandler/RegionFilter.java new file mode 100644 index 00000000000..161566b395f --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/breakhandler/RegionFilter.java @@ -0,0 +1,27 @@ +package net.runelite.client.plugins.microbot.breakhandler; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import net.runelite.http.api.worlds.WorldRegion; + +/** + * Region options for selecting random worlds. + */ +@RequiredArgsConstructor +public enum RegionFilter { + ANY(null, "Any"), + US(WorldRegion.UNITED_STATES_OF_AMERICA, "US"), + UK(WorldRegion.UNITED_KINGDOM, "UK"), + GERMANY(WorldRegion.GERMANY, "Germany"), + AUSTRALIA(WorldRegion.AUSTRALIA, "Australia"); + + @Getter + private final WorldRegion region; + + private final String name; + + @Override + public String toString() { + return name; + } +}