From 72cb2ffade76bd71c3287805ac2ff39b4711c832 Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 6 Apr 2019 14:04:48 -0400 Subject: [PATCH 1/3] interface styles: simplify loading sprites Co-authored-by: Lotto --- .../InterfaceStylesPlugin.java | 36 ++++++------------- 1 file changed, 10 insertions(+), 26 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/InterfaceStylesPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/InterfaceStylesPlugin.java index 742fb53a0d..27d955c257 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/InterfaceStylesPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/InterfaceStylesPlugin.java @@ -28,9 +28,6 @@ package net.runelite.client.plugins.interfacestyles; import com.google.inject.Provides; import java.awt.image.BufferedImage; -import java.io.IOException; -import java.io.InputStream; -import javax.imageio.ImageIO; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; import net.runelite.api.Client; @@ -123,7 +120,8 @@ public class InterfaceStylesPlugin extends Plugin { if (skin == config.skin()) { - SpritePixels spritePixels = getFileSpritePixels(String.valueOf(spriteOverride.getSpriteID()), null); + String file = config.skin().toString() + "/" + spriteOverride.getSpriteID() + ".png"; + SpritePixels spritePixels = getFileSpritePixels(file); if (spriteOverride.getSpriteID() == SpriteID.COMPASS_TEXTURE) { @@ -154,7 +152,8 @@ public class InterfaceStylesPlugin extends Plugin { if (widgetOverride.getSkin() == config.skin()) { - SpritePixels spritePixels = getFileSpritePixels(widgetOverride.getName(), "widget"); + String file = config.skin().toString() + "/widget/" + widgetOverride.getName() + ".png"; + SpritePixels spritePixels = getFileSpritePixels(file); if (spritePixels != null) { @@ -178,33 +177,18 @@ public class InterfaceStylesPlugin extends Plugin } } - private SpritePixels getFileSpritePixels(String file, String subfolder) + private SpritePixels getFileSpritePixels(String file) { - StringBuilder stringBuilder = new StringBuilder(); - stringBuilder.append(config.skin().toString() + "/"); - - if (subfolder != null) + try { - stringBuilder.append(subfolder + "/"); + log.debug("Loading: {}", file); + BufferedImage image = ImageUtil.getResourceStreamFromClass(this.getClass(), file); + return ImageUtil.getImageSpritePixels(image, client); } - - stringBuilder.append(file + ".png"); - String filePath = stringBuilder.toString(); - - try (InputStream inputStream = InterfaceStylesPlugin.class.getResourceAsStream(filePath)) - { - log.debug("Loading: " + filePath); - BufferedImage spriteImage = ImageIO.read(inputStream); - return ImageUtil.getImageSpritePixels(spriteImage, client); - } - catch (IOException ex) + catch (RuntimeException ex) { log.debug("Unable to load image: ", ex); } - catch (IllegalArgumentException ex) - { - log.debug("Input stream of file path " + filePath + " could not be read: ", ex); - } return null; } From 8f53358a4e9c9e2e6a1c7bd986cbd43cff2b3261 Mon Sep 17 00:00:00 2001 From: Lotto Date: Fri, 29 Mar 2019 22:30:16 +0100 Subject: [PATCH 2/3] client: add HD health bars to Interface Styles --- .../main/java/net/runelite/api/Client.java | 8 ++ .../net/runelite/api/HealthBarOverride.java | 37 +++++++ .../InterfaceStylesConfig.java | 10 ++ .../InterfaceStylesPlugin.java | 24 +++++ .../interfacestyles/2010/healthbar/back.png | Bin 0 -> 280 bytes .../2010/healthbar/back_large.png | Bin 0 -> 305 bytes .../interfacestyles/2010/healthbar/front.png | Bin 0 -> 371 bytes .../2010/healthbar/front_large.png | Bin 0 -> 444 bytes .../net/runelite/mixins/RSClientMixin.java | 11 ++ .../net/runelite/mixins/RSHealthBarMixin.java | 96 ++++++++++++++++++ 10 files changed, 186 insertions(+) create mode 100644 runelite-api/src/main/java/net/runelite/api/HealthBarOverride.java create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/back.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/back_large.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/front.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/front_large.png create mode 100644 runelite-mixins/src/main/java/net/runelite/mixins/RSHealthBarMixin.java diff --git a/runelite-api/src/main/java/net/runelite/api/Client.java b/runelite-api/src/main/java/net/runelite/api/Client.java index 2b7d3aa844..47a969ccb4 100644 --- a/runelite-api/src/main/java/net/runelite/api/Client.java +++ b/runelite-api/src/main/java/net/runelite/api/Client.java @@ -1480,6 +1480,14 @@ public interface Client extends GameEngine */ NodeCache getWidgetSpriteCache(); + /** + * Overrides health bar sprites with the sprites from the specified override. + * Pass in {@code null} to revert the health bars back to their default. + * + * @param override the health bar override + */ + void setHealthBarOverride(HealthBarOverride override); + /** * Gets the current server tick count. * diff --git a/runelite-api/src/main/java/net/runelite/api/HealthBarOverride.java b/runelite-api/src/main/java/net/runelite/api/HealthBarOverride.java new file mode 100644 index 0000000000..b53b480518 --- /dev/null +++ b/runelite-api/src/main/java/net/runelite/api/HealthBarOverride.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2019, Lotto + * 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 HOLDER 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; + +import lombok.Data; + +@Data +public class HealthBarOverride +{ + public final SpritePixels frontSprite; + public final SpritePixels backSprite; + public final SpritePixels frontSpriteLarge; + public final SpritePixels backSpriteLarge; +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/InterfaceStylesConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/InterfaceStylesConfig.java index e86fe0d2bb..281361eebc 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/InterfaceStylesConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/InterfaceStylesConfig.java @@ -42,4 +42,14 @@ public interface InterfaceStylesConfig extends Config { return Skin.AROUND_2010; } + + @ConfigItem( + keyName = "hdHealthBars", + name = "High Detail health bars", + description = "Replaces health bars with the RuneScape High Detail mode design" + ) + default boolean hdHealthBars() + { + return false; + } } \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/InterfaceStylesPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/InterfaceStylesPlugin.java index 27d955c257..226b8da617 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/InterfaceStylesPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/InterfaceStylesPlugin.java @@ -31,6 +31,7 @@ import java.awt.image.BufferedImage; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; import net.runelite.api.Client; +import net.runelite.api.HealthBarOverride; import net.runelite.api.SpriteID; import net.runelite.api.SpritePixels; import net.runelite.api.events.ConfigChanged; @@ -85,6 +86,7 @@ public class InterfaceStylesPlugin extends Plugin { restoreWidgetDimensions(); removeGameframe(); + client.setHealthBarOverride(null); }); } @@ -110,6 +112,7 @@ public class InterfaceStylesPlugin extends Plugin overrideWidgetSprites(); restoreWidgetDimensions(); adjustWidgetDimensions(); + overrideHealthBars(); } private void overrideSprites() @@ -229,6 +232,27 @@ public class InterfaceStylesPlugin extends Plugin } } + private void overrideHealthBars() + { + if (config.hdHealthBars()) + { + String fileBase = Skin.AROUND_2010.toString() + "/healthbar/"; + + SpritePixels frontSprite = getFileSpritePixels(fileBase + "front.png"); + SpritePixels backSprite = getFileSpritePixels(fileBase + "back.png"); + + SpritePixels frontSpriteLarge = getFileSpritePixels(fileBase + "front_large.png"); + SpritePixels backSpriteLarge = getFileSpritePixels(fileBase + "back_large.png"); + + HealthBarOverride override = new HealthBarOverride(frontSprite, backSprite, frontSpriteLarge, backSpriteLarge); + client.setHealthBarOverride(override); + } + else + { + client.setHealthBarOverride(null); + } + } + private void restoreWidgetDimensions() { for (WidgetOffset widgetOffset : WidgetOffset.values()) diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/back.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/back.png new file mode 100644 index 0000000000000000000000000000000000000000..89e37c75bdf9a9282e3eea582bb93a94ab51222f GIT binary patch literal 280 zcmV+z0q6dSP) zjzKYt)q~hDzGO+r)5xA(gXCFU7@Hbohi@Vhqr{*iG!N!NaWNK*F968JxKax>a0DAG eWx!UlK&cH-+)zJJPHJf*;DU{ePy& z_W!jq+y6Jp9RFWPbNqiK$oc;^FW3L;yxji}GH}5I8ywKNXepQ2)Y?sC3dEMmV0aY+ z8&M>hmd6$WYp?`9u^2hK6B~(}Da0r# z+7YRY&PBt;cyJY&5kw12N-m@)j$mWOtPn>r?OGiGM_e>2n5Bjegr_%SXu*@rQ4 z^gdL~Hw%K{9&9-V@!Ue7p>s|{Fo=!JN5)f6K=gp<&f^evPQ%!PYKo}Ql3VoC;)0vs&y14 RQx^aL002ovPDHLkV1mD$mqh>o literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/front_large.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2010/healthbar/front_large.png new file mode 100644 index 0000000000000000000000000000000000000000..b7cc3e38b7080584279e64d2f560ee1e07fc4cb9 GIT binary patch literal 444 zcmV;t0YmI4KwA4J8;2O;v5;Djv*9J3h}hi+i_AG8J&`>$g7 z@3j;^c16NA3mN{K%*DjIGZ_9WPsNX=CsQ9I0vkv)pM~H~AfA1h;s1);MK6X@IM<51|`7gz1T6|EC@yf^f8A2%Pu4E zLZBn&oJL>}ABK^|apB3p9MO3UVlIdcLB%?oDZ?N$So_cd8kVBb1D4ppMGs{3z{D1a$bpNl7Fz%k6Ts+!iyolJ z7$%P`kjV{b<<$)TWq?=|Smd!ygkX3;GpM6_669cz1B`ZJ$9g-+k7f0Z5XT^6xg`*+ zundAhY^j-~VUZcwF{qproeIH(%2Sv+bTeQ@00?tUfnZQdg#{!GgT# + * 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.mixins; + +import net.runelite.api.HealthBarOverride; +import net.runelite.api.mixins.Copy; +import net.runelite.api.mixins.Mixin; +import net.runelite.api.mixins.Replace; +import net.runelite.api.mixins.Shadow; +import net.runelite.rs.api.RSHealthBar; +import net.runelite.rs.api.RSSpritePixels; + +@Mixin(RSHealthBar.class) +public abstract class RSHealthBarMixin implements RSHealthBar +{ + // Larger values are used for bosses like Corporeal Beast + private static final int DEFAULT_HEALTH_SCALE = 30; + + @Shadow("healthBarOverride") + private static HealthBarOverride healthBarOverride; + + @Copy("getHealthBarBackSprite") + abstract RSSpritePixels rs$getHealthBarBackSprite(); + + @Replace("getHealthBarBackSprite") + public RSSpritePixels rl$getHealthBarBackSprite() + { + /* + * If this combat info already uses sprites for health bars, + * use those instead, and don't override. + */ + RSSpritePixels pixels = rs$getHealthBarBackSprite(); + if (pixels != null) + { + return pixels; + } + + if (healthBarOverride == null) + { + return null; + } + + return getHealthScale() == DEFAULT_HEALTH_SCALE + ? (RSSpritePixels) healthBarOverride.backSprite + : (RSSpritePixels) healthBarOverride.backSpriteLarge; + } + + @Copy("getHealthBarFrontSprite") + abstract RSSpritePixels rs$getHealthBarFrontSprite(); + + @Replace("getHealthBarFrontSprite") + public RSSpritePixels rl$getHealthBarFrontSprite() + { + /* + * If this combat info already uses sprites for health bars, + * use those instead, and don't override. + */ + RSSpritePixels pixels = rs$getHealthBarFrontSprite(); + if (pixels != null) + { + return pixels; + } + + if (healthBarOverride == null) + { + return null; + } + + // 30 is the default size, large is for bosses like Corporeal Beast + return getHealthScale() == DEFAULT_HEALTH_SCALE + ? (RSSpritePixels) healthBarOverride.frontSprite + : (RSSpritePixels) healthBarOverride.frontSpriteLarge; + } +} From 6fb316809060248db6d9db4d6895e7e7c1e604fc Mon Sep 17 00:00:00 2001 From: Lotto Date: Fri, 5 Apr 2019 22:26:53 +0200 Subject: [PATCH 3/3] interface styles: add default skin type --- .../java/net/runelite/client/plugins/interfacestyles/Skin.java | 1 + 1 file changed, 1 insertion(+) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/Skin.java b/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/Skin.java index 5d31ff6998..c041ffedc2 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/Skin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/Skin.java @@ -33,6 +33,7 @@ import lombok.Getter; @AllArgsConstructor public enum Skin { + DEFAULT("Default"), AROUND_2005("2005"), AROUND_2010("2010");