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 14f3ff5cb8..de8123b359 100644 --- a/runelite-api/src/main/java/net/runelite/api/Client.java +++ b/runelite-api/src/main/java/net/runelite/api/Client.java @@ -1632,6 +1632,11 @@ public interface Client extends GameEngine */ NodeCache getItemCompositionCache(); + /** + * Returns the array of cross sprites that appear and animate when left-clicking + */ + SpritePixels[] getCrossSprites(); + EnumComposition getEnum(int id); void draw2010Menu(); 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 540186558c..3f64778e52 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 @@ -62,4 +62,14 @@ public interface InterfaceStylesConfig extends Config { return false; } + + @ConfigItem( + keyName = "rsCrossSprites", + name = "RuneScape cross sprites", + description = "Replaces left-click cross sprites with the ones in RuneScape" + ) + default boolean rsCrossSprites() + { + 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 cdadf60320..c635eb9bd5 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,11 +31,13 @@ import java.awt.image.BufferedImage; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; import net.runelite.api.Client; +import net.runelite.api.GameState; import net.runelite.api.HealthBar; import net.runelite.api.SpriteID; import net.runelite.api.SpritePixels; import net.runelite.api.events.BeforeMenuRender; import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.GameStateChanged; import net.runelite.api.events.PostHealthBar; import net.runelite.api.events.WidgetPositioned; import net.runelite.api.widgets.Widget; @@ -69,6 +71,8 @@ public class InterfaceStylesPlugin extends Plugin @Inject private SpriteManager spriteManager; + private SpritePixels[] defaultCrossSprites; + @Provides InterfaceStylesConfig provideConfig(ConfigManager configManager) { @@ -89,6 +93,7 @@ public class InterfaceStylesPlugin extends Plugin restoreWidgetDimensions(); removeGameframe(); restoreHealthBars(); + restoreCrossSprites(); }); } @@ -126,6 +131,22 @@ public class InterfaceStylesPlugin extends Plugin } } + @Subscribe + public void onGameStateChanged(GameStateChanged gameStateChanged) + { + if (gameStateChanged.getGameState() != GameState.LOGIN_SCREEN) + { + return; + } + + /* + * The cross sprites aren't loaded yet when the initial config change event is received. + * So run the overriding for cross sprites when we reach the login screen, + * at which point the cross sprites will have been loaded. + */ + overrideCrossSprites(); + } + private void updateAllOverrides() { removeGameframe(); @@ -134,6 +155,7 @@ public class InterfaceStylesPlugin extends Plugin restoreWidgetDimensions(); adjustWidgetDimensions(); overrideHealthBars(); + overrideCrossSprites(); } @Subscribe @@ -283,6 +305,62 @@ public class InterfaceStylesPlugin extends Plugin clientThread.invokeLater(client::resetHealthBarCaches); } + private void overrideCrossSprites() + { + if (config.rsCrossSprites()) + { + // If we've already replaced them, + // we don't need to replace them again + if (defaultCrossSprites != null) + { + return; + } + + SpritePixels[] crossSprites = client.getCrossSprites(); + + if (crossSprites == null) + { + return; + } + + defaultCrossSprites = new SpritePixels[crossSprites.length]; + System.arraycopy(crossSprites, 0, defaultCrossSprites, 0, defaultCrossSprites.length); + + for (int i = 0; i < crossSprites.length; i++) + { + SpritePixels newSprite = getFileSpritePixels("rs3/cross_sprites/" + i + ".png"); + + if (newSprite == null) + { + continue; + } + + crossSprites[i] = newSprite; + } + } + else + { + restoreCrossSprites(); + } + } + + private void restoreCrossSprites() + { + if (defaultCrossSprites == null) + { + return; + } + + SpritePixels[] crossSprites = client.getCrossSprites(); + + if (crossSprites != null && defaultCrossSprites.length == crossSprites.length) + { + System.arraycopy(defaultCrossSprites, 0, crossSprites, 0, defaultCrossSprites.length); + } + + defaultCrossSprites = null; + } + private void restoreWidgetDimensions() { for (WidgetOffset widgetOffset : WidgetOffset.values()) diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/0.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/0.png new file mode 100644 index 0000000000..b817c474c0 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/0.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/1.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/1.png new file mode 100644 index 0000000000..a6add2616d Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/1.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/2.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/2.png new file mode 100644 index 0000000000..015b85e5a0 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/2.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/3.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/3.png new file mode 100644 index 0000000000..e62c91b16c Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/3.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/4.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/4.png new file mode 100644 index 0000000000..695cc03088 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/4.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/5.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/5.png new file mode 100644 index 0000000000..f69f4eb430 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/5.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/6.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/6.png new file mode 100644 index 0000000000..0d156b6a17 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/6.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/7.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/7.png new file mode 100644 index 0000000000..c17114ae82 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/7.png differ 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 a620f4d539..e4833e1830 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 @@ -1009,4 +1009,8 @@ public interface RSClient extends RSGameEngine, Client @Import("viewportWalking") void setViewportWalking(boolean viewportWalking); + + @Import("crossSprites") + @Override + RSSpritePixels[] getCrossSprites(); }