From 30368a14875684064f29f016a984a2d5f733690b Mon Sep 17 00:00:00 2001 From: Thomas Cylke Date: Wed, 22 May 2019 01:03:16 -0400 Subject: [PATCH] Adds an option to make the boosts plugin look kinda neat --- .../client/plugins/boosts/BoostsConfig.java | 19 ++- .../client/plugins/boosts/BoostsOverlay.java | 2 +- .../client/plugins/boosts/BoostsPlugin.java | 13 +- .../plugins/boosts/CombatIconsOverlay.java | 137 ++++++++++++++++++ .../client/plugins/boosts/buffedSmall.png | Bin 0 -> 536 bytes .../client/plugins/boosts/debuffedSmall.png | Bin 0 -> 562 bytes .../resources/skill_icons_small/attack.png | Bin 289 -> 308 bytes .../resources/skill_icons_small/defence.png | Bin 225 -> 248 bytes .../resources/skill_icons_small/magic.png | Bin 291 -> 319 bytes .../resources/skill_icons_small/strength.png | Bin 326 -> 316 bytes 10 files changed, 161 insertions(+), 10 deletions(-) create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/boosts/CombatIconsOverlay.java create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/boosts/buffedSmall.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/boosts/debuffedSmall.png diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/boosts/BoostsConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/boosts/BoostsConfig.java index cc5344771a..d5d7cadba8 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/boosts/BoostsConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/boosts/BoostsConfig.java @@ -71,11 +71,22 @@ public interface BoostsConfig extends Config return false; } + @ConfigItem( + keyName = "displayIconPanel", + name = "Icons", + description = "Show boosts next to icons (transparent background)", + position = 4 + ) + default boolean displayIcons() + { + return false; + } + @ConfigItem( keyName = "displayNextBuffChange", name = "Display next buff change", description = "Configures whether or not to display when the next buffed stat change will be", - position = 4 + position = 5 ) default DisplayChangeMode displayNextBuffChange() { @@ -86,7 +97,7 @@ public interface BoostsConfig extends Config keyName = "displayNextDebuffChange", name = "Display next debuff change", description = "Configures whether or not to display when the next debuffed stat change will be", - position = 5 + position = 6 ) default DisplayChangeMode displayNextDebuffChange() { @@ -97,7 +108,7 @@ public interface BoostsConfig extends Config keyName = "boostThreshold", name = "Boost Amount Threshold", description = "The amount of levels boosted to send a notification at. A value of 0 will disable notification.", - position = 6 + position = 7 ) default int boostThreshold() { @@ -108,7 +119,7 @@ public interface BoostsConfig extends Config keyName = "groupNotifications", name = "Group Notifications", description = "Configures whether or not to group notifications for multiple skills into a single notification", - position = 7 + position = 8 ) default boolean groupNotifications() { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/boosts/BoostsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/boosts/BoostsOverlay.java index 49d9389462..113205ecfd 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/boosts/BoostsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/boosts/BoostsOverlay.java @@ -62,7 +62,7 @@ class BoostsOverlay extends Overlay @Override public Dimension render(Graphics2D graphics) { - if (config.displayInfoboxes()) + if (config.displayInfoboxes() || config.displayIcons()) { return null; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/boosts/BoostsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/boosts/BoostsPlugin.java index 511359206e..5dabff0736 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/boosts/BoostsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/boosts/BoostsPlugin.java @@ -28,7 +28,7 @@ import com.google.common.collect.ImmutableSet; import com.google.inject.Provides; import java.util.ArrayList; import java.util.Arrays; -import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import javax.inject.Inject; @@ -87,14 +87,16 @@ public class BoostsPlugin extends Plugin @Inject private BoostsOverlay boostsOverlay; + //made this a LinkedHashSet so the order stays consistent for my OCD + @Getter + private final Set shownSkills = new LinkedHashSet<>(); @Inject private BoostsConfig config; @Inject private SkillIconManager skillIconManager; - - @Getter - private final Set shownSkills = new HashSet<>(); + @Inject + private CombatIconsOverlay combatIconsOverlay; private boolean isChangedDown = false; private boolean isChangedUp = false; @@ -115,7 +117,7 @@ public class BoostsPlugin extends Plugin protected void startUp() throws Exception { overlayManager.add(boostsOverlay); - + overlayManager.add(combatIconsOverlay); updateShownSkills(); updateBoostedStats(); Arrays.fill(lastSkillLevels, -1); @@ -137,6 +139,7 @@ public class BoostsPlugin extends Plugin protected void shutDown() throws Exception { overlayManager.remove(boostsOverlay); + overlayManager.remove(combatIconsOverlay); infoBoxManager.removeIf(t -> t instanceof BoostIndicator || t instanceof StatChangeIndicator); preserveBeenActive = false; lastChangeDown = -1; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/boosts/CombatIconsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/boosts/CombatIconsOverlay.java new file mode 100644 index 0000000000..0609c4f1c8 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/boosts/CombatIconsOverlay.java @@ -0,0 +1,137 @@ +package net.runelite.client.plugins.boosts; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics2D; +import java.awt.Rectangle; +import java.awt.image.BufferedImage; +import javax.inject.Inject; +import net.runelite.api.Client; +import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; +import net.runelite.api.Skill; +import net.runelite.client.game.SkillIconManager; +import net.runelite.client.ui.overlay.Overlay; +import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; +import net.runelite.client.ui.overlay.OverlayMenuEntry; +import net.runelite.client.ui.overlay.OverlayPosition; +import net.runelite.client.ui.overlay.OverlayPriority; +import net.runelite.client.ui.overlay.components.ComponentOrientation; +import net.runelite.client.ui.overlay.components.ImageComponent; +import net.runelite.client.ui.overlay.components.LineComponent; +import net.runelite.client.ui.overlay.components.PanelComponent; +import net.runelite.client.util.ColorUtil; +import net.runelite.client.util.ImageUtil; + +class CombatIconsOverlay extends Overlay +{ + private final Client client; + private final BoostsConfig config; + private final PanelComponent panelComponent = new PanelComponent(); + private final SkillIconManager iconManager; + private final BoostsPlugin plugin; + + @Inject + private CombatIconsOverlay(Client client, BoostsConfig config, BoostsPlugin plugin, SkillIconManager iconManager) + { + super(plugin); + this.plugin = plugin; + this.client = client; + this.config = config; + this.iconManager = iconManager; + setPosition(OverlayPosition.TOP_LEFT); + setPriority(OverlayPriority.MED); + getMenuEntries().add(new OverlayMenuEntry(RUNELITE_OVERLAY_CONFIG, OPTION_CONFIGURE, "Boosts overlay")); + } + + @Override + public Dimension render(Graphics2D graphics) + { + if (config.displayInfoboxes() || !config.displayIcons()) + { + return null; + } + + panelComponent.getChildren().clear(); + panelComponent.setPreferredSize(new Dimension(28, 0)); + panelComponent.setWrapping(2); + panelComponent.setBackgroundColor(null); + panelComponent.setBorder(new Rectangle()); + + if (plugin.canShowBoosts()) + { + for (Skill skill : plugin.getShownSkills()) + { + final int boosted = client.getBoostedSkillLevel(skill); + final int base = client.getRealSkillLevel(skill); + + if (boosted == base) + { + continue; + } + + final int boost = boosted - base; + final Color strColor = getTextColor(boost); + String str; + + if (config.useRelativeBoost()) + { + str = String.valueOf(boost); + if (boost > 0) + { + str = "+" + str; + } + } + else + { + str = ColorUtil.prependColorTag(Integer.toString(boosted), strColor); + } + + BufferedImage skillImage = iconManager.getSkillImage(skill, true); + panelComponent.setOrientation(ComponentOrientation.HORIZONTAL); + panelComponent.getChildren().add(new ImageComponent(skillImage)); + panelComponent.getChildren().add(LineComponent.builder() + .left("") + .right(str) + .rightColor(strColor) + .build()); + } + } + + int nextChange = plugin.getChangeDownTicks(); + + if (nextChange != -1) + { + BufferedImage buffImage = ImageUtil.getResourceStreamFromClass(getClass(), "buffedSmall.png"); + panelComponent.getChildren().add(new ImageComponent(buffImage)); + panelComponent.getChildren().add(LineComponent.builder() + .left("") + .right(String.valueOf(plugin.getChangeTime(nextChange))) + .build()); + } + + nextChange = plugin.getChangeUpTicks(); + + if (nextChange != -1) + { + BufferedImage debuffImage = ImageUtil.getResourceStreamFromClass(getClass(), "debuffedSmall.png"); + panelComponent.getChildren().add(new ImageComponent(debuffImage)); + panelComponent.getChildren().add(LineComponent.builder() + .left("") + .right(String.valueOf(plugin.getChangeTime(nextChange))) + .build()); + } + + return panelComponent.render(graphics); + } + + private Color getTextColor(int boost) + { + if (boost < 0) + { + return new Color(238, 51, 51); + } + + return boost <= config.boostThreshold() ? Color.YELLOW : Color.GREEN; + + } +} diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/boosts/buffedSmall.png b/runelite-client/src/main/resources/net/runelite/client/plugins/boosts/buffedSmall.png new file mode 100644 index 0000000000000000000000000000000000000000..b204e0c54de9ed8e0308f1a0978a92905deb9f6b GIT binary patch literal 536 zcmV+z0_XjSP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGf5&!@T5&_cPe*6Fc02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y9E;jv63FrU-0f|XOK~y+Tt&Gbr15p%*=T#|&%BV=F(4f*s zre2v&h_-^pteU=PMM5kj*s@}4Q_n=$Xb5R6EF?CT{xbZ`z0FKool(R|zMOl{Ilqqq zK(Q&Zs6iA(x8CdP8xbkOAXi+$QTjZO zLTTLyLOV?UO_VyzS3>Ys(BBP3qwbJU@7bHn)*E@q!FhseP!=@;(Jytoa5_QjeXb(=EK#pBw zG+x4tb_JKK^FyEiTtrZ2iBT6lrdN)QBaEDNrQHxZl;unrC^tN-~X3Quu@WjI~N axIO_<Px#1ZP1_K>z@;j|==^1poj532;bRa{vGf5&!@T5&_cPe*6Fc02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y9E;jv63FrU-0i#JoK~y+Tt4_g=$7kxXOTT<%8Mpf$2r9h^9w&&<8c z1%}qY2lMY$YLd@wu)%TJXwYE znL0ARG>yU$BeL7`XlJS4f~_ft%H|Ln?PmM-=J^A(e!aSt*&(&?T( zWK5Lgc=vxU~tioqamZMA7=Yp{7}w7Vcd|(Ize}0lIZ3HUO=)&OHvrE z76Q*hNYq4WbqU}T1n_+LTa!pMLEak-;Xn8MUakfO5!MF_RxZ!vyT!D9!A{)_?kL_{RjXe-TvhD5 z(d0kh9D%oW8Pg^Nzn87qATKKQY)4!pVPwnq+1w9YN+UpjAPq<&&UoJSVrQakW5YPQ;zopr0JrUJ A$N&HU literal 289 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkQ1G&+ zi(`mI@7&9KxeghKv^_M}a=PeS@R==U4r}43^sinq=P%q;oUXF#h0YGnUAs8*ycTK{ zUTFI#^}5li>cr=zmI1CmjXsKhH#di}HEQs)2w literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP;j!R zi(`mI@6ljSt_B01o=56T^Zo?;|8&W(bue{h91bEL7Q)#YEXJs8ZQB>dop+vm#n%Ky`vH1!1} zZ#wZ@u$;ao@bP~E;pWo2d91&<7%%N-C|I_-xWmCkSB|SF^^(wbo+C?|7S*$-I;#h2 T-aI!I=sX5bS3j3^P6Eak-;Xn7{UEXE`9+rg90ZYzZh};!%{Dp{(Vba~WI+@!WqfOQ4 zGBCy`El}~f%Q2U8Xb@;_W-+IHdi->7%rp9iq^1{NGS9C-e5P@hqn z^i_wt)GNv>9F;TTbDW7b|Xx(swX NgQu&X%Q~loCIH<|d7S_N literal 291 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkQ1Gg! zi(`mIZ||gwyiAHbZU40t-yM)rv)kFi{DNWDhlD^*r`+{*v$+ mQ}0iy{vW&QOH}lQ>+F?%4p#R=wS0jdWbkzLb6Mw<&;$VXy>Ms% diff --git a/runelite-client/src/main/resources/skill_icons_small/strength.png b/runelite-client/src/main/resources/skill_icons_small/strength.png index 3c69b7bfa09daca3de5bb7b2a734d3538049fc9e..1d950c40a4a01240ed3e11023ecddd9de67e23ba 100644 GIT binary patch literal 316 zcmeAS@N?(olHy`uVBq!ia0vp^LO?9Q!3HFy+4N(86k~CayA#8@b22Z19F}xPUq=Rp zjs4tz5?O(K&H|6fVg?3ope}A9#!GkW{s09fN?apKg7ec#$`gxH8440J^GfvcQcDy} z^bGaP{`zsg0IFH*>Eak-;lK3KMc!ru9+nFwi}VhZx4$Y^f58^p=(%g+X-mruzH_D( zUE*x|Fu7IZZ_JWy3l4X5Y@6J*=ehggV;THW?Q!RKe=~~}y>r3#TH`A*4F(6B&yoDy z6ZW+*<{j>RWSYeIsYCXO?fHuJiL*pD9Tq(JHT?wNu}788Mj5}|bPTzrGkjYF+6!+a ziT>o%{U~6_|5N2c#cJgXlm3QjoLjCq?|)koztgXNm9q+(@+UH83b}sdu>?At!PC{x JWt~$(699|Cb%Ou^ literal 326 zcmV-M0lEH(P)kwRAZq~*XA{pL5(7>gf+VJ4!WU@3#cJ<&APy{x)t-5pxKBW3k!vTL0Duw5SW9J* zv)LY_eSZegjnjGtJE#kW_;E2$lgNb@;SdeMMG+T1@QVXI#>AR~zl9RoQ&nHxr+hfX Y7h`f-?sHg7*8l(j07*qoM6N<$g2Ib{&;S4c