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;
+ }
+}