From 8d16c82377f0dba0dfe08460db6793baa4e688f5 Mon Sep 17 00:00:00 2001 From: Adam Date: Mon, 29 Apr 2019 13:28:17 -0400 Subject: [PATCH] client: add custom cursor plugin Co-authored-by: Kruithne Co-authored-by: Trevor --- .../plugins/customcursor/CustomCursor.java | 54 +++++++++++ .../customcursor/CustomCursorConfig.java | 43 +++++++++ .../customcursor/CustomCursorPlugin.java | 89 ++++++++++++++++++ .../java/net/runelite/client/ui/ClientUI.java | 4 +- .../customcursor/cursor-dragon-dagger.png | Bin 0 -> 18008 bytes .../customcursor/cursor-dragon-scimitar.png | Bin 0 -> 570 bytes .../plugins/customcursor/cursor-rs3-gold.png | Bin 0 -> 18738 bytes .../customcursor/cursor-rs3-silver.png | Bin 0 -> 15630 bytes .../plugins/customcursor/cursor-trout.png | Bin 0 -> 15609 bytes 9 files changed, 189 insertions(+), 1 deletion(-) create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/customcursor/CustomCursor.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/customcursor/CustomCursorConfig.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/customcursor/CustomCursorPlugin.java create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/customcursor/cursor-dragon-dagger.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/customcursor/cursor-dragon-scimitar.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/customcursor/cursor-rs3-gold.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/customcursor/cursor-rs3-silver.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/customcursor/cursor-trout.png diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/customcursor/CustomCursor.java b/runelite-client/src/main/java/net/runelite/client/plugins/customcursor/CustomCursor.java new file mode 100644 index 0000000000..1116ab10c2 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/customcursor/CustomCursor.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2018, Kruithne + * 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.client.plugins.customcursor; + +import java.awt.image.BufferedImage; +import lombok.Getter; +import net.runelite.client.util.ImageUtil; + +public enum CustomCursor +{ + RS3_GOLD("RS3 Gold", "cursor-rs3-gold.png"), + RS3_SILVER("RS3 Silver", "cursor-rs3-silver.png"), + DRAGON_DAGGER("Dragon Dagger", "cursor-dragon-dagger.png"), + TROUT("Trout", "cursor-trout.png"), + DRAGON_SCIMITAR("Dragon Scimitar", "cursor-dragon-scimitar.png"); + + private final String name; + @Getter + private final BufferedImage cursorImage; + + CustomCursor(String name, String icon) + { + this.name = name; + this.cursorImage = ImageUtil.getResourceStreamFromClass(CustomCursorPlugin.class, icon); + } + + @Override + public String toString() + { + return name; + } +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/customcursor/CustomCursorConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/customcursor/CustomCursorConfig.java new file mode 100644 index 0000000000..cf7075a393 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/customcursor/CustomCursorConfig.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2018, Kruithne + * 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.client.plugins.customcursor; + +import net.runelite.client.config.Config; +import net.runelite.client.config.ConfigGroup; +import net.runelite.client.config.ConfigItem; + +@ConfigGroup("customcursor") +public interface CustomCursorConfig extends Config +{ + @ConfigItem( + keyName = "cursorStyle", + name = "Cursor", + description = "Select which cursor you wish to use" + ) + default CustomCursor selectedCursor() + { + return CustomCursor.RS3_GOLD; + } +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/customcursor/CustomCursorPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/customcursor/CustomCursorPlugin.java new file mode 100644 index 0000000000..3025640cd2 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/customcursor/CustomCursorPlugin.java @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2018, Kruithne + * 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.client.plugins.customcursor; + +import com.google.inject.Provides; +import java.awt.Cursor; +import java.awt.Point; +import java.awt.Toolkit; +import javax.inject.Inject; +import javax.swing.JPanel; +import net.runelite.api.events.ConfigChanged; +import net.runelite.client.config.ConfigManager; +import net.runelite.client.eventbus.Subscribe; +import net.runelite.client.plugins.Plugin; +import net.runelite.client.plugins.PluginDescriptor; +import net.runelite.client.ui.ClientUI; + +@PluginDescriptor( + name = "Custom Cursor", + description = "Replaces your mouse cursor image", + enabledByDefault = false +) +public class CustomCursorPlugin extends Plugin +{ + @Inject + private ClientUI clientUI; + + @Inject + private CustomCursorConfig config; + + @Provides + CustomCursorConfig provideConfig(ConfigManager configManager) + { + return configManager.getConfig(CustomCursorConfig.class); + } + + @Override + protected void startUp() + { + updateCursor(); + } + + @Override + protected void shutDown() + { + clientUI.getContainer().setCursor(Cursor.getDefaultCursor()); + } + + @Subscribe + public void onConfigChanged(ConfigChanged event) + { + if (event.getGroup().equals("customcursor") && event.getKey().equals("cursorStyle")) + { + updateCursor(); + } + } + + private void updateCursor() + { + JPanel container = clientUI.getContainer(); + CustomCursor selectedCursor = config.selectedCursor(); + + Cursor cursor = Toolkit.getDefaultToolkit().createCustomCursor(selectedCursor.getCursorImage(), + new Point(container.getX(), container.getY()), selectedCursor.toString()); + container.setCursor(cursor); + } +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java b/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java index 96ba6c31e6..4f76d01a39 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java @@ -110,6 +110,9 @@ public class ClientUI @Getter private TrayIcon trayIcon; + @Getter + private JPanel container; + private final RuneLiteProperties properties; private final RuneLiteConfig config; private final KeyManager keyManager; @@ -130,7 +133,6 @@ public class ClientUI private JButton currentButton; private NavigationButton currentNavButton; private boolean sidebarOpen; - private JPanel container; private NavigationButton sidebarNavigationButton; private JButton sidebarNavigationJButton; private Dimension lastClientSize; diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/customcursor/cursor-dragon-dagger.png b/runelite-client/src/main/resources/net/runelite/client/plugins/customcursor/cursor-dragon-dagger.png new file mode 100644 index 0000000000000000000000000000000000000000..9a59c1753c56344bde2a25a8095a3c9406507e6c GIT binary patch literal 18008 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 D8kxFa literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/customcursor/cursor-rs3-gold.png b/runelite-client/src/main/resources/net/runelite/client/plugins/customcursor/cursor-rs3-gold.png new file mode 100644 index 0000000000000000000000000000000000000000..ee89a5b05a016cf5c7202ae82b88215eb57f5836 GIT binary patch literal 18738 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 literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/customcursor/cursor-trout.png b/runelite-client/src/main/resources/net/runelite/client/plugins/customcursor/cursor-trout.png new file mode 100644 index 0000000000000000000000000000000000000000..b32ddf0ea1fb5546600764031562121bcd7fe141 GIT binary patch literal 15609 zcmeI3Yg7|w8plUPq^K(@hzPrcs8y`Vmspa5 zsB>)vDJr>wBF0Q8g-Z{hA&dYXg%?O?a(O%sZ#IR+U~*vw8)h?TEVh8d5O7$O?iW?$ zibq0|CSDLJ3GFV2{|cfeS}aBZ45y@|&{NoS%#;8#0|NtL1`B4fXt;uAPBmE6R+_;) z)sdtpj|4R%Cauw;#S9c%UUeLnYzd-LZH0PY-Pffz_7*ajyV>CsVXN8*GwBR?Fp~!9 z^%#>)I{VNx2#o4bJ!-I+aUXL~pD_`$VCF<@h?2eCLl(y8L@w{GJ?MD#`aw&ZEg`FL z1l>pnb()o_Mih=j%~-MtK|@yImojy*tG8(5`zEJfCR@*tV@IvpA#AoDht0ke95W=u zuT>y6p=t|eQev1+Oy4V9=Zs0d$=d>VsG zV=|R2rhvm0u=(#Wm;wd^Na9cq$RWox+W6GLa`3{}g^h*;A>7vpD0|nFK#b`y6Fw$X#1_JXH3KgD8WTtjW{cW@pi+qlZ=h?n z8UY(&#&hD>0W>wj)X>-{M@@@E7$}X6AUq9|!{PGOfp&ayIcR?^wFEwGPnO zu0``dUdte9UMm%@HRJ0v64mWEUqGkrKM{`B{`1qbtX`i_q3v)J;A;UNm)brDOdGfdUd2NP{pYaS|gor=^i3_Ab7?ZdN z5rF~{7f6FJCUFrW0tF;4kOpB);vz%@3P@Za4Z@hjMTiI#khnk^gfWSW5D_RKae*`l zV-go3B2Yl$0%;J&BrZZkpn${$(jbgUT!e@~0f`HwK^VUgmuuf6fT#g~?k@#@z|T9U zVjuo+AO#7JltWP3bO>6L0YP1_@b8BZl+1vjmiHk@up5Frv7Fe-PzZ7glS<|)t@V%c zmS#nV_@|Rg?wc=**uarCT4MKLD)6Vt#w!R@GEn3eMRG|8=Jp9b7Em&dxkl_`iJ!9cN=}# zVP7uoa*|08ZFwkK8K7%<z{QRdi;j*-deTd&CozSw6@4d>c{tw13r3zgt!={+!=j;u-rH?lU$_ zy!e&}RClc9L?PvB>XnMxQ8O0La*C9_m-;d=?S(Td>*6p<=9uThB@Ifysc{90>_bUE zuOD+hb=&r2>}luN%+QDHPh>uM(Hqdv;-;(agqU zf?>vc_eyV!fM)BHn$F)YXzzObtwP4McCl8+dWU*%Ub$<@o_I>+Or`tykl|h-=_yYW z0**d*t9}vl#r9zf*7JYu*s#oN%H3c7>2eU^ZYfbE)zsZiFH79|4enF?;K|CmFzK>$ zoNQA5Ics)j%Y>R|orYNj)FS!i*#^S_WmObCZ>Gnl@3Idls-mhMX#JxhMt!_!yzI%N zzb~wouYD*>FHZ1mD#lHKTfc zsy}1-#th%n8v@qXbWAzSw6=9LAou$-onQ<1&=TZJvG=9u##dD* zcV7DLsr#qQGEElN*>=CBq%|2{(E6(EZb-}r74I~RqA%~-F=EuX;^xEOS9Zky<&=5S zKaO(#+H`;UpFhu?|7@m*zlZCV+7{=Xk)J6get8E=mo;zO-wG*Zl^+-0xkZ6;IA_LB z@fDWxLtWRpPw;Q4Sn@#CaeXSp*(rPWB9tB+ye3o{xi#RMv-RnF(|vYqLo&BVo$s2H zG@o4%w{~I5>GERlYiAzu_g=c^XRYDSosoB?;YN9TmCLvi`h^eYv`@_YTeHc_AA9fE zo-c;`S&NSs>1DS%KiHQEKR-KPlvlCgWLJ8-ldsWF;XeuEDt4#nmYvD(T(Prrg@@an wh~mTMuH3U<%PL0x#w;CY^u4`$bbBK-;{25kMca<&wuh6YArX?J^WI literal 0 HcmV?d00001