diff --git a/runelite-client/src/main/java/net/runelite/client/rs/ClientLoader.java b/runelite-client/src/main/java/net/runelite/client/rs/ClientLoader.java index 1dd110dc68..fb04be2ec2 100644 --- a/runelite-client/src/main/java/net/runelite/client/rs/ClientLoader.java +++ b/runelite-client/src/main/java/net/runelite/client/rs/ClientLoader.java @@ -50,6 +50,7 @@ import java.security.cert.CertificateException; import java.security.cert.CertificateFactory; import java.util.Arrays; import java.util.Collection; +import java.util.Map; import java.util.function.Supplier; import java.util.jar.JarEntry; import java.util.jar.JarInputStream; @@ -64,6 +65,7 @@ import static net.runelite.client.rs.ClientUpdateCheckMode.VANILLA; import net.runelite.client.ui.FatalErrorDialog; import net.runelite.client.ui.SplashScreen; import net.runelite.http.api.RuneLiteAPI; +import net.runelite.http.api.worlds.World; import okhttp3.HttpUrl; import okhttp3.Request; import okhttp3.Response; @@ -80,7 +82,7 @@ public class ClientLoader implements Supplier private ClientUpdateCheckMode updateCheckMode; private Object client = null; - private HostSupplier hostSupplier = new HostSupplier(); + private WorldSupplier worldSupplier = new WorldSupplier(); private RSConfig config; public ClientLoader(ClientUpdateCheckMode updateCheckMode) @@ -173,7 +175,7 @@ public class ClientLoader implements Supplier catch (IOException e) { log.info("Failed to get jav_config from host \"{}\" ({})", url.host(), e.getMessage()); - String host = hostSupplier.get(); + String host = worldSupplier.get().getAddress(); url = url.newBuilder().host(host).build(); err = e; } @@ -190,14 +192,19 @@ public class ClientLoader implements Supplier throw new IOException("Invalid or missing jav_config"); } - if (Strings.isNullOrEmpty(backupConfig.getRuneLiteGamepack())) + if (Strings.isNullOrEmpty(backupConfig.getRuneLiteGamepack()) || Strings.isNullOrEmpty(backupConfig.getRuneLiteWorldParam())) { throw new IOException("Backup config does not have RuneLite gamepack url"); } // Randomize the codebase - String codebase = hostSupplier.get(); - backupConfig.setCodebase("http://" + codebase + "/"); + World world = worldSupplier.get(); + backupConfig.setCodebase("http://" + world.getAddress() + "/"); + + // Update the world applet parameter + Map appletProperties = backupConfig.getAppletProperties(); + appletProperties.put(backupConfig.getRuneLiteWorldParam(), Integer.toString(world.getId())); + config = backupConfig; } catch (IOException ex) @@ -347,7 +354,7 @@ public class ClientLoader implements Supplier throw e; } - url = url.newBuilder().host(hostSupplier.get()).build(); + url = url.newBuilder().host(worldSupplier.get().getAddress()).build(); } } } diff --git a/runelite-client/src/main/java/net/runelite/client/rs/RSConfig.java b/runelite-client/src/main/java/net/runelite/client/rs/RSConfig.java index a9841755b9..b1c43b14e9 100644 --- a/runelite-client/src/main/java/net/runelite/client/rs/RSConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/rs/RSConfig.java @@ -59,4 +59,9 @@ class RSConfig { return classLoaderProperties.get("runelite.gamepack"); } + + String getRuneLiteWorldParam() + { + return classLoaderProperties.get("runelite.worldparam"); + } } diff --git a/runelite-client/src/main/java/net/runelite/client/rs/HostSupplier.java b/runelite-client/src/main/java/net/runelite/client/rs/WorldSupplier.java similarity index 79% rename from runelite-client/src/main/java/net/runelite/client/rs/HostSupplier.java rename to runelite-client/src/main/java/net/runelite/client/rs/WorldSupplier.java index d9fb0f8509..6e143b1326 100644 --- a/runelite-client/src/main/java/net/runelite/client/rs/HostSupplier.java +++ b/runelite-client/src/main/java/net/runelite/client/rs/WorldSupplier.java @@ -40,43 +40,47 @@ import net.runelite.http.api.worlds.WorldClient; import net.runelite.http.api.worlds.WorldType; @Slf4j -class HostSupplier implements Supplier +class WorldSupplier implements Supplier { private final Random random = new Random(System.nanoTime()); - private Queue hosts = new ArrayDeque<>(); + private Queue worlds = new ArrayDeque<>(); @Override - public String get() + public World get() { - if (!hosts.isEmpty()) + if (!worlds.isEmpty()) { - return hosts.poll(); + return worlds.poll(); } try { - List newHosts = new WorldClient(RuneLiteAPI.CLIENT) + List newWorlds = new WorldClient(RuneLiteAPI.CLIENT) .lookupWorlds() .getWorlds() .stream() .filter(w -> w.getTypes().isEmpty() || EnumSet.of(WorldType.MEMBERS).equals(w.getTypes())) - .map(World::getAddress) .collect(Collectors.toList()); - Collections.shuffle(newHosts, random); + Collections.shuffle(newWorlds, random); - hosts.addAll(newHosts.subList(0, 16)); + worlds.addAll(newWorlds.subList(0, 16)); } catch (IOException e) { log.warn("Unable to retrieve world list", e); } - while (hosts.size() < 2) + while (worlds.size() < 2) { - hosts.add("oldschool" + (random.nextInt(50) + 1) + ".runescape.COM"); + int id = random.nextInt(50) + 1; + World world = World.builder() + .id(300 + id) // worlds start at 300 + .address("oldschool" + id + ".runescape.COM") + .build(); + worlds.add(world); } - return hosts.poll(); + return worlds.poll(); } }