diff --git a/gradle.properties b/gradle.properties index 6be58bdc42..5555576aea 100644 --- a/gradle.properties +++ b/gradle.properties @@ -31,7 +31,7 @@ project.build.group=net.runelite project.build.version=1.12.10 glslang.path= -microbot.version=2.1.2 +microbot.version=2.1.3 microbot.commit.sha=nogit microbot.repo.url=http://138.201.81.246:8081/repository/microbot-snapshot/ microbot.repo.username= diff --git a/runelite-client/build.gradle.kts b/runelite-client/build.gradle.kts index fff3c9d7b7..6490b3f081 100644 --- a/runelite-client/build.gradle.kts +++ b/runelite-client/build.gradle.kts @@ -50,11 +50,6 @@ plugins { id("net.runelite.runelite-gradle-plugin.index") id("net.runelite.runelite-gradle-plugin.jarsign") - // application // <-- add this -} - -/*application { - mainClass.set("net.runelite.client.RuneLite") } tasks.register("runDebug") { @@ -70,7 +65,7 @@ tasks.register("runDebug") { // JDWP agent for debugger "-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005" ) -}*/ +} lombok.version = libs.versions.lombok.get() diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/breakhandler/breakhandlerv2/BreakHandlerV2Script.java b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/breakhandler/breakhandlerv2/BreakHandlerV2Script.java index 92eae0a281..060ffa3c7b 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/breakhandler/breakhandlerv2/BreakHandlerV2Script.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/breakhandler/breakhandlerv2/BreakHandlerV2Script.java @@ -506,95 +506,143 @@ private void detectUnexpectedLogout() { /** * Select world based on configuration and profile */ - private int selectWorld() { - boolean membersOnly = config.respectMemberStatus() && - activeProfile != null && - activeProfile.isMember(); - - WorldRegion region = config.regionPreference().getWorldRegion(); - - int targetWorld = -1; - - switch (config.worldSelectionMode()) { - case CURRENT_PREFERRED_WORLD: - targetWorld = preBreakWorld != -1 ? preBreakWorld : - Rs2WorldUtil.getRandomAccessibleWorldFromRegion( - region, - config.avoidEmptyWorlds(), - config.avoidOvercrowdedWorlds(), - membersOnly - ); - break; - - case RANDOM_WORLD: - targetWorld = Rs2WorldUtil.getRandomAccessibleWorld( - config.avoidEmptyWorlds(), - config.avoidOvercrowdedWorlds(), - membersOnly - ); - break; - - case REGIONAL_RANDOM: - targetWorld = Rs2WorldUtil.getRandomAccessibleWorldFromRegion( - region, - config.avoidEmptyWorlds(), - config.avoidOvercrowdedWorlds(), - membersOnly - ); - break; - - case BEST_POPULATION: - targetWorld = Rs2WorldUtil.getBestAccessibleWorldForLogin( - false, // by population, not ping - region, - config.avoidEmptyWorlds(), - config.avoidOvercrowdedWorlds(), - membersOnly - ); - break; - - case BEST_PING: - targetWorld = Rs2WorldUtil.getBestAccessibleWorldForLogin( - true, // by ping - region, - config.avoidEmptyWorlds(), - config.avoidOvercrowdedWorlds(), - membersOnly - ); - break; - } - - log.info("[BreakHandlerV2] Selected world: {} (mode: {}, members: {})", - targetWorld, config.worldSelectionMode(), membersOnly); - - return targetWorld; - } - - /** - * Schedule the next break - */ - private void scheduleNextBreak() { - int minMinutes = config.minPlaytime(); - int maxMinutes = config.maxPlaytime(); - - int playtimeMinutes = Rs2Random.between(minMinutes, maxMinutes); - nextBreakTime = Instant.now().plus(playtimeMinutes, ChronoUnit.MINUTES); - - log.info("[BreakHandlerV2] Next break in {} minutes", playtimeMinutes); - } - - /** - * Calculate break duration - */ - private long calculateBreakDuration() { - int minMinutes = config.minBreakDuration(); - int maxMinutes = config.maxBreakDuration(); - - int breakMinutes = Rs2Random.between(minMinutes, maxMinutes); - log.info("[BreakHandlerV2] Break duration: {} minutes", breakMinutes); - - return breakMinutes * 60000L; // Convert to milliseconds - } + private int selectWorld() { + boolean membersOnly = config.respectMemberStatus() && + activeProfile != null && + activeProfile.isMember(); + + WorldRegion region = config.regionPreference().getWorldRegion(); + Integer preferredWorld = resolveProfilePreferredWorld(region); + + int targetWorld = -1; + + switch (config.worldSelectionMode()) { + case CURRENT_PREFERRED_WORLD: + if (preferredWorld != null) { + targetWorld = preferredWorld; + break; + } + + if (preBreakWorld != -1 && Rs2WorldUtil.canAccessWorld(preBreakWorld)) { + targetWorld = preBreakWorld; + break; + } + + targetWorld = Rs2WorldUtil.getRandomAccessibleWorldFromRegion( + region, + config.avoidEmptyWorlds(), + config.avoidOvercrowdedWorlds(), + membersOnly + ); + break; + + case RANDOM_WORLD: + targetWorld = Rs2WorldUtil.getRandomAccessibleWorld( + config.avoidEmptyWorlds(), + config.avoidOvercrowdedWorlds(), + membersOnly + ); + break; + + case REGIONAL_RANDOM: + targetWorld = Rs2WorldUtil.getRandomAccessibleWorldFromRegion( + region, + config.avoidEmptyWorlds(), + config.avoidOvercrowdedWorlds(), + membersOnly + ); + break; + + case BEST_POPULATION: + targetWorld = Rs2WorldUtil.getBestAccessibleWorldForLogin( + false, // by population, not ping + region, + config.avoidEmptyWorlds(), + config.avoidOvercrowdedWorlds(), + membersOnly + ); + break; + + case BEST_PING: + targetWorld = Rs2WorldUtil.getBestAccessibleWorldForLogin( + true, // by ping + region, + config.avoidEmptyWorlds(), + config.avoidOvercrowdedWorlds(), + membersOnly + ); + break; + } + + log.info("[BreakHandlerV2] Selected world: {} (mode: {}, members: {})", + targetWorld, config.worldSelectionMode(), membersOnly); + + return targetWorld; + } + + private Integer resolveProfilePreferredWorld(WorldRegion region) { + if (activeProfile == null || activeProfile.getSelectedWorld() == null) { + return null; + } + + int selectedWorld = activeProfile.getSelectedWorld(); + + // -1 = random members world, -2 = random F2P world + if (selectedWorld == -1) { + if (!config.respectMemberStatus() || activeProfile.isMember()) { + return Rs2WorldUtil.getRandomAccessibleWorldFromRegion( + region, + config.avoidEmptyWorlds(), + config.avoidOvercrowdedWorlds(), + true + ); + } + log.warn("[BreakHandlerV2] Profile requests random members world but account is F2P"); + return null; + } + + if (selectedWorld == -2) { + return Rs2WorldUtil.getRandomAccessibleWorldFromRegion( + region, + config.avoidEmptyWorlds(), + config.avoidOvercrowdedWorlds(), + false + ); + } + + if (!Rs2WorldUtil.canAccessWorld(selectedWorld)) { + log.warn("[BreakHandlerV2] Profile preferred world {} is not accessible, falling back", selectedWorld); + return null; + } + + return selectedWorld; + } + + /** + * Schedule the next break + */ + private void scheduleNextBreak() { + int minMinutes = config.minPlaytime(); + int maxMinutes = config.maxPlaytime(); + + int playtimeMinutes = Rs2Random.between(minMinutes, maxMinutes); + nextBreakTime = Instant.now().plus(playtimeMinutes, ChronoUnit.MINUTES); + + log.info("[BreakHandlerV2] Next break in {} minutes", playtimeMinutes); + } + + /** + * Calculate break duration + */ + private long calculateBreakDuration() { + int minMinutes = config.minBreakDuration(); + int maxMinutes = config.maxBreakDuration(); + + int breakMinutes = Rs2Random.between(minMinutes, maxMinutes); + log.info("[BreakHandlerV2] Break duration: {} minutes", breakMinutes); + + return breakMinutes * 60000L; // Convert to milliseconds + } /** * Transition to a new state