diff --git a/runelite-api/src/main/java/net/runelite/api/ParamID.java b/runelite-api/src/main/java/net/runelite/api/ParamID.java index 50d2bdf71f..d726067c5a 100644 --- a/runelite-api/src/main/java/net/runelite/api/ParamID.java +++ b/runelite-api/src/main/java/net/runelite/api/ParamID.java @@ -29,6 +29,10 @@ package net.runelite.api; */ public final class ParamID { + /** + * Long name for NPCs used in the HP hud + */ + public static final int NPC_HP_NAME = 510; /** * @see SettingID */ diff --git a/runelite-api/src/main/java/net/runelite/api/Varbits.java b/runelite-api/src/main/java/net/runelite/api/Varbits.java index 57151da3ca..b1862fc17c 100644 --- a/runelite-api/src/main/java/net/runelite/api/Varbits.java +++ b/runelite-api/src/main/java/net/runelite/api/Varbits.java @@ -650,7 +650,14 @@ public enum Varbits * 2 = popup notification only * 3 = chat and popup */ - COLLECTION_LOG_NOTIFICATION(11959); + COLLECTION_LOG_NOTIFICATION(11959), + + /** + * Show boss health overlay setting + * 0 = on + * 1 = off + */ + BOSS_HEALTH_OVERLAY(12389); /** * The raw varbit ID. diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoOverlay.java index dc9cb8c1c2..672ab50e16 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoOverlay.java @@ -25,6 +25,7 @@ */ package net.runelite.client.plugins.opponentinfo; +import com.google.common.base.Strings; import java.awt.Color; import java.awt.Dimension; import java.awt.FontMetrics; @@ -33,9 +34,14 @@ import java.awt.Point; import java.awt.Rectangle; import javax.inject.Inject; import net.runelite.api.Actor; +import net.runelite.api.Client; import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; import net.runelite.api.NPC; +import net.runelite.api.NPCComposition; +import net.runelite.api.ParamID; import net.runelite.api.Player; +import net.runelite.api.VarPlayer; +import net.runelite.api.Varbits; import net.runelite.client.game.HiscoreManager; import net.runelite.client.game.NPCManager; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; @@ -54,6 +60,7 @@ class OpponentInfoOverlay extends OverlayPanel 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 Client client; private final OpponentInfoPlugin opponentInfoPlugin; private final OpponentInfoConfig opponentInfoConfig; private final HiscoreManager hiscoreManager; @@ -66,12 +73,14 @@ class OpponentInfoOverlay extends OverlayPanel @Inject private OpponentInfoOverlay( + Client client, OpponentInfoPlugin opponentInfoPlugin, OpponentInfoConfig opponentInfoConfig, HiscoreManager hiscoreManager, NPCManager npcManager) { super(opponentInfoPlugin); + this.client = client; this.opponentInfoPlugin = opponentInfoPlugin; this.opponentInfoConfig = opponentInfoConfig; this.hiscoreManager = hiscoreManager; @@ -105,6 +114,15 @@ class OpponentInfoOverlay extends OverlayPanel lastMaxHealth = null; if (opponent instanceof NPC) { + NPCComposition composition = ((NPC) opponent).getTransformedComposition(); + if (composition != null) + { + String longName = composition.getStringValue(ParamID.NPC_HP_NAME); + if (!Strings.isNullOrEmpty(longName)) + { + opponentName = longName; + } + } lastMaxHealth = npcManager.getHealth(((NPC) opponent).getId()); } else if (opponent instanceof Player) @@ -121,7 +139,9 @@ class OpponentInfoOverlay extends OverlayPanel } } - if (opponentName == null) + // The in-game hp hud is more accurate than our overlay and duplicates all of the information on it, + // so hide ours if it is visible. + if (opponentName == null || hasHpHud(opponent)) { return null; } @@ -198,4 +218,20 @@ class OpponentInfoOverlay extends OverlayPanel return super.render(graphics); } + + /** + * Check if the hp hud is active for an opponent + * @param opponent + * @return + */ + private boolean hasHpHud(Actor opponent) + { + boolean settingEnabled = client.getVar(Varbits.BOSS_HEALTH_OVERLAY) == 0; + if (settingEnabled && opponent instanceof NPC) + { + int opponentId = client.getVar(VarPlayer.HP_HUD_NPC_ID); + return opponentId != -1 && opponentId == ((NPC) opponent).getId(); + } + return false; + } }