Merge pull request #2301 from LoudPacks/master
CLI: add argument acceptor to set the world on client startup
This commit is contained in:
@@ -40,6 +40,7 @@ import java.lang.management.RuntimeMXBean;
|
|||||||
import java.net.Authenticator;
|
import java.net.Authenticator;
|
||||||
import java.net.PasswordAuthentication;
|
import java.net.PasswordAuthentication;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
import java.util.Optional;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import javax.inject.Provider;
|
import javax.inject.Provider;
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
@@ -63,6 +64,7 @@ import net.runelite.client.game.ClanManager;
|
|||||||
import net.runelite.client.game.ItemManager;
|
import net.runelite.client.game.ItemManager;
|
||||||
import net.runelite.client.game.LootManager;
|
import net.runelite.client.game.LootManager;
|
||||||
import net.runelite.client.game.PlayerManager;
|
import net.runelite.client.game.PlayerManager;
|
||||||
|
import net.runelite.client.game.WorldService;
|
||||||
import net.runelite.client.game.XpDropManager;
|
import net.runelite.client.game.XpDropManager;
|
||||||
import net.runelite.client.game.chatbox.ChatboxPanelManager;
|
import net.runelite.client.game.chatbox.ChatboxPanelManager;
|
||||||
import net.runelite.client.graphics.ModelOutlineRenderer;
|
import net.runelite.client.graphics.ModelOutlineRenderer;
|
||||||
@@ -81,7 +83,10 @@ import net.runelite.client.ui.overlay.arrow.ArrowWorldOverlay;
|
|||||||
import net.runelite.client.ui.overlay.infobox.InfoBoxOverlay;
|
import net.runelite.client.ui.overlay.infobox.InfoBoxOverlay;
|
||||||
import net.runelite.client.ui.overlay.tooltip.TooltipOverlay;
|
import net.runelite.client.ui.overlay.tooltip.TooltipOverlay;
|
||||||
import net.runelite.client.ui.overlay.worldmap.WorldMapOverlay;
|
import net.runelite.client.ui.overlay.worldmap.WorldMapOverlay;
|
||||||
|
import net.runelite.client.util.WorldUtil;
|
||||||
import net.runelite.client.ws.PartyService;
|
import net.runelite.client.ws.PartyService;
|
||||||
|
import net.runelite.http.api.worlds.World;
|
||||||
|
import net.runelite.http.api.worlds.WorldResult;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
@@ -103,6 +108,8 @@ public class RuneLite
|
|||||||
@Inject
|
@Inject
|
||||||
public DiscordService discordService;
|
public DiscordService discordService;
|
||||||
@Inject
|
@Inject
|
||||||
|
private WorldService worldService;
|
||||||
|
@Inject
|
||||||
private PluginManager pluginManager;
|
private PluginManager pluginManager;
|
||||||
@Inject
|
@Inject
|
||||||
private ConfigManager configManager;
|
private ConfigManager configManager;
|
||||||
@@ -192,7 +199,9 @@ public class RuneLite
|
|||||||
final ArgumentAcceptingOptionSpec<String> proxyInfo = parser
|
final ArgumentAcceptingOptionSpec<String> proxyInfo = parser
|
||||||
.accepts("proxy")
|
.accepts("proxy")
|
||||||
.withRequiredArg().ofType(String.class);
|
.withRequiredArg().ofType(String.class);
|
||||||
|
final ArgumentAcceptingOptionSpec<Integer> worldInfo = parser
|
||||||
|
.accepts("world")
|
||||||
|
.withRequiredArg().ofType(Integer.class);
|
||||||
final ArgumentAcceptingOptionSpec<ClientUpdateCheckMode> updateMode = parser
|
final ArgumentAcceptingOptionSpec<ClientUpdateCheckMode> updateMode = parser
|
||||||
.accepts("rs", "Select client type")
|
.accepts("rs", "Select client type")
|
||||||
.withRequiredArg()
|
.withRequiredArg()
|
||||||
@@ -252,6 +261,12 @@ public class RuneLite
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (options.has("world"))
|
||||||
|
{
|
||||||
|
int world = options.valueOf(worldInfo);
|
||||||
|
System.setProperty("cli.world", String.valueOf(world));
|
||||||
|
}
|
||||||
|
|
||||||
SentryClient client = Sentry.init("https://fa31d674e44247fa93966c69a903770f@sentry.io/1811856");
|
SentryClient client = Sentry.init("https://fa31d674e44247fa93966c69a903770f@sentry.io/1811856");
|
||||||
client.setRelease(RuneLiteProperties.getPlusVersion());
|
client.setRelease(RuneLiteProperties.getPlusVersion());
|
||||||
|
|
||||||
@@ -356,6 +371,10 @@ public class RuneLite
|
|||||||
RuneLiteSplashScreen.stage(.80, "Initialize UI");
|
RuneLiteSplashScreen.stage(.80, "Initialize UI");
|
||||||
clientUI.init(this);
|
clientUI.init(this);
|
||||||
|
|
||||||
|
//Set the world if specified via CLI args - will not work until clientUI.init is called
|
||||||
|
Optional<Integer> worldArg = Optional.ofNullable(System.getProperty("cli.world")).map(Integer::parseInt);
|
||||||
|
worldArg.ifPresent(this::setWorld);
|
||||||
|
|
||||||
// Initialize Discord service
|
// Initialize Discord service
|
||||||
discordService.init();
|
discordService.init();
|
||||||
|
|
||||||
@@ -404,6 +423,44 @@ public class RuneLite
|
|||||||
clientUI.show();
|
clientUI.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void setWorld(int cliWorld)
|
||||||
|
{
|
||||||
|
int correctedWorld = cliWorld < 300 ? cliWorld + 300 : cliWorld;
|
||||||
|
|
||||||
|
if (correctedWorld <= 300 || client.getWorld() == correctedWorld)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final WorldResult worldResult = worldService.getWorlds();
|
||||||
|
|
||||||
|
if (worldResult == null)
|
||||||
|
{
|
||||||
|
log.warn("Failed to lookup worlds.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final World world = worldResult.findWorld(correctedWorld);
|
||||||
|
|
||||||
|
if (world != null)
|
||||||
|
{
|
||||||
|
final net.runelite.api.World rsWorld = client.createWorld();
|
||||||
|
rsWorld.setActivity(world.getActivity());
|
||||||
|
rsWorld.setAddress(world.getAddress());
|
||||||
|
rsWorld.setId(world.getId());
|
||||||
|
rsWorld.setPlayerCount(world.getPlayers());
|
||||||
|
rsWorld.setLocation(world.getLocation());
|
||||||
|
rsWorld.setTypes(WorldUtil.toWorldTypes(world.getTypes()));
|
||||||
|
|
||||||
|
client.changeWorld(rsWorld);
|
||||||
|
log.debug("Applied new world {}", correctedWorld);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
log.warn("World {} not found.", correctedWorld);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void shutdown()
|
public void shutdown()
|
||||||
{
|
{
|
||||||
configManager.sendConfig();
|
configManager.sendConfig();
|
||||||
|
|||||||
@@ -157,6 +157,11 @@ public class DefaultWorldPlugin extends Plugin
|
|||||||
log.debug("Stored old world {}", worldCache);
|
log.debug("Stored old world {}", worldCache);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (System.getProperty("cli.world") != null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
final int newWorld = !config.useLastWorld() ? config.getWorld() : config.lastWorld();
|
final int newWorld = !config.useLastWorld() ? config.getWorld() : config.lastWorld();
|
||||||
changeWorld(newWorld);
|
changeWorld(newWorld);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -59,6 +59,65 @@ public class ClientLoader implements Supplier<Applet>
|
|||||||
this.updateCheckMode = updateCheckMode;
|
this.updateCheckMode = updateCheckMode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static Applet loadRLPlus(final RSConfig config)
|
||||||
|
throws ClassNotFoundException, InstantiationException, IllegalAccessException
|
||||||
|
{
|
||||||
|
RuneLiteSplashScreen.stage(.465, "Starting Open Old School RuneScape");
|
||||||
|
|
||||||
|
ClassLoader rsClassLoader = new ClassLoader(ClientLoader.class.getClassLoader())
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
protected Class<?> findClass(String name) throws ClassNotFoundException
|
||||||
|
{
|
||||||
|
String path = name.replace('.', '/').concat(".class");
|
||||||
|
InputStream inputStream = ClientLoader.class.getResourceAsStream(path);
|
||||||
|
if (inputStream == null)
|
||||||
|
{
|
||||||
|
throw new ClassNotFoundException(name + " " + path);
|
||||||
|
}
|
||||||
|
byte[] data;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
data = ByteStreams.toByteArray(inputStream);
|
||||||
|
}
|
||||||
|
catch (IOException e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
RuneLiteSplashScreen.setError("Failed to load!", "Failed to load class: " + name + " " + path);
|
||||||
|
throw new RuntimeException("Failed to load class: " + name + " " + path);
|
||||||
|
}
|
||||||
|
return defineClass(name, data, 0, data.length);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Class<?> clientClass = rsClassLoader.loadClass("client");
|
||||||
|
return loadFromClass(config, clientClass);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Applet loadVanilla(final RSConfig config)
|
||||||
|
throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException
|
||||||
|
{
|
||||||
|
RuneLiteSplashScreen.stage(.465, "Starting Vanilla Old School RuneScape");
|
||||||
|
|
||||||
|
final String codebase = config.getCodeBase();
|
||||||
|
final String initialJar = config.getInitialJar();
|
||||||
|
final String initialClass = config.getInitialClass();
|
||||||
|
final URL url = new URL(codebase + initialJar);
|
||||||
|
|
||||||
|
// Must set parent classloader to null, or it will pull from
|
||||||
|
// this class's classloader first
|
||||||
|
final URLClassLoader classloader = new URLClassLoader(new URL[]{url}, null);
|
||||||
|
final Class<?> clientClass = classloader.loadClass(initialClass);
|
||||||
|
return loadFromClass(config, clientClass);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Applet loadFromClass(final RSConfig config, final Class<?> clientClass)
|
||||||
|
throws IllegalAccessException, InstantiationException
|
||||||
|
{
|
||||||
|
final Applet rs = (Applet) clientClass.newInstance();
|
||||||
|
rs.setStub(new RSAppletStub(config));
|
||||||
|
return rs;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public synchronized Applet get()
|
public synchronized Applet get()
|
||||||
{
|
{
|
||||||
@@ -163,63 +222,4 @@ public class ClientLoader implements Supplier<Applet>
|
|||||||
throw err; // use error from Jagex's servers
|
throw err; // use error from Jagex's servers
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
private static Applet loadRLPlus(final RSConfig config)
|
|
||||||
throws ClassNotFoundException, InstantiationException, IllegalAccessException
|
|
||||||
{
|
|
||||||
RuneLiteSplashScreen.stage(.465, "Starting Open Old School RuneScape");
|
|
||||||
|
|
||||||
ClassLoader rsClassLoader = new ClassLoader(ClientLoader.class.getClassLoader())
|
|
||||||
{
|
|
||||||
@Override
|
|
||||||
protected Class<?> findClass(String name) throws ClassNotFoundException
|
|
||||||
{
|
|
||||||
String path = name.replace('.', '/').concat(".class");
|
|
||||||
InputStream inputStream = ClientLoader.class.getResourceAsStream(path);
|
|
||||||
if (inputStream == null)
|
|
||||||
{
|
|
||||||
throw new ClassNotFoundException(name + " " + path);
|
|
||||||
}
|
|
||||||
byte[] data;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
data = ByteStreams.toByteArray(inputStream);
|
|
||||||
}
|
|
||||||
catch (IOException e)
|
|
||||||
{
|
|
||||||
e.printStackTrace();
|
|
||||||
RuneLiteSplashScreen.setError("Failed to load!", "Failed to load class: " + name + " " + path);
|
|
||||||
throw new RuntimeException("Failed to load class: " + name + " " + path);
|
|
||||||
}
|
|
||||||
return defineClass(name, data, 0, data.length);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
Class<?> clientClass = rsClassLoader.loadClass("client");
|
|
||||||
return loadFromClass(config, clientClass);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Applet loadVanilla(final RSConfig config)
|
|
||||||
throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException
|
|
||||||
{
|
|
||||||
RuneLiteSplashScreen.stage(.465, "Starting Vanilla Old School RuneScape");
|
|
||||||
|
|
||||||
final String codebase = config.getCodeBase();
|
|
||||||
final String initialJar = config.getInitialJar();
|
|
||||||
final String initialClass = config.getInitialClass();
|
|
||||||
final URL url = new URL(codebase + initialJar);
|
|
||||||
|
|
||||||
// Must set parent classloader to null, or it will pull from
|
|
||||||
// this class's classloader first
|
|
||||||
final URLClassLoader classloader = new URLClassLoader(new URL[]{url}, null);
|
|
||||||
final Class<?> clientClass = classloader.loadClass(initialClass);
|
|
||||||
return loadFromClass(config, clientClass);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Applet loadFromClass(final RSConfig config, final Class<?> clientClass)
|
|
||||||
throws IllegalAccessException, InstantiationException
|
|
||||||
{
|
|
||||||
final Applet rs = (Applet) clientClass.newInstance();
|
|
||||||
rs.setStub(new RSAppletStub(config));
|
|
||||||
return rs;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -83,4 +83,4 @@ class WorldSupplier implements Supplier<World>
|
|||||||
|
|
||||||
return worlds.poll();
|
return worlds.poll();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user