From 25df4f9d47f113bdb99866e47c70726ab24133eb Mon Sep 17 00:00:00 2001 From: Seth Date: Thu, 25 Jan 2018 19:54:28 -0500 Subject: [PATCH] timers plugin: add more timers --- .../main/java/net/runelite/api/GraphicID.java | 38 +++++++ .../client/plugins/timers/GameTimer.java | 32 ++++-- .../client/plugins/timers/TimersConfig.java | 30 +++++ .../client/plugins/timers/TimersPlugin.java | 104 ++++++++++++++++++ .../runelite/client/plugins/timers/bind.png | Bin 0 -> 3134 bytes .../client/plugins/timers/entangle.png | Bin 0 -> 196 bytes .../client/plugins/timers/icebarrage.png | Bin 0 -> 199 bytes .../client/plugins/timers/iceblitz.png | Bin 0 -> 1159 bytes .../client/plugins/timers/iceburst.png | Bin 0 -> 1160 bytes .../client/plugins/timers/icerush.png | Bin 0 -> 187 bytes .../client/plugins/timers/imbuedheart.png | Bin 0 -> 631 bytes .../runelite/client/plugins/timers/snare.png | Bin 0 -> 297 bytes .../client/plugins/timers/vengeance.png | Bin 0 -> 527 bytes 13 files changed, 195 insertions(+), 9 deletions(-) create mode 100644 runelite-api/src/main/java/net/runelite/api/GraphicID.java create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/timers/bind.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/timers/entangle.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/timers/icebarrage.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/timers/iceblitz.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/timers/iceburst.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/timers/icerush.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/timers/imbuedheart.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/timers/snare.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/timers/vengeance.png diff --git a/runelite-api/src/main/java/net/runelite/api/GraphicID.java b/runelite-api/src/main/java/net/runelite/api/GraphicID.java new file mode 100644 index 0000000000..4d4622c9c1 --- /dev/null +++ b/runelite-api/src/main/java/net/runelite/api/GraphicID.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.api; + +public class GraphicID +{ + public static final int ENTANGLE = 179; + public static final int SNARE = 180; + public static final int BIND = 181; + public static final int ICE_RUSH = 361; + public static final int ICE_BURST = 363; + public static final int ICE_BLITZ = 367; + public static final int ICE_BARRAGE = 369; + public static final int VENGEANCE = 726; + public static final int IMBUED_HEART = 1316; +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/timers/GameTimer.java b/runelite-client/src/main/java/net/runelite/client/plugins/timers/GameTimer.java index c961e68e24..854bb51944 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/timers/GameTimer.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timers/GameTimer.java @@ -31,7 +31,9 @@ import java.io.InputStream; import java.time.Duration; import java.time.temporal.ChronoUnit; import javax.imageio.ImageIO; +import lombok.Getter; import lombok.extern.slf4j.Slf4j; +import net.runelite.api.GraphicID; @Slf4j public enum GameTimer @@ -46,27 +48,39 @@ public enum GameTimer HALFTB("teleblock", 150, ChronoUnit.SECONDS), SUPERANTIVENOM("antivenom", 3, ChronoUnit.MINUTES), SUPERANTIFIRE("superantifire", 2, ChronoUnit.MINUTES), - ANTIDOTEPLUSPLUS("antidoteplusplus", 12, ChronoUnit.MINUTES); + ANTIDOTEPLUSPLUS("antidoteplusplus", 12, ChronoUnit.MINUTES), + BIND("bind", GraphicID.BIND, 5, ChronoUnit.SECONDS), + HALFBIND("bind", GraphicID.BIND, 2500, ChronoUnit.MILLIS), + SNARE("snare", GraphicID.SNARE, 10, ChronoUnit.SECONDS), + HALFSNARE("snare", GraphicID.SNARE, 5, ChronoUnit.SECONDS), + ENTANGLE("entangle", GraphicID.ENTANGLE, 15, ChronoUnit.SECONDS), + HALFENTANGLE("entangle", GraphicID.ENTANGLE, 7500, ChronoUnit.MILLIS), + ICERUSH("icerush", GraphicID.ICE_RUSH, 5, ChronoUnit.SECONDS), + ICEBURST("iceburst", GraphicID.ICE_BURST, 10, ChronoUnit.SECONDS), + ICEBLITZ("iceblitz", GraphicID.ICE_BLITZ, 15, ChronoUnit.SECONDS), + ICEBARRAGE("icebarrage", GraphicID.ICE_BARRAGE, 20, ChronoUnit.SECONDS), + IMBUEDHEART("imbuedheart", GraphicID.IMBUED_HEART, 420, ChronoUnit.SECONDS), + VENGEANCE("vengeance", GraphicID.VENGEANCE, 30, ChronoUnit.SECONDS); + @Getter private final String imageResource; + @Getter private final Duration duration; + @Getter + private final Integer graphicId; private BufferedImage image; - GameTimer(String imageResource, long time, ChronoUnit unit) + GameTimer(String imageResource, Integer graphicId, long time, ChronoUnit unit) { this.imageResource = imageResource; + this.graphicId = graphicId; this.duration = Duration.of(time, unit); } - public String getImageResource() + GameTimer(String imageResource, long time, ChronoUnit unit) { - return imageResource; - } - - public Duration getDuration() - { - return duration; + this(imageResource, null, time, unit); } public BufferedImage getImage() diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/timers/TimersConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/timers/TimersConfig.java index 12f77b56df..3146d4803b 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/timers/TimersConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timers/TimersConfig.java @@ -144,4 +144,34 @@ public interface TimersConfig extends Config { return true; } + + @ConfigItem( + keyName = "showImbuedHeart", + name = "Imbued Heart timer", + description = "Configures whether imbued heart timer is displayed" + ) + default boolean showImbuedHeart() + { + return true; + } + + @ConfigItem( + keyName = "showVengeance", + name = "Vengeance timer", + description = "Configures whether vengeance timer is displayed" + ) + default boolean showVengeance() + { + return true; + } + + @ConfigItem( + keyName = "showFreezes", + name = "Freeze timer", + description = "Configures whether freeze timer is displayed" + ) + default boolean showFreezes() + { + return true; + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/timers/TimersPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/timers/TimersPlugin.java index e9ec2cfe5f..d417ddb4d1 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/timers/TimersPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timers/TimersPlugin.java @@ -35,11 +35,27 @@ import static net.runelite.client.plugins.timers.GameTimer.OVERLOAD; import static net.runelite.client.plugins.timers.GameTimer.STAMINA; import static net.runelite.client.plugins.timers.GameTimer.SUPERANTIFIRE; import static net.runelite.client.plugins.timers.GameTimer.SUPERANTIVENOM; +import static net.runelite.client.plugins.timers.GameTimer.BIND; +import static net.runelite.client.plugins.timers.GameTimer.ENTANGLE; +import static net.runelite.client.plugins.timers.GameTimer.HALFBIND; +import static net.runelite.client.plugins.timers.GameTimer.HALFENTANGLE; +import static net.runelite.client.plugins.timers.GameTimer.HALFSNARE; +import static net.runelite.client.plugins.timers.GameTimer.ICEBARRAGE; +import static net.runelite.client.plugins.timers.GameTimer.ICEBLITZ; +import static net.runelite.client.plugins.timers.GameTimer.ICEBURST; +import static net.runelite.client.plugins.timers.GameTimer.ICERUSH; +import static net.runelite.client.plugins.timers.GameTimer.IMBUEDHEART; +import static net.runelite.client.plugins.timers.GameTimer.SNARE; +import static net.runelite.client.plugins.timers.GameTimer.VENGEANCE; import com.google.common.eventbus.Subscribe; import com.google.inject.Provides; import javax.inject.Inject; +import net.runelite.api.Actor; import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; import net.runelite.api.ItemID; +import net.runelite.api.Prayer; +import net.runelite.api.events.GraphicChanged; import net.runelite.client.config.ConfigManager; import net.runelite.api.events.ChatMessage; import net.runelite.api.events.ConfigChanged; @@ -53,6 +69,9 @@ import net.runelite.client.ui.overlay.infobox.InfoBoxManager; ) public class TimersPlugin extends Plugin { + @Inject + Client client; + @Inject TimersConfig config; @@ -225,6 +244,91 @@ public class TimersPlugin extends Plugin { removeGameTimer(SUPERANTIFIRE); } + + if (event.getMessage().equals("Your imbued heart has regained its magical power.")) + { + removeGameTimer(IMBUEDHEART); + } + } + + @Subscribe + public void onGraphicChanged(GraphicChanged event) + { + Actor actor = event.getActor(); + + if (actor != client.getLocalPlayer()) + { + return; + } + + if (actor.getGraphic() == IMBUEDHEART.getGraphicId() && config.showImbuedHeart()) + { + createGameTimer(IMBUEDHEART); + } + + if (actor.getGraphic() == VENGEANCE.getGraphicId() && config.showVengeance()) + { + createGameTimer(VENGEANCE); + } + + if (config.showFreezes()) + { + if (actor.getGraphic() == BIND.getGraphicId()) + { + if (client.isPrayerActive(Prayer.PROTECT_FROM_MAGIC)) + { + createGameTimer(HALFBIND); + } + else + { + createGameTimer(BIND); + } + } + + if (actor.getGraphic() == SNARE.getGraphicId()) + { + if (client.isPrayerActive(Prayer.PROTECT_FROM_MAGIC)) + { + createGameTimer(HALFSNARE); + } + else + { + createGameTimer(SNARE); + } + } + + if (actor.getGraphic() == ENTANGLE.getGraphicId()) + { + if (client.isPrayerActive(Prayer.PROTECT_FROM_MAGIC)) + { + createGameTimer(HALFENTANGLE); + } + else + { + createGameTimer(ENTANGLE); + } + } + + if (actor.getGraphic() == ICERUSH.getGraphicId()) + { + createGameTimer(ICERUSH); + } + + if (actor.getGraphic() == ICEBURST.getGraphicId()) + { + createGameTimer(ICEBURST); + } + + if (actor.getGraphic() == ICEBLITZ.getGraphicId()) + { + createGameTimer(ICEBLITZ); + } + + if (actor.getGraphic() == ICEBARRAGE.getGraphicId()) + { + createGameTimer(ICEBARRAGE); + } + } } public void createGameTimer(GameTimer timer) diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/timers/bind.png b/runelite-client/src/main/resources/net/runelite/client/plugins/timers/bind.png new file mode 100644 index 0000000000000000000000000000000000000000..cfaa07029c8fd59068441f2ea1ebb0ca081d5161 GIT binary patch literal 3134 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 literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/timers/entangle.png b/runelite-client/src/main/resources/net/runelite/client/plugins/timers/entangle.png new file mode 100644 index 0000000000000000000000000000000000000000..abe631c595be6a500d6a455db3beb21b8212fe8f GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz6!3HEJ^yqE{Qr(^|jv*GO*G`G$Yf#{6j(*xS z?+SO;GiJq(KRE`ozX)D>*UYFFxM;K4`P7GZK2Fwn$P;RnJonb((>sEmTjenvYPGWE z_lp)j7NR@V({f&7SUyYJuPKuCj2C}zW8>5{C~c9PG_`i7R z@Bjb)Suf1m1C(Vc3Gxg6|NlROgVxF~Kz@R!i(^Q|t<-)-z5@z8OgESO|NkkX{Y8@S z+pkJ)hQ}^=RUYH@e`XQW;VtHVt$NcPna6Xwm_6?&#P!*SU!KXh>T@nnb7*RM+`30o v!sf4hRyTi^f5+$e-Dlz*&&gb0xnr_ihaK}m5jUd@pj`}}u6{1-oD!M<1T#;Q literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/timers/iceblitz.png b/runelite-client/src/main/resources/net/runelite/client/plugins/timers/iceblitz.png new file mode 100644 index 0000000000000000000000000000000000000000..49e0cf4ce9eed1be92fd7d57889dff36c21fa60f GIT binary patch literal 1159 zcmeAS@N?(olHy`uVBq!ia0vp^>_9BU!3-o9OgA~nz`)E9;1l8sF@vl{((hCiO~=k5g{;c1^s z`uqRCe_)YOVl)IsL4oHed+;&aMiKbaPJ^$B>F!S1%moWH8`x z4y?cW*WFLMLSW8bP0l+XkKUw|+n literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/timers/icerush.png b/runelite-client/src/main/resources/net/runelite/client/plugins/timers/icerush.png new file mode 100644 index 0000000000000000000000000000000000000000..31fa6d49c75897d675fc500719d53acc448b2a8a GIT binary patch literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^LO{&U!3HE*ugcZ~sU}Ys#}J9B$!E^{rZ+TpPEP;Z zzVUPMWeG_S2AvaaI&r_a^#rBQy3JZBAa3~Y|Nr;$GWv19q*;v(3=SFk*cw^eo6l_& zOga(2W|~f9pH|)HYx!-{-16FH{aVih0=m6-c<$ZXFR?8zb@8I^gvMUgo(X&WEqWd_ j&YeH|m`4$VG9v>|QSptbXC`t0UBlq%>gTe~DWM4fX`Dn5 literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/timers/imbuedheart.png b/runelite-client/src/main/resources/net/runelite/client/plugins/timers/imbuedheart.png new file mode 100644 index 0000000000000000000000000000000000000000..89e85e4458107cd559e7ade26abcba78734a8353 GIT binary patch literal 631 zcmV--0*L*IP)Px%F-b&0R7l6Imd$I_Kp4iKnRz#vCaqm6*cLU2Xf1TN)RRyUPagaO{A(3j6!flp z5RanJy)4l!Ym%KwJR~#u-rZu~Q!*d<&GSBa--O}Tf@S4(##XMpE#UFtGkC5C=}3I~ z{&^*s{hy*dM!^YuXA3TE*|87bKK80+H-$a9`w)&GID+805)lZ}k#HTibJxY>vIVA1 zVP}U=;knX|3Qiy{06yphYNZRcZKbphcK&E=A$AiNATA)u!H^4t4cJ;4eZZHGpIbmP zBsmrw_Q3j7_9$i9+tXK_My%}q-~5Yf+GEeKDMTkWb0RX=KnDoBA z3}D$f7-7H%wzEhoi(LpRVAP>bSzw&RHmz6TRR!Eu%FV?xUD|q6skUj-T3JA~98{|8 zoL0K#{XE)7O>#E{7;T1N(yCvljz}WHUn|N}Tg^b5rw5fLsO!=c3fa zlGGH1^30M91$R&1fE2w{cA$8#r;B5V#p$&n(R>XGJlPk2-=Fc2-Epyz#yPc`OJ5Bc zoDx<(cj}rjGxZOPm~r(=W`@4EUlONHyu`L3Kt<;E#}hJ#yu$P=HP#tNF0_B(r{LXl#iQhb2CL>J=D7jW$hxby);Cw#hJ$N7KUbI+BnjoSd^*@WC$0AB7TjwNyLPD`@P z=R~Ri7;7h}RuBcO2j_8#Px~c7^Yy+1=(J-AVj4D8D<{B)mgB1!i!gL zmx8Zf^xq;;An^`t^jFn?5doOUREo*$c>`z}QQG$|ntO>e)=rAeM_1~6J~!m@k2>4c zW72m=OG#!!orQ2UU;DzFr$g@E{LYi{nNyDiV0L!>)#S0`@#=XV9M-upEzN1_00J^s z{rhL@0Bl!}>HIu80Z9AM8wuSpY_7M&gvFrt{MXPYet>j|Vs9igY7Pd1D474T+8aqR zZqyvjfzWBk;_S2!qQobJf3W#*b*)fr)EwP0GzTSFZmqAuqT;hEyuWmTYhS+69hd8! zb}WmzW^=tIJG=WXj~!7WT-7z;Qvu%ExFz6UYfzmdn4RRYBkg}I7iR26rc#hZs)+jj znInL*pi$xrWiyK!-xuM@PqN>r`X^vSOTcV&+Ob5cICAnVCo&b>)O`R0`~f@i$;@!A RX