From 2d01dc21bdc9ea6cd367775756e83e8d53091d93 Mon Sep 17 00:00:00 2001 From: dekvall Date: Tue, 6 Aug 2019 02:11:43 +0200 Subject: [PATCH] prayer: display prayer time remaining in prayer orb --- .../net/runelite/api/widgets/WidgetID.java | 1 + .../net/runelite/api/widgets/WidgetInfo.java | 1 + .../client/plugins/prayer/PrayerConfig.java | 11 +++ .../plugins/prayer/PrayerDoseOverlay.java | 62 ++++------------- .../client/plugins/prayer/PrayerPlugin.java | 68 ++++++++++++++++++- 5 files changed, 95 insertions(+), 48 deletions(-) diff --git a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java index d957b3f8d5..d8d8a93f4d 100644 --- a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java +++ b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java @@ -324,6 +324,7 @@ public class WidgetID static final int HEALTH_ORB = 2; static final int PRAYER_ORB = 12; static final int QUICK_PRAYER_ORB = 14; // Has the "Quick-prayers" name + static final int PRAYER_ORB_TEXT = 15; static final int RUN_ORB = 20; static final int TOGGLE_RUN_ORB = 22; // Has the "Toggle run" name static final int RUN_ORB_TEXT = 23; diff --git a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java index ea559f8d37..754a93766d 100644 --- a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java +++ b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java @@ -165,6 +165,7 @@ public enum WidgetInfo MINIMAP_XP_ORB(WidgetID.MINIMAP_GROUP_ID, WidgetID.Minimap.XP_ORB), MINIMAP_PRAYER_ORB(WidgetID.MINIMAP_GROUP_ID, WidgetID.Minimap.PRAYER_ORB), MINIMAP_QUICK_PRAYER_ORB(WidgetID.MINIMAP_GROUP_ID, WidgetID.Minimap.QUICK_PRAYER_ORB), + MINIMAP_PRAYER_ORB_TEXT(WidgetID.MINIMAP_GROUP_ID, WidgetID.Minimap.PRAYER_ORB_TEXT), MINIMAP_RUN_ORB(WidgetID.MINIMAP_GROUP_ID, WidgetID.Minimap.RUN_ORB), MINIMAP_TOGGLE_RUN_ORB(WidgetID.MINIMAP_GROUP_ID, WidgetID.Minimap.TOGGLE_RUN_ORB), MINIMAP_RUN_ORB_TEXT(WidgetID.MINIMAP_GROUP_ID, WidgetID.Minimap.RUN_ORB_TEXT), diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerConfig.java index 9a22f48cc4..d2cad67fe5 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerConfig.java @@ -129,4 +129,15 @@ public interface PrayerConfig extends Config { return false; } + + @ConfigItem( + position = 9, + keyName = "replaceOrbText", + name = "Replace orb text with prayer time left", + description = "Show time remaining of current prayers in the prayer orb." + ) + default boolean replaceOrbText() + { + return false; + } } \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerDoseOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerDoseOverlay.java index ab1d91fb16..dc18d47a98 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerDoseOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerDoseOverlay.java @@ -37,7 +37,6 @@ import lombok.Setter; import net.runelite.api.Client; import net.runelite.api.Constants; import net.runelite.api.Point; -import net.runelite.api.Prayer; import net.runelite.api.Skill; import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.WidgetInfo; @@ -47,7 +46,6 @@ import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.tooltip.Tooltip; import net.runelite.client.ui.overlay.tooltip.TooltipManager; import net.runelite.client.util.ColorUtil; -import org.apache.commons.lang3.StringUtils; class PrayerDoseOverlay extends Overlay { @@ -57,13 +55,12 @@ class PrayerDoseOverlay extends Overlay private static final Color END_COLOR = new Color(0, 92, 92); private final Client client; + private final PrayerPlugin plugin; private final PrayerConfig config; private final TooltipManager tooltipManager; private Instant startOfLastTick = Instant.now(); private boolean trackTick = true; - @Setter(AccessLevel.PACKAGE) - private int prayerBonus; @Setter(AccessLevel.PACKAGE) private boolean hasPrayerRestore; @Setter(AccessLevel.PACKAGE) @@ -72,10 +69,11 @@ class PrayerDoseOverlay extends Overlay private boolean hasHolyWrench; @Inject - private PrayerDoseOverlay(final Client client, final TooltipManager tooltipManager, final PrayerConfig config) + private PrayerDoseOverlay(final Client client, final TooltipManager tooltipManager, final PrayerPlugin plugin, final PrayerConfig config) { this.client = client; this.tooltipManager = tooltipManager; + this.plugin = plugin; this.config = config; setPosition(OverlayPosition.DYNAMIC); setLayer(OverlayLayer.ABOVE_WIDGETS); @@ -114,11 +112,19 @@ class PrayerDoseOverlay extends Overlay if (config.showPrayerStatistics() && bounds.contains(mousePosition.getX(), mousePosition.getY())) { - final String tooltip = "Time Remaining: " + getEstimatedTimeRemaining() + - "
" + - "Prayer Bonus: " + prayerBonus; + final StringBuilder sb = new StringBuilder(); - tooltipManager.add(new Tooltip(tooltip)); + if (config.replaceOrbText()) + { + sb.append("Prayer points remaining: ").append(client.getBoostedSkillLevel(Skill.PRAYER)); + } + else + { + sb.append("Time Remaining: ").append(plugin.getEstimatedTimeRemaining(false)); + } + + sb.append("
").append("Prayer Bonus: ").append(plugin.getPrayerBonus()); + tooltipManager.add(new Tooltip(sb.toString())); } if (!config.showPrayerDoseIndicator() || !hasPrayerRestore) @@ -163,42 +169,4 @@ class PrayerDoseOverlay extends Overlay return new Dimension((int) bounds.getWidth(), (int) bounds.getHeight()); } - private double getPrayerDrainRate(Client client) - { - double drainRate = 0.0; - - for (Prayer prayer : Prayer.values()) - { - if (client.isPrayerActive(prayer)) - { - drainRate += prayer.getDrainRate(); - } - } - - return drainRate; - } - - private String getEstimatedTimeRemaining() - { - // Base data - final double drainRate = getPrayerDrainRate(client); - - if (drainRate == 0) - { - return "N/A"; - } - - final int currentPrayer = client.getBoostedSkillLevel(Skill.PRAYER); - - // Calculate how many seconds each prayer points last so the prayer bonus can be applied - final double secondsPerPoint = (60.0 / drainRate) * (1.0 + (prayerBonus / 30.0)); - - // Calculate the number of seconds left - final double secondsLeft = (currentPrayer * secondsPerPoint); - final int minutes = (int) Math.floor(secondsLeft / 60.0); - final int seconds = (int) Math.floor(secondsLeft - (minutes * 60.0)); - - // Return the text - return Integer.toString(minutes) + ":" + StringUtils.leftPad(Integer.toString(seconds), 2, "0"); - } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerPlugin.java index eb5334177d..9622f7d809 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerPlugin.java @@ -28,6 +28,8 @@ package net.runelite.client.plugins.prayer; import com.google.inject.Provides; import java.time.Duration; import java.time.Instant; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; import javax.inject.Inject; import lombok.AccessLevel; import lombok.Getter; @@ -38,8 +40,11 @@ import net.runelite.api.Item; import net.runelite.api.ItemContainer; import net.runelite.api.Prayer; import net.runelite.client.events.ConfigChanged; +import net.runelite.api.Skill; import net.runelite.api.events.GameTick; import net.runelite.api.events.ItemContainerChanged; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.game.ItemManager; @@ -64,6 +69,9 @@ public class PrayerPlugin extends Plugin @Getter(AccessLevel.PACKAGE) private boolean prayersActive = false; + @Getter(AccessLevel.PACKAGE) + private int prayerBonus; + @Inject private Client client; @@ -150,7 +158,7 @@ public class PrayerPlugin extends Plugin if (equipment != null) { - doseOverlay.setPrayerBonus(checkContainerForPrayer(equipment.getItems())); + prayerBonus = checkContainerForPrayer(equipment.getItems()); } } @@ -176,6 +184,11 @@ public class PrayerPlugin extends Plugin barOverlay.onTick(); } + if (config.replaceOrbText() && isAnyPrayerActive()) + { + setPrayerOrbText(getEstimatedTimeRemaining(true)); + } + if (!config.prayerIndicator()) { return; @@ -304,4 +317,57 @@ public class PrayerPlugin extends Plugin infoBoxManager.removeIf(entry -> entry instanceof PrayerCounter && ((PrayerCounter) entry).getPrayerType().isOverhead()); } + + private void setPrayerOrbText(String text) + { + Widget prayerOrbText = client.getWidget(WidgetInfo.MINIMAP_PRAYER_ORB_TEXT); + if (prayerOrbText != null) + { + prayerOrbText.setText(text); + } + } + + private static double getPrayerDrainRate(Client client) + { + double drainRate = 0.0; + + for (Prayer prayer : Prayer.values()) + { + if (client.isPrayerActive(prayer)) + { + drainRate += prayer.getDrainRate(); + } + } + + return drainRate; + } + + String getEstimatedTimeRemaining(boolean formatForOrb) + { + final double drainRate = getPrayerDrainRate(client); + + if (drainRate == 0) + { + return "N/A"; + } + + final int currentPrayer = client.getBoostedSkillLevel(Skill.PRAYER); + + // Calculate how many seconds each prayer points last so the prayer bonus can be applied + final double secondsPerPoint = (60.0 / drainRate) * (1.0 + (prayerBonus / 30.0)); + + // Calculate the number of seconds left + final double secondsLeft = (currentPrayer * secondsPerPoint); + + LocalTime timeLeft = LocalTime.ofSecondOfDay((long) secondsLeft); + + if (formatForOrb && timeLeft.getMinute() > 9) + { + return timeLeft.format(DateTimeFormatter.ofPattern("m")) + "m"; + } + else + { + return timeLeft.format(DateTimeFormatter.ofPattern("m:ss")); + } + } }