From f0aa055ec5dfaf445bf81480fa4ec7831d693c31 Mon Sep 17 00:00:00 2001 From: Adam Date: Sun, 17 Apr 2016 15:14:37 -0400 Subject: [PATCH] Hack in opponent info, seems to work --- pom.xml | 55 +++++++- .../net/runelite/client/ArtifactResolver.java | 118 ++++++++++++++++++ .../net/runelite/client/ClientLoader.java | 7 +- .../java/net/runelite/client/RuneLite.java | 23 ++++ .../net/runelite/client/plugins/Plugin.java | 6 + .../client/plugins/PluginManager.java | 6 + .../plugins/opponentinfo/OpponentInfo.java | 32 +++++ .../net/runelite/client/ui/ClientPanel.java | 4 + .../java/net/runelite/client/ui/ClientUI.java | 3 +- .../inject/callbacks/RSCanvasCallback.java | 27 ++++ 10 files changed, 272 insertions(+), 9 deletions(-) create mode 100644 src/main/java/net/runelite/client/ArtifactResolver.java create mode 100644 src/main/java/net/runelite/client/plugins/Plugin.java create mode 100644 src/main/java/net/runelite/client/plugins/PluginManager.java create mode 100644 src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfo.java create mode 100644 src/main/java/net/runelite/inject/callbacks/RSCanvasCallback.java 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(); + } +}