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..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,19 +131,25 @@ public class InterfaceStylesPlugin extends Plugin } else { - overrides.put(spriteOverride.getSpriteID(), spritePixels); + client.getSpriteOverrides().put(spriteOverride.getSpriteID(), spritePixels); } } } } + } - client.setSpriteOverrides(overrides); + private void restoreSprites() + { + client.getWidgetSpriteCache().reset(); + + 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()) @@ -162,13 +160,22 @@ public class InterfaceStylesPlugin extends Plugin { for (WidgetInfo widgetInfo : widgetOverride.getWidgetInfo()) { - widgetOverrides.put(widgetInfo.getPackedId(), spritePixels); + client.getWidgetSpriteOverrides().put(widgetInfo.getPackedId(), spritePixels); } } } } + } - client.setWidgetSpriteOverrides(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) @@ -292,8 +299,8 @@ public class InterfaceStylesPlugin extends Plugin private void removeGameframe() { - client.setSpriteOverrides(null); - client.setWidgetSpriteOverrides(null); + restoreSprites(); + restoreWidgetSprites(); 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);