diff --git a/pom.xml b/pom.xml
index acb72a6390..b7d45b4bd0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,6 +10,10 @@
UTF-8
1.8
1.8
+
+ 1.7.12
+ 1.1.0
+ 3.1.0
@@ -21,13 +25,54 @@
- net.runelite.rs
- api
- 1.0.0-SNAPSHOT
+ org.slf4j
+ slf4j-api
+ ${slf4j.version}
- net.runelite
- launcher
+ org.slf4j
+ slf4j-simple
+ ${slf4j.version}
+
+
+ org.eclipse.aether
+ aether-api
+ ${aether.version}
+
+
+ org.eclipse.aether
+ aether-impl
+ ${aether.version}
+
+
+ org.eclipse.aether
+ aether-connector-basic
+ ${aether.version}
+
+
+ org.eclipse.aether
+ aether-transport-http
+ ${aether.version}
+
+
+ org.apache.maven
+ maven-aether-provider
+ ${maven.version}
+
+
+ com.google.code.gson
+ gson
+ 2.4
+
+
+ net.sf.jopt-simple
+ jopt-simple
+ 5.0.1
+
+
+
+ net.runelite.rs
+ api
1.0.0-SNAPSHOT
diff --git a/src/main/java/net/runelite/client/ArtifactResolver.java b/src/main/java/net/runelite/client/ArtifactResolver.java
new file mode 100644
index 0000000000..1a9ce66e81
--- /dev/null
+++ b/src/main/java/net/runelite/client/ArtifactResolver.java
@@ -0,0 +1,118 @@
+package net.runelite.client;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.maven.repository.internal.MavenRepositorySystemUtils;
+import org.eclipse.aether.DefaultRepositorySystemSession;
+import org.eclipse.aether.RepositorySystem;
+import org.eclipse.aether.RepositorySystemSession;
+import org.eclipse.aether.artifact.Artifact;
+import org.eclipse.aether.collection.CollectRequest;
+import org.eclipse.aether.connector.basic.BasicRepositoryConnectorFactory;
+import org.eclipse.aether.graph.Dependency;
+import org.eclipse.aether.graph.DependencyFilter;
+import org.eclipse.aether.impl.DefaultServiceLocator;
+import org.eclipse.aether.repository.LocalRepository;
+import org.eclipse.aether.repository.RemoteRepository;
+import org.eclipse.aether.repository.RepositoryPolicy;
+import org.eclipse.aether.resolution.ArtifactResult;
+import org.eclipse.aether.resolution.DependencyRequest;
+import org.eclipse.aether.resolution.DependencyResolutionException;
+import org.eclipse.aether.spi.connector.RepositoryConnectorFactory;
+import org.eclipse.aether.spi.connector.transport.TransporterFactory;
+import org.eclipse.aether.transport.http.HttpTransporterFactory;
+import org.eclipse.aether.util.artifact.JavaScopes;
+import org.eclipse.aether.util.filter.DependencyFilterUtils;
+
+public class ArtifactResolver
+{
+ private final File repositoryCache;
+ private final List repositories = new ArrayList<>();
+
+ public ArtifactResolver(File repositoryCache)
+ {
+ this.repositoryCache = repositoryCache;
+ }
+
+ public List resolveArtifacts(Artifact artifact) throws DependencyResolutionException
+ {
+ RepositorySystem system = newRepositorySystem();
+
+ RepositorySystemSession session = newRepositorySystemSession(system);
+
+ DependencyFilter classpathFlter = DependencyFilterUtils.classpathFilter(JavaScopes.COMPILE);
+
+ CollectRequest collectRequest = new CollectRequest();
+ collectRequest.setRoot(new Dependency(artifact, JavaScopes.COMPILE));
+ collectRequest.setRepositories(repositories);
+
+ DependencyRequest dependencyRequest = new DependencyRequest(collectRequest, classpathFlter);
+
+ List results = system.resolveDependencies(session, dependencyRequest).getArtifactResults();
+ validate(results);
+ return results;
+ }
+
+ public DefaultRepositorySystemSession newRepositorySystemSession(RepositorySystem system)
+ {
+ DefaultRepositorySystemSession session = MavenRepositorySystemUtils.newSession();
+
+ LocalRepository localRepo = new LocalRepository(repositoryCache.getAbsolutePath());
+ session.setLocalRepositoryManager(system.newLocalRepositoryManager(session, localRepo));
+ session.setUpdatePolicy(RepositoryPolicy.UPDATE_POLICY_ALWAYS); // this causes a refetch of maven-metadata.xml, but not any binaries
+
+ //session.setTransferListener(new ConsoleTransferListener());
+ //session.setRepositoryListener(new ConsoleRepositoryListener());
+
+ return session;
+ }
+
+ public RepositorySystem newRepositorySystem()
+ {
+ DefaultServiceLocator locator = MavenRepositorySystemUtils.newServiceLocator();
+ locator.addService(RepositoryConnectorFactory.class, BasicRepositoryConnectorFactory.class);
+ locator.addService(TransporterFactory.class, HttpTransporterFactory.class);
+
+ locator.setErrorHandler(new DefaultServiceLocator.ErrorHandler()
+ {
+ @Override
+ public void serviceCreationFailed(Class> type, Class> impl, Throwable exception)
+ {
+ exception.printStackTrace();
+ }
+ });
+
+ return locator.getService(RepositorySystem.class);
+ }
+
+ public void addRepositories()
+ {
+ repositories.add(this.newCentralRepository());
+ repositories.add(this.newRuneliteRepository());
+ }
+
+ private RemoteRepository newCentralRepository()
+ {
+ return new RemoteRepository.Builder("central", "default", "http://central.maven.org/maven2/").build();
+ }
+
+ public RemoteRepository newRuneliteRepository()
+ {
+ return new RemoteRepository.Builder("runelite", "default", "http://repo.runelite.net/").build();
+ }
+
+ private void validate(List artifacts)
+ {
+ for (ArtifactResult ar : artifacts)
+ {
+ Artifact a = ar.getArtifact();
+
+ if (!a.getGroupId().startsWith("net.runelite"))
+ continue;
+
+ if (!ar.getRepository().equals(newRuneliteRepository()))
+ throw new RuntimeException();
+ }
+ }
+}
diff --git a/src/main/java/net/runelite/client/ClientLoader.java b/src/main/java/net/runelite/client/ClientLoader.java
index a1dca57556..cbe03338fa 100644
--- a/src/main/java/net/runelite/client/ClientLoader.java
+++ b/src/main/java/net/runelite/client/ClientLoader.java
@@ -11,8 +11,6 @@ import java.net.URL;
import java.net.URLClassLoader;
import java.net.URLConnection;
import java.util.List;
-import net.runelite.launcher.ArtifactResolver;
-import net.runelite.launcher.Launcher;
import org.eclipse.aether.artifact.Artifact;
import org.eclipse.aether.artifact.DefaultArtifact;
import org.eclipse.aether.resolution.ArtifactResult;
@@ -28,7 +26,10 @@ public class ClientLoader
config.fetch();
- ArtifactResolver resolver = new ArtifactResolver(Launcher.REPO_DIR);
+ // the only thing resolved here is the injected client, which has no dependencies, so no need to switch developer mode
+ ArtifactResolver resolver = new ArtifactResolver(RuneLite.REPO_DIR);
+ resolver.addRepositories();
+
List results = resolver.resolveArtifacts(getClientArtifact());
File client = results.get(0).getArtifact().getFile();
diff --git a/src/main/java/net/runelite/client/RuneLite.java b/src/main/java/net/runelite/client/RuneLite.java
index ec16437acb..3bad251fb3 100644
--- a/src/main/java/net/runelite/client/RuneLite.java
+++ b/src/main/java/net/runelite/client/RuneLite.java
@@ -1,14 +1,27 @@
package net.runelite.client;
+import java.io.File;
+import joptsimple.OptionParser;
+import joptsimple.OptionSet;
+import net.runelite.api.Client;
import net.runelite.client.ui.ClientUI;
public class RuneLite
{
+ public static final File RUNELITE_DIR = new File(System.getProperty("user.home"), ".runelite");
+ public static final File REPO_DIR = new File(RUNELITE_DIR, "repository");
+
+ public static OptionSet options;
private ClientUI gui;
+ private static Client client;
public static void main(String[] args) throws Exception
{
+ OptionParser parser = new OptionParser();
+ parser.accepts("developer-mode");
+ options = parser.parse(args);
+
new RuneLite().start();
}
@@ -17,4 +30,14 @@ public class RuneLite
gui = new ClientUI();
gui.setVisible(true);
}
+
+ public static Client getClient()
+ {
+ return client;
+ }
+
+ public static void setClient(Client client)
+ {
+ RuneLite.client = client;
+ }
}
diff --git a/src/main/java/net/runelite/client/plugins/Plugin.java b/src/main/java/net/runelite/client/plugins/Plugin.java
new file mode 100644
index 0000000000..e4a6ba01dd
--- /dev/null
+++ b/src/main/java/net/runelite/client/plugins/Plugin.java
@@ -0,0 +1,6 @@
+package net.runelite.client.plugins;
+
+public class Plugin
+{
+
+}
diff --git a/src/main/java/net/runelite/client/plugins/PluginManager.java b/src/main/java/net/runelite/client/plugins/PluginManager.java
new file mode 100644
index 0000000000..37a51dddba
--- /dev/null
+++ b/src/main/java/net/runelite/client/plugins/PluginManager.java
@@ -0,0 +1,6 @@
+package net.runelite.client.plugins;
+
+public class PluginManager
+{
+
+}
diff --git a/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfo.java b/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfo.java
new file mode 100644
index 0000000000..818eee112d
--- /dev/null
+++ b/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfo.java
@@ -0,0 +1,32 @@
+package net.runelite.client.plugins.opponentinfo;
+
+import java.awt.Graphics;
+import net.runelite.api.Actor;
+import net.runelite.api.Client;
+import net.runelite.api.Player;
+import net.runelite.client.RuneLite;
+import net.runelite.client.plugins.Plugin;
+
+public class OpponentInfo extends Plugin
+{
+ private Actor getOpponent()
+ {
+ Client client = RuneLite.getClient();
+
+ Player player = client.getLocalPlayer();
+ if (player == null)
+ return null;
+
+ return player.getInteracting();
+ }
+
+ public void draw(Graphics graphics)
+ {
+ Actor opponent = getOpponent();
+
+ if (opponent == null)
+ return;
+
+ graphics.drawString(opponent.getName() + " " + opponent.getHealth() + "/" + opponent.getMaxHealth(), 42, 42);
+ }
+}
diff --git a/src/main/java/net/runelite/client/ui/ClientPanel.java b/src/main/java/net/runelite/client/ui/ClientPanel.java
index b4f7a429db..5c613aece6 100644
--- a/src/main/java/net/runelite/client/ui/ClientPanel.java
+++ b/src/main/java/net/runelite/client/ui/ClientPanel.java
@@ -6,7 +6,9 @@ import java.awt.Dimension;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import javax.swing.JPanel;
+import net.runelite.api.Client;
import net.runelite.client.ClientLoader;
+import net.runelite.client.RuneLite;
final class ClientPanel extends JPanel implements ComponentListener
{
@@ -29,6 +31,8 @@ final class ClientPanel extends JPanel implements ComponentListener
rs.init();
rs.start();
this.add(rs);
+
+ RuneLite.setClient(new Client((net.runelite.rs.api.Client) rs));
}
@Override
diff --git a/src/main/java/net/runelite/client/ui/ClientUI.java b/src/main/java/net/runelite/client/ui/ClientUI.java
index 174d15bc4b..d473f50800 100644
--- a/src/main/java/net/runelite/client/ui/ClientUI.java
+++ b/src/main/java/net/runelite/client/ui/ClientUI.java
@@ -29,7 +29,8 @@ public final class ClientUI extends JFrame implements ComponentListener
this.addComponentListener(this);
}
- private void init() throws Exception {
+ private void init() throws Exception
+ {
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
addWindowListener(new WindowAdapter()
diff --git a/src/main/java/net/runelite/inject/callbacks/RSCanvasCallback.java b/src/main/java/net/runelite/inject/callbacks/RSCanvasCallback.java
new file mode 100644
index 0000000000..42a9e983d3
--- /dev/null
+++ b/src/main/java/net/runelite/inject/callbacks/RSCanvasCallback.java
@@ -0,0 +1,27 @@
+package net.runelite.inject.callbacks;
+
+import java.awt.Canvas;
+import java.awt.Graphics;
+import java.awt.image.BufferedImage;
+import net.runelite.client.plugins.opponentinfo.OpponentInfo;
+
+public class RSCanvasCallback
+{
+ private final BufferedImage clientBuffer = new BufferedImage(756, 503, BufferedImage.TYPE_INT_RGB);
+ private final BufferedImage gameBuffer = new BufferedImage(756, 503, BufferedImage.TYPE_INT_RGB);
+
+ public Graphics getGraphics(Canvas canvas, Graphics superGraphics)
+ {
+ Graphics clientGraphics = clientBuffer.getGraphics();
+ clientGraphics.drawImage(gameBuffer, 0, 0, null);
+ //clientGraphics.dispose();
+
+ //clientGraphics = clientBuffer.getGraphics();
+ //clientGraphics.drawString("something, something 2", 42, 42);
+ new OpponentInfo().draw(clientGraphics);
+
+ superGraphics.drawImage(clientBuffer, 0, 0, null);
+
+ return gameBuffer.getGraphics();
+ }
+}