diff --git a/src/main/java/net/runelite/client/RuneLite.java b/src/main/java/net/runelite/client/RuneLite.java index 3bad251fb3..2db7dd9e47 100644 --- a/src/main/java/net/runelite/client/RuneLite.java +++ b/src/main/java/net/runelite/client/RuneLite.java @@ -4,7 +4,9 @@ import java.io.File; import joptsimple.OptionParser; import joptsimple.OptionSet; import net.runelite.api.Client; +import net.runelite.client.plugins.PluginManager; import net.runelite.client.ui.ClientUI; +import net.runelite.client.ui.OverlayRenderer; public class RuneLite @@ -13,8 +15,12 @@ public class RuneLite public static final File REPO_DIR = new File(RUNELITE_DIR, "repository"); public static OptionSet options; - private ClientUI gui; private static Client client; + private static RuneLite runelite; + + private ClientUI gui; + private PluginManager pluginManager; + private OverlayRenderer renderer; public static void main(String[] args) throws Exception { @@ -22,13 +28,19 @@ public class RuneLite parser.accepts("developer-mode"); options = parser.parse(args); - new RuneLite().start(); + runelite = new RuneLite(); + runelite.start(); } public void start() throws Exception { gui = new ClientUI(); gui.setVisible(true); + + pluginManager = new PluginManager(); + pluginManager.loadAll(); + + renderer = new OverlayRenderer(); } public static Client getClient() @@ -40,4 +52,19 @@ public class RuneLite { RuneLite.client = client; } + + public static RuneLite getRunelite() + { + return runelite; + } + + public PluginManager getPluginManager() + { + return pluginManager; + } + + public OverlayRenderer getRenderer() + { + return renderer; + } } diff --git a/src/main/java/net/runelite/client/plugins/Plugin.java b/src/main/java/net/runelite/client/plugins/Plugin.java index e4a6ba01dd..3903781bff 100644 --- a/src/main/java/net/runelite/client/plugins/Plugin.java +++ b/src/main/java/net/runelite/client/plugins/Plugin.java @@ -1,6 +1,8 @@ package net.runelite.client.plugins; -public class Plugin -{ +import net.runelite.client.ui.Overlay; +public abstract class Plugin +{ + public abstract Overlay drawOverlay(); } diff --git a/src/main/java/net/runelite/client/plugins/PluginManager.java b/src/main/java/net/runelite/client/plugins/PluginManager.java index 37a51dddba..60b0561ae5 100644 --- a/src/main/java/net/runelite/client/plugins/PluginManager.java +++ b/src/main/java/net/runelite/client/plugins/PluginManager.java @@ -1,6 +1,21 @@ package net.runelite.client.plugins; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import net.runelite.client.plugins.opponentinfo.OpponentInfo; + public class PluginManager { + private final List plugins = new ArrayList<>(); + public void loadAll() + { + plugins.add(new OpponentInfo()); + } + + public Collection getPlugins() + { + return plugins; + } } diff --git a/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfo.java b/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfo.java index 424117c69b..40ec49bdaf 100644 --- a/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfo.java +++ b/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfo.java @@ -1,6 +1,7 @@ package net.runelite.client.plugins.opponentinfo; import java.awt.Color; +import java.awt.Dimension; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.image.BufferedImage; @@ -9,6 +10,9 @@ import net.runelite.api.Client; import net.runelite.api.Player; import net.runelite.client.RuneLite; import net.runelite.client.plugins.Plugin; +import net.runelite.client.ui.Overlay; +import net.runelite.client.ui.OverlayPosition; +import net.runelite.client.ui.OverlayPriority; public class OpponentInfo extends Plugin { @@ -26,6 +30,7 @@ public class OpponentInfo extends Plugin private static final Color HP_RED = new Color(102, 15, 16, 230); private final BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_ARGB); + private final Overlay overlay = new Overlay(image, OverlayPosition.TOP_LEFT, OverlayPriority.HIGH); private Actor getOpponent() { @@ -38,12 +43,13 @@ public class OpponentInfo extends Plugin return player.getInteracting(); } - public void draw(Graphics graphics) + @Override + public Overlay drawOverlay() { Actor opponent = getOpponent(); if (opponent == null) - return; + return null; int cur = opponent.getHealth(); int max = opponent.getMaxHealth(); @@ -92,6 +98,8 @@ public class OpponentInfo extends Plugin g.dispose(); - graphics.drawImage(image, 10, 25, null); + overlay.setDimension(new Dimension(height, image.getWidth())); + + return overlay; } } diff --git a/src/main/java/net/runelite/client/ui/ClientUI.java b/src/main/java/net/runelite/client/ui/ClientUI.java index d473f50800..ee927145b3 100644 --- a/src/main/java/net/runelite/client/ui/ClientUI.java +++ b/src/main/java/net/runelite/client/ui/ClientUI.java @@ -4,7 +4,6 @@ import java.awt.event.ComponentEvent; import java.awt.event.ComponentListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; -import java.util.logging.Logger; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPopupMenu; @@ -13,9 +12,7 @@ import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; public final class ClientUI extends JFrame implements ComponentListener -{ - private static final Logger log = Logger.getLogger(ClientUI.class.getName()); - +{ private ClientPanel panel; public ClientUI() throws Exception diff --git a/src/main/java/net/runelite/client/ui/Overlay.java b/src/main/java/net/runelite/client/ui/Overlay.java new file mode 100644 index 0000000000..1763923856 --- /dev/null +++ b/src/main/java/net/runelite/client/ui/Overlay.java @@ -0,0 +1,59 @@ +package net.runelite.client.ui; + +import java.awt.Dimension; +import java.awt.image.BufferedImage; + +public class Overlay +{ + private BufferedImage image; // image to draw + private Dimension dimension; // dimension of visable overlay + private OverlayPosition position; // where to draw it + private OverlayPriority priority; // if multiple overlays exist in the same position, who wins + + public Overlay(BufferedImage image, OverlayPosition position, OverlayPriority priority) + { + this.image = image; + this.position = position; + this.priority = priority; + } + + public BufferedImage getImage() + { + return image; + } + + public void setImage(BufferedImage image) + { + this.image = image; + } + + public Dimension getDimension() + { + return dimension; + } + + public void setDimension(Dimension dimension) + { + this.dimension = dimension; + } + + public OverlayPosition getPosition() + { + return position; + } + + public void setPosition(OverlayPosition position) + { + this.position = position; + } + + public OverlayPriority getPriority() + { + return priority; + } + + public void setPriority(OverlayPriority priority) + { + this.priority = priority; + } +} diff --git a/src/main/java/net/runelite/client/ui/OverlayPosition.java b/src/main/java/net/runelite/client/ui/OverlayPosition.java new file mode 100644 index 0000000000..45bda4106d --- /dev/null +++ b/src/main/java/net/runelite/client/ui/OverlayPosition.java @@ -0,0 +1,6 @@ +package net.runelite.client.ui; + +public enum OverlayPosition +{ + TOP_LEFT; +} diff --git a/src/main/java/net/runelite/client/ui/OverlayPriority.java b/src/main/java/net/runelite/client/ui/OverlayPriority.java new file mode 100644 index 0000000000..f00b3acdf5 --- /dev/null +++ b/src/main/java/net/runelite/client/ui/OverlayPriority.java @@ -0,0 +1,8 @@ +package net.runelite.client.ui; + +public enum OverlayPriority +{ + LOW, + MED, + HIGH; +} diff --git a/src/main/java/net/runelite/client/ui/OverlayRenderer.java b/src/main/java/net/runelite/client/ui/OverlayRenderer.java new file mode 100644 index 0000000000..80253ad0dc --- /dev/null +++ b/src/main/java/net/runelite/client/ui/OverlayRenderer.java @@ -0,0 +1,40 @@ +package net.runelite.client.ui; + +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.image.BufferedImage; +import java.util.ArrayList; +import java.util.List; +import net.runelite.client.RuneLite; +import net.runelite.client.plugins.Plugin; + +public class OverlayRenderer +{ + private static final int TOP_LEFT_BORDER_TOP = 25; + private static final int TOP_LEFT_BORDER_LEFT = 10; + private static final int TOP_LEFT_PADDING = 10; + + public void render(Graphics graphics) + { + List overlays = new ArrayList<>(); + + for (Plugin plugin : RuneLite.getRunelite().getPluginManager().getPlugins()) + { + Overlay overlay = plugin.drawOverlay(); + if (overlay != null) + overlays.add(overlay); + } + + Overlay[] topLeft = overlays.stream().filter(o -> o.getPosition() == OverlayPosition.TOP_LEFT).sorted((o1, o2) -> o1.getPriority().compareTo(o2.getPriority())).toArray(s -> new Overlay[s]); + int y = TOP_LEFT_BORDER_TOP; + + for (Overlay overlay : topLeft) + { + BufferedImage image = overlay.getImage(); + Dimension dimension = overlay.getDimension(); + + graphics.drawImage(image, TOP_LEFT_BORDER_LEFT, y, null); + y += dimension.getHeight() + TOP_LEFT_PADDING; + } + } +} diff --git a/src/main/java/net/runelite/inject/callbacks/RSCanvasCallback.java b/src/main/java/net/runelite/inject/callbacks/RSCanvasCallback.java index 9b6805296e..1690db94a7 100644 --- a/src/main/java/net/runelite/inject/callbacks/RSCanvasCallback.java +++ b/src/main/java/net/runelite/inject/callbacks/RSCanvasCallback.java @@ -3,7 +3,8 @@ 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; +import net.runelite.client.RuneLite; +import net.runelite.client.ui.OverlayRenderer; public class RSCanvasCallback { @@ -14,11 +15,14 @@ public class RSCanvasCallback { 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); + RuneLite runelite = RuneLite.getRunelite(); + if (runelite != null) + { + OverlayRenderer renderer = runelite.getRenderer(); + if (renderer != null) + renderer.render(clientGraphics); + } clientGraphics.dispose();