diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/accountselector/AutoLoginConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/accountselector/AutoLoginConfig.java index 39be1fa0b63..5927f8e2ec6 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/accountselector/AutoLoginConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/accountselector/AutoLoginConfig.java @@ -1,44 +1,89 @@ -package net.runelite.client.plugins.microbot.accountselector; - -import net.runelite.client.config.Config; -import net.runelite.client.config.ConfigGroup; -import net.runelite.client.config.ConfigItem; -import net.runelite.client.config.ConfigSection; - -@ConfigGroup("AutoLoginConfig") -public interface AutoLoginConfig extends Config { - @ConfigSection( - name = "General", - description = "General", - position = 0, - closedByDefault = false - ) - String generalSection = "general"; - - @ConfigItem( - keyName = "World", - name = "World", - description = "World", - position = 0, - section = generalSection - ) - default int world() { return 360; } - - @ConfigItem( - keyName = "Is Member", - name = "Is Member", - description = "use Member worlds", - position = 0, - section = generalSection - ) - default boolean isMember() { return false; } - - @ConfigItem( - keyName = "RandomWorld", - name = "RandomWorld", - description = "use random worlds", - position = 0, - section = generalSection - ) - default boolean useRandomWorld() { return true; } -} +package net.runelite.client.plugins.microbot.accountselector; + +import net.runelite.client.config.Config; +import net.runelite.client.config.ConfigGroup; +import net.runelite.client.config.ConfigItem; +import net.runelite.client.config.ConfigSection; + +@ConfigGroup("AutoLoginConfig") +public interface AutoLoginConfig extends Config { + @ConfigSection( + name = "General", + description = "General", + position = 0, + closedByDefault = false + ) + String generalSection = "general"; + + @ConfigItem( + keyName = "World", + name = "World", + description = "World", + position = 0, + section = generalSection + ) + default int world() { return 360; } + + @ConfigItem( + keyName = "Is Member", + name = "Is Member", + description = "Use member worlds", + position = 1, + section = generalSection + ) + default boolean isMember() { return false; } + + @ConfigItem( + keyName = "RandomWorld", + name = "Use Random World", + description = "Use random worlds", + position = 2, + section = generalSection + ) + default boolean useRandomWorld() { return true; } + + @ConfigSection( + name = "Region Filter", + description = "Filter random world selection by region", + position = 10, + closedByDefault = false + ) + String regionSection = "region"; + + + @ConfigItem( + keyName = "AllowUK", + name = "UK", + description = "Allow UK worlds", + position = 1, + section = regionSection + ) + default boolean allowUK() { return true; } + + @ConfigItem( + keyName = "AllowUS", + name = "US", + description = "Allow US worlds", + position = 2, + section = regionSection + ) + default boolean allowUS() { return true; } + + @ConfigItem( + keyName = "AllowGermany", + name = "Germany", + description = "Allow German worlds", + position = 3, + section = regionSection + ) + default boolean allowGermany() { return true; } + + @ConfigItem( + keyName = "AllowAustralia", + name = "Australia", + description = "Allow Australian worlds", + position = 4, + section = regionSection + ) + default boolean allowAustralia() { return true; } +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/accountselector/AutoLoginPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/accountselector/AutoLoginPlugin.java index 29d713196e9..ecd8e5e69ea 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/accountselector/AutoLoginPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/accountselector/AutoLoginPlugin.java @@ -1,47 +1,47 @@ -package net.runelite.client.plugins.microbot.accountselector; - -import com.google.inject.Provides; -import lombok.extern.slf4j.Slf4j; -import net.runelite.api.Client; -import net.runelite.client.Notifier; -import net.runelite.client.callback.ClientThread; -import net.runelite.client.config.ConfigManager; -import net.runelite.client.config.ProfileManager; -import net.runelite.client.game.WorldService; -import net.runelite.client.plugins.Plugin; -import net.runelite.client.plugins.PluginDescriptor; -import net.runelite.client.plugins.microbot.Microbot; -import net.runelite.client.plugins.microbot.util.mouse.VirtualMouse; - -import javax.inject.Inject; -import java.awt.*; - -@PluginDescriptor( - name = PluginDescriptor.Mocrosoft + "AutoLogin", - description = "Microbot autologin plugin", - tags = {"account", "microbot", "login"}, - enabledByDefault = false -) -@Slf4j -public class AutoLoginPlugin extends Plugin { - @Inject - AutoLoginScript accountSelectorScript; - - @Inject - AutoLoginConfig autoLoginConfig; - @Provides - AutoLoginConfig provideConfig(ConfigManager configManager) { - return configManager.getConfig(AutoLoginConfig.class); - } - - @Override - protected void startUp() throws AWTException { - Microbot.pauseAllScripts.compareAndSet(true, false); - accountSelectorScript.run(autoLoginConfig); - } - - protected void shutDown() { - accountSelectorScript.shutdown(); - } - -} +package net.runelite.client.plugins.microbot.accountselector; + +import com.google.inject.Provides; +import lombok.extern.slf4j.Slf4j; +import net.runelite.api.Client; +import net.runelite.client.Notifier; +import net.runelite.client.callback.ClientThread; +import net.runelite.client.config.ConfigManager; +import net.runelite.client.config.ProfileManager; +import net.runelite.client.game.WorldService; +import net.runelite.client.plugins.Plugin; +import net.runelite.client.plugins.PluginDescriptor; +import net.runelite.client.plugins.microbot.Microbot; +import net.runelite.client.plugins.microbot.util.mouse.VirtualMouse; + +import javax.inject.Inject; +import java.awt.*; + +@PluginDescriptor( + name = PluginDescriptor.Mocrosoft + "AutoLogin", + description = "Microbot autologin plugin", + tags = {"account", "microbot", "login"}, + enabledByDefault = false +) +@Slf4j +public class AutoLoginPlugin extends Plugin { + @Inject + AutoLoginScript accountSelectorScript; + + @Inject + AutoLoginConfig autoLoginConfig; + @Provides + AutoLoginConfig provideConfig(ConfigManager configManager) { + return configManager.getConfig(AutoLoginConfig.class); + } + + @Override + protected void startUp() throws AWTException { + Microbot.pauseAllScripts.compareAndSet(true, false); + accountSelectorScript.run(autoLoginConfig); + } + + protected void shutDown() { + accountSelectorScript.shutdown(); + } + +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/accountselector/AutoLoginScript.java b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/accountselector/AutoLoginScript.java index f9bf10613db..aa21b24bb6e 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/accountselector/AutoLoginScript.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/accountselector/AutoLoginScript.java @@ -1,33 +1,71 @@ -package net.runelite.client.plugins.microbot.accountselector; - -import net.runelite.api.GameState; -import net.runelite.client.plugins.microbot.Microbot; -import net.runelite.client.plugins.microbot.Script; -import net.runelite.client.plugins.microbot.util.security.Login; - -import java.util.concurrent.TimeUnit; - -public class AutoLoginScript extends Script { - - public boolean run(AutoLoginConfig autoLoginConfig) { - mainScheduledFuture = scheduledExecutorService.scheduleWithFixedDelay(() -> { - try { - if (!super.run()) return; - - if (Microbot.getClient().getGameState() == GameState.LOGIN_SCREEN) { - if (autoLoginConfig.useRandomWorld()) { - new Login(Login.getRandomWorld(autoLoginConfig.isMember())); - } else { - new Login(autoLoginConfig.world()); - } - sleep(5000); - } - - - } catch (Exception ex) { - Microbot.logStackTrace(this.getClass().getSimpleName(), ex); - } - }, 0, 1000, TimeUnit.MILLISECONDS); - return true; - } -} +package net.runelite.client.plugins.microbot.accountselector; + +import net.runelite.api.GameState; +import net.runelite.client.plugins.microbot.Microbot; +import net.runelite.client.plugins.microbot.Script; +import net.runelite.client.plugins.microbot.util.security.Login; +import net.runelite.http.api.worlds.WorldRegion; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; +import java.util.concurrent.TimeUnit; + +public class AutoLoginScript extends Script { + + private List getAllowedRegions(AutoLoginConfig config) { + List allowedRegions = new ArrayList<>(); + + if (config.allowUK()) { + allowedRegions.add(WorldRegion.UNITED_KINGDOM); + } + if (config.allowUS()) { + allowedRegions.add(WorldRegion.UNITED_STATES_OF_AMERICA); + } + if (config.allowGermany()) { + allowedRegions.add(WorldRegion.GERMANY); + } + if (config.allowAustralia()) { + allowedRegions.add(WorldRegion.AUSTRALIA); + } + + return allowedRegions; + } + + private int getRandomWorldWithRegionFilter(AutoLoginConfig config) { + List allowedRegions = getAllowedRegions(config); + + if (allowedRegions.isEmpty()) { + // If no regions allowed, use default method + return Login.getRandomWorld(config.isMember()); + } + + // Pick a random region from allowed regions + Random random = new Random(); + WorldRegion selectedRegion = allowedRegions.get(random.nextInt(allowedRegions.size())); + + return Login.getRandomWorld(config.isMember(), selectedRegion); + } + + public boolean run(AutoLoginConfig autoLoginConfig) { + mainScheduledFuture = scheduledExecutorService.scheduleWithFixedDelay(() -> { + try { + if (!super.run()) return; + + if (Microbot.getClient().getGameState() == GameState.LOGIN_SCREEN) { + if (autoLoginConfig.useRandomWorld()) { + new Login(getRandomWorldWithRegionFilter(autoLoginConfig)); + } else { + new Login(autoLoginConfig.world()); + } + sleep(5000); + } + + + } catch (Exception ex) { + Microbot.logStackTrace(this.getClass().getSimpleName(), ex); + } + }, 0, 1000, TimeUnit.MILLISECONDS); + return true; + } +} 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 deleted file mode 100644 index 5abad73e51f..00000000000 --- a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/breakhandler/BreakHandlerConfig.java +++ /dev/null @@ -1,178 +0,0 @@ -package net.runelite.client.plugins.microbot.breakhandler; - -import net.runelite.client.config.Config; -import net.runelite.client.config.ConfigGroup; -import net.runelite.client.config.ConfigItem; -import net.runelite.client.config.ConfigSection; -import net.runelite.client.plugins.microbot.util.antiban.enums.PlaySchedule; - -@ConfigGroup(BreakHandlerConfig.configGroup) -public interface BreakHandlerConfig extends Config { - // Group name constant for configuration grouping. - String configGroup = "break-handler"; - String hideOverlay = "hideOverlay"; - - // ============================================================ - // Break Timing Settings - // ============================================================ - @ConfigSection( - name = "Break Timing", - description = "Configure when and how long breaks occur", - position = 0 - ) - String breakTimingSettings = "breakTimingSettings"; - - @ConfigItem( - keyName = "Min Playtime", - name = "Min Playtime", - description = "Time until break start in minutes", - position = 0, - section = breakTimingSettings - ) - default int timeUntilBreakStart() { - return 60; - } - - @ConfigItem( - keyName = "Max Playtime", - name = "Max Playtime", - description = "Time until break ends in minutes", - position = 1, - section = breakTimingSettings - ) - default int timeUntilBreakEnd() { - return 120; - } - - @ConfigItem( - keyName = "Min BreakTime", - name = "Min BreakTime", - description = "Break duration start in minutes", - position = 2, - section = breakTimingSettings - ) - default int breakDurationStart() { - return 10; - } - - @ConfigItem( - keyName = "Max BreakTime", - name = "Max BreakTime", - description = "Break duration end in minutes", - position = 3, - section = breakTimingSettings - ) - default int breakDurationEnd() { - return 15; - } - - @ConfigItem( - keyName = "breakNow", - name = "Break Now", - description = "Toggle this to start a break immediately", - position = 4, - section = breakTimingSettings - ) - default boolean breakNow() { - return false; - } - - @ConfigItem( - keyName = "breakEndNow", - name = "End Break Now", - description = "Toggle this to stop the current break immediately", - position = 5, - section = breakTimingSettings - ) - default boolean breakEndNow() { - return false; - } - - // ============================================================ - // Break Behavior Options - // ============================================================ - @ConfigSection( - name = "Break Behavior", - description = "Configure what happens during breaks", - position = 1 - ) - String breakBehaviorOptions = "breakBehaviorOptions"; - - @ConfigItem( - keyName = "OnlyMicroBreaks", - name = "Micro Breaks Only", - description = "Only use micro breaks if enabled", - position = 0, - section = breakBehaviorOptions - ) - default boolean onlyMicroBreaks() { - return false; - } - - @ConfigItem( - keyName = "Logout", - name = "Logout", - description = "Logout when taking a break", - position = 1, - section = breakBehaviorOptions - ) - default boolean logoutAfterBreak() { - return true; - } - - @ConfigItem( - keyName = "useRandomWorld", - name = "Use RandomWorld", - description = "Change to a random world once break is finished", - position = 2, - section = breakBehaviorOptions - ) - default boolean useRandomWorld() { - return false; - } - - // ============================================================ - // Play Schedule Configuration Section - // ============================================================ - @ConfigSection( - name = "Play Schedule", - description = "Options related to using a play schedule", - position = 2 - ) - String usePlaySchedule = "usePlaySchedule"; - - @ConfigItem( - keyName = "UsePlaySchedule", - name = "Use Play Schedule", - description = "Enable or disable the use of a play schedule", - position = 0, - section = usePlaySchedule - ) - default boolean usePlaySchedule() { - return false; - } - - @ConfigItem( - keyName = "PlaySchedule", - name = "Play Schedule", - description = "Select the play schedule", - position = 1, - section = usePlaySchedule - ) - default PlaySchedule playSchedule() { - return PlaySchedule.MEDIUM_DAY; - } - - // ============================================================ - // Overlay Settings - // ============================================================ - @ConfigItem( - keyName = "hideOverlay", - name = "Hide Overlay", - description = "Select this if you want to hide overlay", - position = 0 - ) - default boolean isHideOverlay() { - return false; - } -} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/breakhandler/BreakHandlerOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/breakhandler/BreakHandlerOverlay.java deleted file mode 100644 index 2624284f6b7..00000000000 --- a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/breakhandler/BreakHandlerOverlay.java +++ /dev/null @@ -1,86 +0,0 @@ -package net.runelite.client.plugins.microbot.breakhandler; - -import net.runelite.client.plugins.microbot.pluginscheduler.util.SchedulerPluginUtil; -import net.runelite.client.plugins.microbot.util.antiban.Rs2AntibanSettings; -import net.runelite.client.ui.overlay.OverlayPanel; -import net.runelite.client.ui.overlay.OverlayPosition; -import net.runelite.client.ui.overlay.components.LineComponent; -import net.runelite.client.ui.overlay.components.TitleComponent; - -import javax.inject.Inject; -import java.awt.*; -import java.time.Duration; - -public class BreakHandlerOverlay extends OverlayPanel { - private final BreakHandlerConfig config; - - @Inject - BreakHandlerOverlay(BreakHandlerPlugin plugin, BreakHandlerConfig config) - { - super(plugin); - this.config = config; - setPosition(OverlayPosition.TOP_LEFT); - setNaughty(); - } - @Override - public Dimension render(Graphics2D graphics) { - try { - panelComponent.setPreferredSize(new Dimension(200, 300)); - panelComponent.getChildren().add(TitleComponent.builder() - .text("BreakHandler V" + BreakHandlerScript.version) - .color(Color.GREEN) - .build()); - - panelComponent.getChildren().add(LineComponent.builder().build()); - - panelComponent.getChildren().add(LineComponent.builder() - .left("Total breaks: " + BreakHandlerScript.totalBreaks) - .build()); - - // Display lock state information - if (BreakHandlerScript.isLockState()) { - panelComponent.getChildren().add(LineComponent.builder() - .left("Status: LOCKED") - .right("Breaks Prevented") - .leftColor(Color.RED) - .rightColor(Color.RED) - .build()); - - // Show specific lock reason if it's manual lock vs plugin lock - if (BreakHandlerScript.lockState.get() && !SchedulerPluginUtil.hasLockedSchedulablePlugins()) { - panelComponent.getChildren().add(LineComponent.builder() - .left("Reason: Manual Lock") - .leftColor(Color.ORANGE) - .build()); - } else { - panelComponent.getChildren().add(LineComponent.builder() - .left("Reason: Plugin Lock Condition Active") - .leftColor(Color.ORANGE) - .build()); - } - } else { - panelComponent.getChildren().add(LineComponent.builder() - .left("Status: UNLOCKED") - .right("Breaks Allowed") - .leftColor(Color.GREEN) - .rightColor(Color.GREEN) - .build()); - } - - if (BreakHandlerScript.breakIn > 0) { - panelComponent.getChildren().add(LineComponent.builder() - .left((Rs2AntibanSettings.takeMicroBreaks && config.onlyMicroBreaks()) ? "Only Micro Breaks" : BreakHandlerScript.formatDuration(Duration.ofSeconds(BreakHandlerScript.breakIn), "Break in:")) - .build()); - } - if (BreakHandlerScript.breakDuration > 0) { - panelComponent.getChildren().add(LineComponent.builder() - .left(BreakHandlerScript.formatDuration(Duration.ofSeconds(BreakHandlerScript.breakDuration), "Break duration:")) - .build()); - } - - } catch(Exception ex) { - System.out.println(ex.getMessage()); - } - return super.render(graphics); - } -} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/breakhandler/BreakHandlerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/breakhandler/BreakHandlerPlugin.java deleted file mode 100644 index 137b6c5d55a..00000000000 --- a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/breakhandler/BreakHandlerPlugin.java +++ /dev/null @@ -1,110 +0,0 @@ -package net.runelite.client.plugins.microbot.breakhandler; - -import com.google.inject.Provides; -import lombok.extern.slf4j.Slf4j; -import net.runelite.client.config.ConfigManager; -import net.runelite.client.eventbus.Subscribe; -import net.runelite.client.events.ConfigChanged; -import net.runelite.client.plugins.Plugin; -import net.runelite.client.plugins.PluginDescriptor; -import net.runelite.client.plugins.microbot.Microbot; -import net.runelite.client.plugins.microbot.util.events.PluginPauseEvent; -import net.runelite.client.ui.overlay.OverlayManager; - -import javax.inject.Inject; -import java.awt.*; - -@PluginDescriptor( - name = PluginDescriptor.Default + "BreakHandler", - description = "Microbot breakhandler", - tags = {"break", "microbot", "breakhandler"}, - enabledByDefault = false -) -@Slf4j -public class BreakHandlerPlugin extends Plugin { - @Inject - BreakHandlerScript breakHandlerScript; - @Inject - private BreakHandlerConfig config; - @Inject - private OverlayManager overlayManager; - @Inject - private BreakHandlerOverlay breakHandlerOverlay; - - @Provides - BreakHandlerConfig provideConfig(ConfigManager configManager) { - return configManager.getConfig(BreakHandlerConfig.class); - } - - private boolean hideOverlay; - - @Override - protected void startUp() throws AWTException { - if (overlayManager != null) { - overlayManager.add(breakHandlerOverlay); - } - hideOverlay = config.isHideOverlay(); - toggleOverlay(hideOverlay); - breakHandlerScript.run(config); - } - - private void toggleOverlay(boolean hideOverlay) { - if (overlayManager != null) { - boolean hasOverlay = overlayManager.anyMatch(ov -> ov.getName().equalsIgnoreCase(BreakHandlerOverlay.class.getSimpleName())); - - if (hideOverlay) { - if(!hasOverlay) return; - - overlayManager.remove(breakHandlerOverlay); - } else { - if (hasOverlay) return; - - overlayManager.add(breakHandlerOverlay); - } - } - } - - protected void shutDown() { - log.info("\nshutdown: "+ - "\nbreakDuration: " + BreakHandlerScript.breakDuration + - "\nbreakIn: " + BreakHandlerScript.breakIn + - "\nisLockState: " + BreakHandlerScript.isLockState() + - "\npauseAllScripts: " + Microbot.pauseAllScripts.get() + - "\nPluginPauseEvent.isPaused: " + PluginPauseEvent.isPaused()); - breakHandlerScript.shutdown(); - log.info("\nshutdown: "+ - "\nbreakDuration: " + BreakHandlerScript.breakDuration + - "\nbreakIn: " + BreakHandlerScript.breakIn + - "\nisLockState: " + BreakHandlerScript.isLockState() + - "\npauseAllScripts: " + Microbot.pauseAllScripts.get() + - "\nPluginPauseEvent.isPaused: " + PluginPauseEvent.isPaused()); - overlayManager.remove(breakHandlerOverlay); - - - } - - // on settings change - @Subscribe - public void onConfigChanged(final ConfigChanged event) { - if (event.getGroup().equals(BreakHandlerConfig.configGroup)) { - if (event.getKey().equals("UsePlaySchedule")) { - breakHandlerScript.reset(); - } - - if (event.getKey().equals("breakNow")) { - boolean breakNowValue = config.breakNow(); - log.debug("Break Now toggled: {}", breakNowValue); - } - - if (event.getKey().equals("breakEndNow")) { - boolean breakEndNowValue = config.breakEndNow(); - log.debug("Break End Now toggled: {}", breakEndNowValue); - } - - if (event.getKey().equals(BreakHandlerConfig.hideOverlay)) { - hideOverlay = config.isHideOverlay(); - toggleOverlay(hideOverlay); - } - } - } -} \ No newline at end of file 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 deleted file mode 100644 index 90df4aa59cd..00000000000 --- a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/breakhandler/BreakHandlerScript.java +++ /dev/null @@ -1,428 +0,0 @@ -package net.runelite.client.plugins.microbot.breakhandler; -import lombok.extern.slf4j.Slf4j; -import net.runelite.client.plugins.microbot.Microbot; -import net.runelite.client.plugins.microbot.Script; -import net.runelite.client.plugins.microbot.pluginscheduler.util.SchedulerPluginUtil; -import net.runelite.client.plugins.microbot.util.antiban.Rs2AntibanSettings; -import net.runelite.client.plugins.microbot.util.events.PluginPauseEvent; -import net.runelite.client.plugins.microbot.util.math.Rs2Random; -import net.runelite.client.plugins.microbot.util.player.Rs2Player; -import net.runelite.client.plugins.microbot.util.security.Login; -import net.runelite.client.ui.ClientUI; -import java.time.Duration; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicBoolean; -/** - * BreakHandlerScript manages automated break scheduling and execution for botting activities. - * This script handles timing between breaks, break duration management, play schedule enforcement, - * and integration with micro-break systems and plugin lock conditions. - * - * The script operates on a scheduled executor that runs every second to: - * - Monitor break timers and trigger breaks when appropriate - * - Handle user-initiated break toggles - * - Enforce play schedule restrictions - * - Manage break state transitions and cleanup - * - Update UI elements like window titles during breaks - * - * Key Features: - * - Configurable break intervals and durations - * - Play schedule enforcement with automatic logout - * - Integration with micro-break antiban system - * - Lock state management to prevent breaks during critical operations - * - World switching capabilities after breaks - * - Statistics tracking for break frequency - * - * @version 1.0.0 - */ - -@Slf4j -public class BreakHandlerScript extends Script { - public static String version = "1.0.0"; - - // Constants for better maintainability - private static final int SCHEDULER_INTERVAL_MS = 1000; - private static final int MINUTES_TO_SECONDS = 60; - - public static int breakIn = -1; - public static int breakDuration = -1; - public static Duration setBreakDurationTime = Duration.ZERO; - public static int totalBreaks = 0; - - - public static AtomicBoolean lockState = new AtomicBoolean(false); - public static void setLockState(boolean state) { - boolean currentState = BreakHandlerScript.lockState.get(); - if (currentState != state) { - log.info("\n\t-Setting lock state to: " + state + "\n\t-previous state: " + currentState); - BreakHandlerScript.lockState.set(state); - } - } - private String title = ""; - private BreakHandlerConfig config; - - public static boolean isBreakActive() { - return breakDuration >= 0 ; - } - public static boolean isMicroBreakActive() { - return Rs2AntibanSettings.takeMicroBreaks && Rs2AntibanSettings.microBreakActive; - } - - public static String formatDuration(Duration duration, String header) { - return String.format(header + " %s", formatDuration(duration)); - } - - /** - * Formats a duration into HH:MM:SS format - * @param duration the duration to format - * @return formatted time string - */ - public static String formatDuration(Duration duration) { - if (duration == null || duration.isNegative() || duration.isZero()) { - return "00:00:00"; - } - long hours = duration.toHours(); - long minutes = duration.toMinutes() % 60; - long seconds = duration.getSeconds() % 60; - return String.format("%02d:%02d:%02d", hours, minutes, seconds); - } - - public boolean run(BreakHandlerConfig config) { - this.config = config; - Microbot.enableAutoRunOn = false; - title = ClientUI.getFrame().getTitle(); - initializeNextBreakTimer(); - mainScheduledFuture = scheduledExecutorService.scheduleWithFixedDelay(() -> { - try { - processBreakHandlerLogic(); - } catch (Exception ex) { - Microbot.log("BreakHandler error: " + ex.getMessage()); - } - }, 0, SCHEDULER_INTERVAL_MS, TimeUnit.MILLISECONDS); - - return true; - } - - /** - * Main break handler logic - processes all break-related operations - */ - private void processBreakHandlerLogic() { - // Handle immediate user requests first - if (handleConfigToggles()) { - return; - } - - // Handle play schedule logic - if (handlePlaySchedule()) { - return; - } - - // Update timers and UI - updateBreakTimers(); - updateWindowTitle(); - - // Handle break state transitions - if (shouldEndBreak()) { - log.debug(" Break ended naturally - " + - "\nshouldStartBreak: " + shouldStartBreak() + - "\nshouldEndBreak: " + shouldEndBreak() + - "\nbreakDuration: " + breakDuration + - "\nbreakIn: " + breakIn + - "\nisLockState: " + isLockState() + - "\npauseAllScripts: " + Microbot.pauseAllScripts.get() + - "\nPluginPauseEvent.isPaused: " + PluginPauseEvent.isPaused()); - stopBreak(); - return; - } - - if (shouldStartBreak()) { - log.debug(" Break start naturally - " + - "\nshouldStartBreak: " + shouldStartBreak() + - "\nshouldEndBreak: " + shouldEndBreak() + - "\nbreakDuration: " + breakDuration + - "\nbreakIn: " + breakIn + - "\nisLockState: " + isLockState() + - "\npauseAllScripts: " + Microbot.pauseAllScripts.get() + - "\nPluginPauseEvent.isPaused: " + PluginPauseEvent.isPaused()); - startBreak(); - } - } - - /** - * Handles immediate config toggle requests (breakNow, breakEndNow) - * @return true if a toggle was processed and execution should return - */ - private boolean handleConfigToggles() { - if (config.breakNow() && !Microbot.pauseAllScripts.get() && !isLockState() && !PluginPauseEvent.isPaused()) { - Microbot.log("Break start triggered via config toggle"); - startBreak(); - return true; - } - - if (config.breakEndNow()) { - Microbot.log("Break ended triggered via config toggle"); - stopBreak(); - return true; - } - - return false; - } - - /** - * Handles play schedule logic for outside schedule hours - * @return true if schedule logic was processed and execution should return - */ - private boolean handlePlaySchedule() { - if (config.playSchedule().isOutsideSchedule() && config.usePlaySchedule() && !isLockState()) { - Duration untilNextSchedule = config.playSchedule().timeUntilNextSchedule(); - breakIn = -1; - breakDuration = (int) untilNextSchedule.toSeconds(); - setBreakDurationTime = Duration.ofSeconds(breakDuration); - return true; - } - return false; - } - - /** - * Updates break-related timers and duration calculations - */ - private void updateBreakTimers() { - // Count down to next break - if (breakIn >= 0 && breakDuration <= 0) { - if (!(Rs2AntibanSettings.takeMicroBreaks && config.onlyMicroBreaks())) { - if(Microbot.isLoggedIn()) { - breakIn--; - } - } - } - - // Count down active break - if (breakDuration >= 0) { - breakDuration--; - } - } - - /** - * Updates window title based on current break state - */ - private void updateWindowTitle() { - if (breakDuration > 0) { - String formattedTime = formatDuration(Duration.ofSeconds(breakDuration)); - - if (Rs2AntibanSettings.takeMicroBreaks && Rs2AntibanSettings.microBreakActive) { - ClientUI.getFrame().setTitle("Micro break duration: " + formattedTime); - } else if (config.playSchedule().isOutsideSchedule() && config.usePlaySchedule()) { - ClientUI.getFrame().setTitle("Next schedule in: " + formattedTime); - } else { - ClientUI.getFrame().setTitle("Break duration: " + formattedTime); - } - } - } - - /** - * Determines if a break should naturally end - */ - private boolean shouldEndBreak() { - return ((breakDuration <= 0 && Microbot.pauseAllScripts.get() && PluginPauseEvent.isPaused()) ); - //!(Rs2AntibanSettings.universalAntiban && Rs2AntibanSettings.actionCooldownActive); - } - - /** - * Determines if a break should start - */ - private boolean shouldStartBreak() { - boolean normalBreakTime = breakIn <= 0 && !Microbot.pauseAllScripts.get() && !isLockState() && !PluginPauseEvent.isPaused(); - boolean microBreakTime = Rs2AntibanSettings.microBreakActive && !Microbot.pauseAllScripts.get() && !isLockState(); - - return normalBreakTime || microBreakTime; - } - - /** - * Initializes the timer for the next break - */ - private void initializeNextBreakTimer() { - breakIn = Rs2Random.between( - config.timeUntilBreakStart() * MINUTES_TO_SECONDS, - config.timeUntilBreakEnd() * MINUTES_TO_SECONDS - ); - resetConfigToggles(); - } - - /** - * Starts a break with appropriate duration and logout handling - */ - private void startBreak() { - Microbot.log("Starting break - breakNow: " + config.breakNow() + - ", microBreak: " + Rs2AntibanSettings.microBreakActive+", playSchedule: " + config.usePlaySchedule() ); - - // Pause all scripts - Microbot.pauseAllScripts.compareAndSet(false, true); - PluginPauseEvent.setPaused(true); - // Handle micro break case - if (Rs2AntibanSettings.microBreakActive) { - return; - } - - // Handle play schedule logout - if (isOutsidePlaySchedule()) { - Rs2Player.logout(); - return; - } - - // Set break duration and handle logout - setBreakDuration(); - if (config.logoutAfterBreak()) { - Rs2Player.logout(); - } - } - - /** - * Stops the current break and resumes normal operation - */ - private void stopBreak() { - - Microbot.log("Stopping break - duration: " + breakDuration + - ", microBreak: " + Rs2AntibanSettings.microBreakActive); - - // Resume scripts and reset state - resumeFromBreak(); - - // Handle world switching - handleWorldSwitching(); - - // Update statistics and UI - updateBreakStatistics(); - resetWindowTitle(); - - // Clean up break state - cleanupBreakState(); - - // Reset config toggles - resetConfigToggles(); - } - - /** - * Checks if currently outside play schedule hours - */ - private boolean isOutsidePlaySchedule() { - return config.playSchedule().isOutsideSchedule() && config.usePlaySchedule(); - } - - /** - * Sets the break duration based on configuration - */ - private void setBreakDuration() { - breakDuration = Rs2Random.between( - config.breakDurationStart() * MINUTES_TO_SECONDS, - config.breakDurationEnd() * MINUTES_TO_SECONDS - ); - setBreakDurationTime = Duration.ofSeconds(breakDuration); - } - - /** - * Resumes scripts and resets break timing - */ - private void resumeFromBreak() { - Microbot.pauseAllScripts.compareAndSet(true, false); - PluginPauseEvent.setPaused(false); - breakDuration = -1; - setBreakDurationTime = Duration.ZERO; - if (breakIn <= 0) { - initializeNextBreakTimer(); - } - log.info("\n\tResuming scripts after break. \n\t\tcurrent duration: " + breakDuration+ "\n\t\tnext break in: " + breakIn); - } - - /** - * Handles world switching based on configuration - */ - private void handleWorldSwitching() { - if(!Microbot.isLoggedIn()){ - if (config.useRandomWorld()) { - new Login(Login.getRandomWorld(Login.activeProfile.isMember())); - } else { - new Login(); - } - } - } - - /** - * Updates break statistics - */ - private void updateBreakStatistics() { - totalBreaks++; - } - - /** - * Resets window title to original - */ - private void resetWindowTitle() { - ClientUI.getFrame().setTitle(title); - } - - /** - * Cleans up break-related state variables - */ - private void cleanupBreakState() { - if (Rs2AntibanSettings.takeMicroBreaks) { - Rs2AntibanSettings.microBreakActive = false; - } - } - - /** - * Resets config toggles to false after processing - */ - private void resetConfigToggles() { - if (config.breakNow()) { - Microbot.getConfigManager().setConfiguration( - BreakHandlerConfig.configGroup, "breakNow", false - ); - } - if (config.breakEndNow()) { - Microbot.getConfigManager().setConfiguration( - BreakHandlerConfig.configGroup, "breakEndNow", false - ); - } - } - - @Override - public void shutdown() { - resetBreakState(); - super.shutdown(); - } - - /** - * Resets the break handler state - */ - public void reset() { - resetBreakState(); - } - - /** - * Centralized method to reset all break-related state - */ - private void resetBreakState() { - if(isBreakActive()){ - PluginPauseEvent.setPaused(false); - Microbot.pauseAllScripts.compareAndSet(true, false); - } - BreakHandlerScript.breakIn = -1; - BreakHandlerScript.breakDuration = -1; - BreakHandlerScript.setBreakDurationTime = Duration.ZERO; - BreakHandlerScript.totalBreaks = 0; - BreakHandlerScript.lockState.set(false); - - resetWindowTitle(); - } - - /** - * Checks if the break handler is currently in a locked state. - * This includes both the manual lock state and any locked conditions from schedulable plugins. - * - * @return true if locked, false otherwise - */ - public static boolean isLockState() { - boolean hasLockedSchedulablePlugins = SchedulerPluginUtil.hasLockedSchedulablePlugins(); - return lockState.get(); - } - -}