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 818eee112d..424117c69b 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,9 @@ package net.runelite.client.plugins.opponentinfo; +import java.awt.Color; +import java.awt.FontMetrics; import java.awt.Graphics; +import java.awt.image.BufferedImage; import net.runelite.api.Actor; import net.runelite.api.Client; import net.runelite.api.Player; @@ -9,6 +12,21 @@ import net.runelite.client.plugins.Plugin; public class OpponentInfo extends Plugin { + private static final int WIDTH = 140; + private static final int HEIGHT = 75; + + private static final int TOP_BORDER = 2; + private static final int BOTTOM_BORDER = 2; + + private static final int BAR_WIDTH = 124; + private static final int BAR_HEIGHT = 20; + + private static final Color BACKGROUND = new Color(Color.gray.getRed(), Color.gray.getGreen(), Color.gray.getBlue(), 127); + private static final Color HP_GREEN = new Color(0, 146, 54, 230); + 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 Actor getOpponent() { Client client = RuneLite.getClient(); @@ -27,6 +45,53 @@ public class OpponentInfo extends Plugin if (opponent == null) return; - graphics.drawString(opponent.getName() + " " + opponent.getHealth() + "/" + opponent.getMaxHealth(), 42, 42); + int cur = opponent.getHealth(); + int max = opponent.getMaxHealth(); + + Graphics g = image.getGraphics(); + FontMetrics fm = g.getFontMetrics(); + + int height = TOP_BORDER + + fm.getHeight(); // opponent name + if (max > 0) + height += 1 // between name and hp bar + + BAR_HEIGHT; // bar + height += BOTTOM_BORDER; + + g.setColor(BACKGROUND); + g.fillRect(0, 0, image.getWidth(), height); + + String str = opponent.getName(); + + int x = (image.getWidth() - fm.stringWidth(str)) / 2; + g.setColor(Color.white); + g.drawString(str, x, fm.getHeight() + TOP_BORDER); + + // hp bar + + if (max > 0) + { + float percent = (float) cur / (float) max; + if (percent > 100f) + percent = 100f; + + int barWidth = (int) (percent * (float) BAR_WIDTH); + int barY = TOP_BORDER + fm.getHeight() + 1; + + g.setColor(HP_GREEN); + g.fillRect((WIDTH - BAR_WIDTH) / 2, barY, barWidth, BAR_HEIGHT); + + g.setColor(HP_RED); + g.fillRect(((WIDTH - BAR_WIDTH) / 2) + barWidth, barY, BAR_WIDTH - barWidth, BAR_HEIGHT); + + str = cur + " / " + max; + x = (image.getWidth() - fm.stringWidth(str)) / 2; + g.setColor(Color.white); + g.drawString(str, x, barY + fm.getHeight()); + } + + g.dispose(); + + graphics.drawImage(image, 10, 25, null); } } diff --git a/src/main/java/net/runelite/inject/callbacks/RSCanvasCallback.java b/src/main/java/net/runelite/inject/callbacks/RSCanvasCallback.java index 42a9e983d3..9b6805296e 100644 --- a/src/main/java/net/runelite/inject/callbacks/RSCanvasCallback.java +++ b/src/main/java/net/runelite/inject/callbacks/RSCanvasCallback.java @@ -20,6 +20,8 @@ public class RSCanvasCallback //clientGraphics.drawString("something, something 2", 42, 42); new OpponentInfo().draw(clientGraphics); + clientGraphics.dispose(); + superGraphics.drawImage(clientBuffer, 0, 0, null); return gameBuffer.getGraphics();