diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/StatusBarsConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/StatusBarsConfig.java index 0624edbdc6..cbce85bab4 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/StatusBarsConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/StatusBarsConfig.java @@ -27,11 +27,14 @@ package net.runelite.client.plugins.statusbars; import net.runelite.client.config.Config; import net.runelite.client.config.ConfigGroup; import net.runelite.client.config.ConfigItem; +import net.runelite.client.config.Units; import net.runelite.client.plugins.statusbars.config.BarMode; -@ConfigGroup("statusbars") +@ConfigGroup(StatusBarsConfig.GROUP) public interface StatusBarsConfig extends Config { + String GROUP = "statusbars"; + @ConfigItem( keyName = "enableCounter", name = "Show counters", @@ -81,4 +84,15 @@ public interface StatusBarsConfig extends Config { return BarMode.PRAYER; } + + @ConfigItem( + keyName = "hideAfterCombatDelay", + name = "Hide after combat delay", + description = "Amount of ticks before hiding status bars after no longer in combat. 0 = always show status bars." + ) + @Units(Units.TICKS) + default int hideAfterCombatDelay() + { + return 0; + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/StatusBarsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/StatusBarsOverlay.java index 3710944577..c406bf0d1f 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/StatusBarsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/StatusBarsOverlay.java @@ -80,6 +80,7 @@ class StatusBarsOverlay extends Overlay private static final int MAX_RUN_ENERGY_VALUE = 100; private final Client client; + private final StatusBarsPlugin plugin; private final StatusBarsConfig config; private final ItemStatChangesService itemStatService; private final SpriteManager spriteManager; @@ -94,11 +95,12 @@ class StatusBarsOverlay extends Overlay private final Map barRenderers = new EnumMap<>(BarMode.class); @Inject - private StatusBarsOverlay(Client client, StatusBarsConfig config, SkillIconManager skillIconManager, ItemStatChangesService itemstatservice, SpriteManager spriteManager) + private StatusBarsOverlay(Client client, StatusBarsPlugin plugin, StatusBarsConfig config, SkillIconManager skillIconManager, ItemStatChangesService itemstatservice, SpriteManager spriteManager) { setPosition(OverlayPosition.DYNAMIC); setLayer(OverlayLayer.ABOVE_WIDGETS); this.client = client; + this.plugin = plugin; this.config = config; this.itemStatService = itemstatservice; this.spriteManager = spriteManager; @@ -216,6 +218,11 @@ class StatusBarsOverlay extends Overlay @Override public Dimension render(Graphics2D g) { + if (!plugin.isBarsDisplayed()) + { + return null; + } + Viewport curViewport = null; Widget curWidget = null; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/StatusBarsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/StatusBarsPlugin.java index cb36b42d0d..21e9553b5d 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/StatusBarsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/StatusBarsPlugin.java @@ -26,12 +26,24 @@ package net.runelite.client.plugins.statusbars; import javax.inject.Inject; import com.google.inject.Provides; +import lombok.AccessLevel; +import lombok.Getter; +import net.runelite.api.Actor; +import net.runelite.api.Client; +import net.runelite.api.NPC; +import net.runelite.api.Player; +import net.runelite.api.Varbits; +import net.runelite.api.events.GameTick; +import net.runelite.client.callback.ClientThread; import net.runelite.client.config.ConfigManager; +import net.runelite.client.eventbus.Subscribe; +import net.runelite.client.events.ConfigChanged; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDependency; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.plugins.itemstats.ItemStatPlugin; import net.runelite.client.ui.overlay.OverlayManager; +import org.apache.commons.lang3.ArrayUtils; @PluginDescriptor( name = "Status Bars", @@ -47,9 +59,24 @@ public class StatusBarsPlugin extends Plugin @Inject private OverlayManager overlayManager; + @Inject + private Client client; + + @Inject + private StatusBarsConfig config; + + @Inject + private ClientThread clientThread; + + @Getter(AccessLevel.PACKAGE) + private boolean barsDisplayed; + + private int lastCombatActionTickCount; + @Override protected void startUp() throws Exception { + clientThread.invokeLater(this::checkStatusBars); overlayManager.add(overlay); } @@ -57,6 +84,7 @@ public class StatusBarsPlugin extends Plugin protected void shutDown() throws Exception { overlayManager.remove(overlay); + barsDisplayed = false; } @Provides @@ -64,4 +92,45 @@ public class StatusBarsPlugin extends Plugin { return configManager.getConfig(StatusBarsConfig.class); } + + @Subscribe + public void onGameTick(GameTick gameTick) + { + checkStatusBars(); + } + + @Subscribe + public void onConfigChanged(ConfigChanged event) + { + if (StatusBarsConfig.GROUP.equals(event.getGroup()) && event.getKey().equals("hideAfterCombatDelay")) + { + clientThread.invokeLater(this::checkStatusBars); + } + } + + private void checkStatusBars() + { + final Player localPlayer = client.getLocalPlayer(); + if (localPlayer == null) + { + return; + } + + final Actor interacting = localPlayer.getInteracting(); + + if (config.hideAfterCombatDelay() == 0) + { + barsDisplayed = true; + } + else if ((interacting instanceof NPC && ArrayUtils.contains(((NPC) interacting).getComposition().getActions(), "Attack")) + || (interacting instanceof Player && client.getVar(Varbits.PVP_SPEC_ORB) == 1)) + { + lastCombatActionTickCount = client.getTickCount(); + barsDisplayed = true; + } + else if (client.getTickCount() - lastCombatActionTickCount >= config.hideAfterCombatDelay()) + { + barsDisplayed = false; + } + } }