From ac5ef045b7375d8c902fb657017f06dcfc08f6fd Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Tue, 4 Sep 2018 18:05:41 +0200 Subject: [PATCH 1/2] Make sprite and widget sprite overrides more flexible - Expose NodeCache interface in RuneLite - Expose Client.getWidgetSpriteCache and reset method on it - Change setters for sprite and widget overrides to be getters This allows for more than 1 plugin to use the widget/sprite override API in future. Signed-off-by: Tomas Slusny --- .../main/java/net/runelite/api/Client.java | 19 +++++----- .../main/java/net/runelite/api/NodeCache.java | 36 +++++++++++++++++++ .../InterfaceStylesPlugin.java | 11 +++--- .../java/net/runelite/mixins/SpriteMixin.java | 25 ++++++------- .../runelite/mixins/WidgetSpriteMixin.java | 2 +- .../java/net/runelite/rs/api/RSClient.java | 1 + .../java/net/runelite/rs/api/RSNodeCache.java | 3 +- 7 files changed, 69 insertions(+), 28 deletions(-) create mode 100644 runelite-api/src/main/java/net/runelite/api/NodeCache.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 f074f6010a..cb48995317 100644 --- a/runelite-api/src/main/java/net/runelite/api/Client.java +++ b/runelite-api/src/main/java/net/runelite/api/Client.java @@ -1394,24 +1394,20 @@ public interface Client extends GameEngine void queueChangedSkill(Skill skill); /** - * Sets a mapping of sprites to override. + * Gets a mapping of sprites to override. *

* The key value in the map corresponds to the ID of the sprite, * and the value the sprite to replace it with. - * - * @param overrides the sprites to override */ - void setSpriteOverrides(Map overrides); + Map getSpriteOverrides(); /** - * Sets a mapping of widget sprites to override. + * Gets a mapping of widget sprites to override. *

* The key value in the map corresponds to the packed widget ID, * and the value the sprite to replace the widgets sprite with. - * - * @param overrides the sprites to override */ - void setWidgetSpriteOverrides(Map overrides); + Map getWidgetSpriteOverrides(); /** * Sets the compass sprite. @@ -1420,6 +1416,13 @@ public interface Client extends GameEngine */ void setCompass(SpritePixels spritePixels); + /** + * Returns widget sprite cache, to be used with {@link Client#getSpriteOverrides()} + * + * @return the cache + */ + NodeCache getWidgetSpriteCache(); + /** * Gets the current server tick count. * diff --git a/runelite-api/src/main/java/net/runelite/api/NodeCache.java b/runelite-api/src/main/java/net/runelite/api/NodeCache.java new file mode 100644 index 0000000000..c6337fd735 --- /dev/null +++ b/runelite-api/src/main/java/net/runelite/api/NodeCache.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2018, Tomas Slusny + * 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; + +/** + * Represents a doubly linked node cache. + */ +public interface NodeCache +{ + /** + * Resets cache. + */ + void reset(); +} 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 afccecf6d5..e60938da35 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 @@ -145,7 +145,9 @@ public class InterfaceStylesPlugin extends Plugin } } - client.setSpriteOverrides(overrides); + client.getWidgetSpriteCache().reset(); + client.getSpriteOverrides().clear(); + client.getSpriteOverrides().putAll(overrides); } private void overrideWidgetSprites() @@ -168,7 +170,8 @@ public class InterfaceStylesPlugin extends Plugin } } - client.setWidgetSpriteOverrides(widgetOverrides); + client.getWidgetSpriteOverrides().clear(); + client.getWidgetSpriteOverrides().putAll(widgetOverrides); } private SpritePixels getFileSpritePixels(String file, String subfolder) @@ -292,8 +295,8 @@ public class InterfaceStylesPlugin extends Plugin private void removeGameframe() { - client.setSpriteOverrides(null); - client.setWidgetSpriteOverrides(null); + client.getSpriteOverrides().clear(); + client.getWidgetSpriteOverrides().clear(); BufferedImage compassImage = spriteManager.getSprite(SpriteID.COMPASS_TEXTURE, 0); diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/SpriteMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/SpriteMixin.java index 272ec7e2c6..efe5ee605c 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/SpriteMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/SpriteMixin.java @@ -25,6 +25,7 @@ */ package net.runelite.mixins; +import java.util.HashMap; import java.util.Map; import net.runelite.api.SpritePixels; import net.runelite.api.mixins.Copy; @@ -39,24 +40,23 @@ import net.runelite.rs.api.RSSpritePixels; public abstract class SpriteMixin implements RSClient { @Inject - private static Map spriteOverrides; + private static final Map spriteOverrides = new HashMap(); @Inject - private static Map widgetSpriteOverrides; + private static final Map widgetSpriteOverrides = new HashMap(); @Inject @Override - public void setSpriteOverrides(Map overrides) + public Map getSpriteOverrides() { - getWidgetSpriteCache().reset(); - spriteOverrides = overrides; + return spriteOverrides; } @Inject @Override - public void setWidgetSpriteOverrides(Map overrides) + public Map getWidgetSpriteOverrides() { - widgetSpriteOverrides = overrides; + return widgetSpriteOverrides; } @Copy("getSpriteAsSpritePixels") @@ -68,14 +68,11 @@ public abstract class SpriteMixin implements RSClient @Replace("getSpriteAsSpritePixels") public static RSSpritePixels rl$loadSprite(RSIndexDataBase var0, int var1, int var2) { - if (spriteOverrides != null) - { - SpritePixels sprite = spriteOverrides.get(var1); + SpritePixels sprite = spriteOverrides.get(var1); - if (sprite != null) - { - return (RSSpritePixels) sprite; - } + if (sprite != null) + { + return (RSSpritePixels) sprite; } return rs$loadSprite(var0, var1, var2); diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/WidgetSpriteMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/WidgetSpriteMixin.java index 95821b0f26..12001fb4c8 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/WidgetSpriteMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/WidgetSpriteMixin.java @@ -49,7 +49,7 @@ public abstract class WidgetSpriteMixin implements RSWidget @Replace("getWidgetSprite") public RSSpritePixels rl$getWidgetSprite(boolean var1) { - if (getSpriteId() != -1 && widgetSpriteOverrides != null) + if (getSpriteId() != -1) { SpritePixels sprite = widgetSpriteOverrides.get(getId()); diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java b/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java index ee72bd1e3a..a54f253ae6 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java @@ -645,6 +645,7 @@ public interface RSClient extends RSGameEngine, Client void setCompass(SpritePixels spritePixels); @Import("widgetSpriteCache") + @Override RSNodeCache getWidgetSpriteCache(); @Import("oculusOrbState") diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSNodeCache.java b/runescape-api/src/main/java/net/runelite/rs/api/RSNodeCache.java index 7a721cde0c..fef11bb370 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSNodeCache.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSNodeCache.java @@ -24,9 +24,10 @@ */ package net.runelite.rs.api; +import net.runelite.api.NodeCache; import net.runelite.mapping.Import; -public interface RSNodeCache +public interface RSNodeCache extends NodeCache { @Import("get") RSCacheableNode get(long id); From 172812dc06d3365f68e73546c6ce9b3aff4bca8e Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Fri, 7 Sep 2018 18:29:05 +0200 Subject: [PATCH 2/2] Make interface styles not replace entire override map Signed-off-by: Tomas Slusny --- .../InterfaceStylesPlugin.java | 62 ++++++++++--------- 1 file changed, 33 insertions(+), 29 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 e60938da35..9b54d4e69c 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 @@ -32,8 +32,6 @@ import java.awt.image.BufferedImage; import java.awt.image.PixelGrabber; import java.io.IOException; import java.io.InputStream; -import java.util.HashMap; -import java.util.Map; import javax.imageio.ImageIO; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; @@ -80,13 +78,7 @@ public class InterfaceStylesPlugin extends Plugin @Override protected void startUp() throws Exception { - clientThread.invoke(() -> - { - overrideSprites(); - overrideWidgetSprites(); - restoreWidgetDimensions(); - adjustWidgetDimensions(); - }); + clientThread.invoke(this::updateAllOverrides); } @Override @@ -104,14 +96,7 @@ public class InterfaceStylesPlugin extends Plugin { if (config.getGroup().equals("interfaceStyles")) { - clientThread.invoke(() -> - { - removeGameframe(); - overrideSprites(); - overrideWidgetSprites(); - restoreWidgetDimensions(); - adjustWidgetDimensions(); - }); + clientThread.invoke(this::updateAllOverrides); } } @@ -121,10 +106,17 @@ public class InterfaceStylesPlugin extends Plugin adjustWidgetDimensions(); } + private void updateAllOverrides() + { + removeGameframe(); + overrideSprites(); + overrideWidgetSprites(); + restoreWidgetDimensions(); + adjustWidgetDimensions(); + } + private void overrideSprites() { - Map overrides = new HashMap<>(); - for (SpriteOverride spriteOverride : SpriteOverride.values()) { for (Skin skin : spriteOverride.getSkin()) @@ -139,21 +131,25 @@ public class InterfaceStylesPlugin extends Plugin } else { - overrides.put(spriteOverride.getSpriteID(), spritePixels); + client.getSpriteOverrides().put(spriteOverride.getSpriteID(), spritePixels); } } } } + } + private void restoreSprites() + { client.getWidgetSpriteCache().reset(); - client.getSpriteOverrides().clear(); - client.getSpriteOverrides().putAll(overrides); + + for (SpriteOverride spriteOverride : SpriteOverride.values()) + { + client.getSpriteOverrides().remove(spriteOverride.getSpriteID()); + } } private void overrideWidgetSprites() { - Map widgetOverrides = new HashMap<>(); - for (WidgetOverride widgetOverride : WidgetOverride.values()) { if (widgetOverride.getSkin() == config.skin()) @@ -164,14 +160,22 @@ public class InterfaceStylesPlugin extends Plugin { for (WidgetInfo widgetInfo : widgetOverride.getWidgetInfo()) { - widgetOverrides.put(widgetInfo.getPackedId(), spritePixels); + client.getWidgetSpriteOverrides().put(widgetInfo.getPackedId(), spritePixels); } } } } + } - client.getWidgetSpriteOverrides().clear(); - client.getWidgetSpriteOverrides().putAll(widgetOverrides); + private void restoreWidgetSprites() + { + for (WidgetOverride widgetOverride : WidgetOverride.values()) + { + for (WidgetInfo widgetInfo : widgetOverride.getWidgetInfo()) + { + client.getWidgetSpriteOverrides().remove(widgetInfo.getPackedId()); + } + } } private SpritePixels getFileSpritePixels(String file, String subfolder) @@ -295,8 +299,8 @@ public class InterfaceStylesPlugin extends Plugin private void removeGameframe() { - client.getSpriteOverrides().clear(); - client.getWidgetSpriteOverrides().clear(); + restoreSprites(); + restoreWidgetSprites(); BufferedImage compassImage = spriteManager.getSprite(SpriteID.COMPASS_TEXTURE, 0);