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 de8123b359..95d51c74f9 100644 --- a/runelite-api/src/main/java/net/runelite/api/Client.java +++ b/runelite-api/src/main/java/net/runelite/api/Client.java @@ -360,6 +360,7 @@ public interface Client extends GameEngine * @param scale the scale of the sprite * @return the created sprite */ + @Nullable SpritePixels createItemSprite(int itemId, int quantity, int border, int shadowColor, int stackable, boolean noted, int scale); /** @@ -370,6 +371,7 @@ public interface Client extends GameEngine * @param fileId the sprites file ID * @return the sprite image of the file */ + @Nullable SpritePixels[] getSprites(IndexDataBase source, int archiveId, int fileId); /** diff --git a/runelite-client/src/main/java/net/runelite/client/callback/ClientThread.java b/runelite-client/src/main/java/net/runelite/client/callback/ClientThread.java index a1e3880a39..ff4e0fa07c 100644 --- a/runelite-client/src/main/java/net/runelite/client/callback/ClientThread.java +++ b/runelite-client/src/main/java/net/runelite/client/callback/ClientThread.java @@ -58,7 +58,7 @@ public class ClientThread { if (client.isClientThread()) { - if (r.getAsBoolean()) + if (!r.getAsBoolean()) { invokes.add(r); } diff --git a/runelite-client/src/main/java/net/runelite/client/game/SpriteManager.java b/runelite-client/src/main/java/net/runelite/client/game/SpriteManager.java index b2fd496d31..3d7271af7f 100644 --- a/runelite-client/src/main/java/net/runelite/client/game/SpriteManager.java +++ b/runelite-client/src/main/java/net/runelite/client/game/SpriteManager.java @@ -41,6 +41,8 @@ import net.runelite.api.Client; import net.runelite.api.GameState; import net.runelite.api.SpritePixels; import net.runelite.client.callback.ClientThread; +import net.runelite.client.ui.overlay.infobox.InfoBox; +import net.runelite.client.ui.overlay.infobox.InfoBoxManager; import net.runelite.client.util.ImageUtil; @Singleton @@ -52,6 +54,9 @@ public class SpriteManager @Inject private ClientThread clientThread; + @Inject + private InfoBoxManager infoBoxManager; + public Cache cache = CacheBuilder.newBuilder() .maximumSize(128L) .expireAfterAccess(1, TimeUnit.HOURS) @@ -74,6 +79,11 @@ public class SpriteManager } SpritePixels[] sp = client.getSprites(client.getIndexSprites(), archive, 0); + if (sp == null) + { + return null; + } + BufferedImage img = sp[file].toBufferedImage(); cache.put(key, img); @@ -102,6 +112,15 @@ public class SpriteManager }); } + public void getSpriteAsync(int archive, int file, InfoBox infoBox) + { + getSpriteAsync(archive, file, img -> + { + infoBox.setImage(img); + infoBoxManager.updateInfoBoxImage(infoBox); + }); + } + /** * Calls setIcon on c, ensuring it is repainted when this changes */ diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/barrows/BarrowsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/barrows/BarrowsPlugin.java index 30ecefb885..68b726908b 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/barrows/BarrowsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/barrows/BarrowsPlugin.java @@ -322,10 +322,12 @@ public class BarrowsPlugin extends Plugin final LoopTimer loopTimer = new LoopTimer( PRAYER_DRAIN_INTERVAL_MS, ChronoUnit.MILLIS, - spriteManager.getSprite(SpriteID.TAB_PRAYER, 0), + null, this, true); + spriteManager.getSpriteAsync(SpriteID.TAB_PRAYER, 0, loopTimer); + loopTimer.setPriority(InfoBoxPriority.MED); loopTimer.setTooltip("Prayer Drain"); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cooking/FermentTimer.java b/runelite-client/src/main/java/net/runelite/client/plugins/cooking/FermentTimer.java index 5312414ad1..84d7033f57 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cooking/FermentTimer.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cooking/FermentTimer.java @@ -25,7 +25,7 @@ package net.runelite.client.plugins.cooking; import java.awt.Color; -import java.awt.Image; +import java.awt.image.BufferedImage; import java.time.Duration; import java.time.Instant; import net.runelite.client.plugins.Plugin; @@ -37,7 +37,7 @@ final class FermentTimer extends InfoBox private Instant fermentTime; - FermentTimer(Image image, Plugin plugin) + FermentTimer(BufferedImage image, Plugin plugin) { super(image, plugin); reset(); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/instancemap/InstanceMapOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/instancemap/InstanceMapOverlay.java index 3e44e6d4b8..6a3492a425 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/instancemap/InstanceMapOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/instancemap/InstanceMapOverlay.java @@ -29,6 +29,7 @@ import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.image.BufferedImage; +import javax.annotation.Nullable; import javax.inject.Inject; import javax.inject.Singleton; import lombok.Getter; @@ -87,8 +88,10 @@ class InstanceMapOverlay extends Overlay @Setter private boolean isCloseButtonHovered; + @Getter private Rectangle closeButtonBounds; + private BufferedImage closeButtonImage; private BufferedImage closeButtonHoveredImage; @@ -166,8 +169,6 @@ class InstanceMapOverlay extends Overlay if (image == null) { - BufferedImage closeButton = getCloseButtonImage(); - SpritePixels map = client.drawInstanceMap(viewedPlane); image = minimapToBufferedImage(map); synchronized (this) @@ -177,7 +178,12 @@ class InstanceMapOverlay extends Overlay mapImage = image; } } + } + BufferedImage closeButton = getCloseButtonImage(); + BufferedImage closeButtonHover = getCloseButtonHoveredImage(); + if (closeButton != null && closeButtonBounds == null) + { closeButtonBounds = new Rectangle(image.getWidth() - closeButton.getWidth() - 5, 6, closeButton.getWidth(), closeButton.getHeight()); } @@ -191,8 +197,15 @@ class InstanceMapOverlay extends Overlay drawPlayerDot(graphics, client.getLocalPlayer(), Color.white, Color.black); } - graphics.drawImage(isCloseButtonHovered ? getCloseButtonHoveredImage() : getCloseButtonImage(), - (int) closeButtonBounds.getX(), (int) closeButtonBounds.getY(), null); + if (isCloseButtonHovered) + { + closeButton = closeButtonHover; + } + + if (closeButton != null) + { + graphics.drawImage(closeButton, (int) closeButtonBounds.getX(), (int) closeButtonBounds.getY(), null); + } return new Dimension(image.getWidth(), image.getHeight()); } @@ -252,6 +265,7 @@ class InstanceMapOverlay extends Overlay return img; } + @Nullable private BufferedImage getCloseButtonImage() { if (closeButtonImage == null) @@ -261,6 +275,7 @@ class InstanceMapOverlay extends Overlay return closeButtonImage; } + @Nullable private BufferedImage getCloseButtonHoveredImage() { if (closeButtonHoveredImage == null) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/PuzzleSolverOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/PuzzleSolverOverlay.java index 67c821d841..cd6e983a6f 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/PuzzleSolverOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/PuzzleSolverOverlay.java @@ -299,6 +299,11 @@ public class PuzzleSolverOverlay extends Overlay arrow = getUpArrow(); } + if (arrow == null) + { + continue; + } + int x = puzzleBoxLocation.getX() + blankX * PUZZLE_TILE_SIZE + PUZZLE_TILE_SIZE / 2 - arrow.getWidth() / 2; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPlugin.java index 34db989c71..ff668a1472 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPlugin.java @@ -193,7 +193,8 @@ public class RaidsPlugin extends Plugin if (config.raidsTimer() && message.startsWith(RAID_START_MESSAGE)) { - timer = new RaidsTimer(spriteManager.getSprite(TAB_QUESTS_BROWN_RAIDING_PARTY, 0), this, Instant.now()); + timer = new RaidsTimer(this, Instant.now()); + spriteManager.getSpriteAsync(TAB_QUESTS_BROWN_RAIDING_PARTY, 0, timer); infoBoxManager.addInfoBox(timer); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsTimer.java b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsTimer.java index 8df3087054..09c3beb722 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsTimer.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsTimer.java @@ -25,7 +25,6 @@ package net.runelite.client.plugins.raids; import java.awt.Color; -import java.awt.image.BufferedImage; import java.time.Duration; import java.time.Instant; import java.time.LocalTime; @@ -47,9 +46,9 @@ public class RaidsTimer extends InfoBox @Setter private boolean stopped; - public RaidsTimer(BufferedImage image, Plugin plugin, Instant startTime) + public RaidsTimer(Plugin plugin, Instant startTime) { - super(image, plugin); + super(null, plugin); this.startTime = startTime; floorTime = startTime; stopped = false; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java index 19b7a50962..9b19f8bf26 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java @@ -64,7 +64,6 @@ import net.runelite.api.Point; import net.runelite.api.SpriteID; import net.runelite.api.WorldType; import net.runelite.api.events.ChatMessage; -import net.runelite.api.events.GameStateChanged; import net.runelite.api.events.GameTick; import net.runelite.api.events.LocalPlayerDeath; import net.runelite.api.events.WidgetLoaded; @@ -235,6 +234,8 @@ public class ScreenshotPlugin extends Plugin .build(); clientToolbar.addNavigation(titleBarButton); + + spriteManager.getSpriteAsync(SpriteID.CHATBOX_REPORT_BUTTON, 0, s -> reportButton = s); } @Override @@ -245,16 +246,6 @@ public class ScreenshotPlugin extends Plugin keyManager.unregisterKeyListener(hotkeyListener); } - @Subscribe - public void onGameStateChanged(GameStateChanged event) - { - if (event.getGameState() == GameState.LOGGED_IN - && reportButton == null) - { - reportButton = spriteManager.getSprite(SpriteID.CHATBOX_REPORT_BUTTON, 0); - } - } - @Subscribe public void onGameTick(GameTick event) { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/StatusBarsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/StatusBarsOverlay.java index e92251bec0..529fa250a4 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/StatusBarsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/StatusBarsOverlay.java @@ -27,7 +27,7 @@ package net.runelite.client.plugins.statusbars; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; -import java.awt.Image; +import java.awt.image.BufferedImage; import javax.inject.Inject; import net.runelite.api.Client; import net.runelite.api.MenuEntry; @@ -83,7 +83,7 @@ class StatusBarsOverlay extends Overlay private final TextComponent textComponent = new TextComponent(); private final ItemStatChangesService itemStatService; - private final Image prayerImage; + private final BufferedImage prayerImage; @Inject private StatusBarsOverlay(Client client, StatusBarsConfig config, SkillIconManager skillIconManager, ItemStatChangesService itemstatservice) @@ -225,7 +225,7 @@ class StatusBarsOverlay extends Overlay if (config.enableSkillIcon() || config.enableCounter()) { - final Image healthImage = skillIconManager.getSkillImage(Skill.HITPOINTS, true); + final BufferedImage healthImage = skillIconManager.getSkillImage(Skill.HITPOINTS, true); final int counterHealth = client.getBoostedSkillLevel(Skill.HITPOINTS); final int counterPrayer = client.getBoostedSkillLevel(Skill.PRAYER); final String counterHealthText = Integer.toString(counterHealth); @@ -294,7 +294,7 @@ class StatusBarsOverlay extends Overlay return (int) Math.round(ratio * size); } - private void renderIconsAndCounters(Graphics2D graphics, int x, int y, Image image, String counterText, int counterPadding) + private void renderIconsAndCounters(Graphics2D graphics, int x, int y, BufferedImage image, String counterText, int counterPadding) { final int widthOfCounter = graphics.getFontMetrics().stringWidth(counterText); final int centerText = (WIDTH - PADDING) / 2 - (widthOfCounter / 2); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/timers/GameIndicator.java b/runelite-client/src/main/java/net/runelite/client/plugins/timers/GameIndicator.java index b91f8c7080..55151e340f 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/timers/GameIndicator.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timers/GameIndicator.java @@ -25,22 +25,17 @@ package net.runelite.client.plugins.timers; import java.awt.Color; -import java.awt.image.BufferedImage; import lombok.AccessLevel; import lombok.Getter; import net.runelite.api.SpriteID; -import net.runelite.client.game.ItemManager; -import net.runelite.client.game.SpriteManager; +@Getter(AccessLevel.PACKAGE) enum GameIndicator { VENGEANCE_ACTIVE(SpriteID.SPELL_VENGEANCE_OTHER, GameTimerImageType.SPRITE, "Vengeance active"); - @Getter(AccessLevel.PACKAGE) private final String description; - @Getter(AccessLevel.PACKAGE) private String text; - @Getter(AccessLevel.PACKAGE) private Color textColor; private final int imageId; private final GameTimerImageType imageType; @@ -58,17 +53,4 @@ enum GameIndicator { this(imageId, idType, description, "", null); } - - BufferedImage getImage(ItemManager itemManager, SpriteManager spriteManager) - { - switch (imageType) - { - case ITEM: - return itemManager.getImage(imageId); - case SPRITE: - return spriteManager.getSprite(imageId, 0); - default: - return null; - } - } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/timers/GameTimer.java b/runelite-client/src/main/java/net/runelite/client/plugins/timers/GameTimer.java index 40a6c97ecb..f29915740f 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/timers/GameTimer.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timers/GameTimer.java @@ -26,16 +26,15 @@ */ package net.runelite.client.plugins.timers; -import java.awt.image.BufferedImage; import java.time.Duration; import java.time.temporal.ChronoUnit; +import lombok.AccessLevel; import lombok.Getter; import net.runelite.api.GraphicID; import net.runelite.api.ItemID; import net.runelite.api.SpriteID; -import net.runelite.client.game.ItemManager; -import net.runelite.client.game.SpriteManager; +@Getter(AccessLevel.PACKAGE) enum GameTimer { STAMINA(ItemID.STAMINA_POTION4, GameTimerImageType.ITEM, "Stamina", 2, ChronoUnit.MINUTES, true), @@ -81,15 +80,10 @@ enum GameTimer MINIGAME_TELEPORT(SpriteID.TAB_QUESTS_RED_MINIGAMES, GameTimerImageType.SPRITE, "Minigame Teleport", 20, ChronoUnit.MINUTES), DRAGON_FIRE_SHIELD(ItemID.DRAGONFIRE_SHIELD_11284, GameTimerImageType.ITEM, "Dragonfire Shield Special", 2, ChronoUnit.MINUTES); - @Getter private final Duration duration; - @Getter private final Integer graphicId; - @Getter private final String description; - @Getter private final boolean removedOnDeath; - @Getter private final Duration initialDelay; private final int imageId; private final GameTimerImageType imageType; @@ -129,17 +123,4 @@ enum GameTimer { this(imageId, idType, description, null, time, unit, delay, false); } - - BufferedImage getImage(ItemManager itemManager, SpriteManager spriteManager) - { - switch (imageType) - { - case ITEM: - return itemManager.getImage(imageId); - case SPRITE: - return spriteManager.getSprite(imageId, 0); - default: - return null; - } - } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/timers/IndicatorIndicator.java b/runelite-client/src/main/java/net/runelite/client/plugins/timers/IndicatorIndicator.java index 9af1716f4d..03990ce5ed 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/timers/IndicatorIndicator.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timers/IndicatorIndicator.java @@ -25,7 +25,6 @@ package net.runelite.client.plugins.timers; import java.awt.Color; -import java.awt.Image; import lombok.Getter; import net.runelite.client.plugins.Plugin; import net.runelite.client.ui.overlay.infobox.InfoBox; @@ -36,9 +35,9 @@ public class IndicatorIndicator extends InfoBox @Getter private final GameIndicator indicator; - IndicatorIndicator(GameIndicator indicator, Image image, Plugin plugin) + IndicatorIndicator(GameIndicator indicator, Plugin plugin) { - super(image, plugin); + super(null, plugin); this.indicator = indicator; setPriority(InfoBoxPriority.MED); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/timers/TimerTimer.java b/runelite-client/src/main/java/net/runelite/client/plugins/timers/TimerTimer.java index 8e1fd3c9d4..2a30f1ca9c 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/timers/TimerTimer.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timers/TimerTimer.java @@ -24,7 +24,6 @@ */ package net.runelite.client.plugins.timers; -import java.awt.image.BufferedImage; import java.time.Duration; import java.time.Instant; import java.time.temporal.ChronoUnit; @@ -36,9 +35,9 @@ class TimerTimer extends Timer { private final GameTimer timer; - TimerTimer(GameTimer timer, Plugin plugin, BufferedImage image) + TimerTimer(GameTimer timer, Plugin plugin) { - super(timer.getDuration().toMillis(), ChronoUnit.MILLIS, image, plugin); + super(timer.getDuration().toMillis(), ChronoUnit.MILLIS, null, plugin); this.timer = timer; setPriority(InfoBoxPriority.MED); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/timers/TimersPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/timers/TimersPlugin.java index a1b2a04f1c..9b6b879dd9 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/timers/TimersPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timers/TimersPlugin.java @@ -26,7 +26,6 @@ package net.runelite.client.plugins.timers; import com.google.inject.Provides; -import java.awt.image.BufferedImage; import java.util.regex.Pattern; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; @@ -866,8 +865,16 @@ public class TimersPlugin extends Plugin { removeGameTimer(timer); - BufferedImage image = timer.getImage(itemManager, spriteManager); - TimerTimer t = new TimerTimer(timer, this, image); + TimerTimer t = new TimerTimer(timer, this); + switch (timer.getImageType()) + { + case SPRITE: + spriteManager.getSpriteAsync(timer.getImageId(), 0, t); + break; + case ITEM: + t.setImage(itemManager.getImage(timer.getImageId())); + break; + } t.setTooltip(timer.getDescription()); infoBoxManager.addInfoBox(t); return t; @@ -882,8 +889,16 @@ public class TimersPlugin extends Plugin { removeGameIndicator(gameIndicator); - BufferedImage image = gameIndicator.getImage(itemManager, spriteManager); - IndicatorIndicator indicator = new IndicatorIndicator(gameIndicator, image, this); + IndicatorIndicator indicator = new IndicatorIndicator(gameIndicator, this); + switch (gameIndicator.getImageType()) + { + case SPRITE: + spriteManager.getSpriteAsync(gameIndicator.getImageId(), 0, indicator); + break; + case ITEM: + indicator.setImage(itemManager.getImage(gameIndicator.getImageId())); + break; + } indicator.setTooltip(gameIndicator.getDescription()); infoBoxManager.addInfoBox(indicator); diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/InfoBoxComponent.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/InfoBoxComponent.java index d8f7841099..a72d13f73d 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/InfoBoxComponent.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/InfoBoxComponent.java @@ -29,9 +29,9 @@ import java.awt.Color; import java.awt.Dimension; import java.awt.FontMetrics; import java.awt.Graphics2D; -import java.awt.Image; import java.awt.Point; import java.awt.Rectangle; +import java.awt.image.BufferedImage; import lombok.Getter; import lombok.Setter; import net.runelite.client.ui.FontManager; @@ -53,7 +53,7 @@ public class InfoBoxComponent implements LayoutableRenderableEntity private String text; private Color color = Color.WHITE; private Color backgroundColor = ComponentConstants.STANDARD_BACKGROUND_COLOR; - private Image image; + private BufferedImage image; @Override public Dimension render(Graphics2D graphics) diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBox.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBox.java index 8c2889e8e6..fab945c11b 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBox.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBox.java @@ -25,7 +25,7 @@ package net.runelite.client.ui.overlay.infobox; import java.awt.Color; -import java.awt.Image; +import java.awt.image.BufferedImage; import lombok.AccessLevel; import lombok.Getter; import lombok.Setter; @@ -38,11 +38,11 @@ public abstract class InfoBox @Getter @Setter - private Image image; + private BufferedImage image; @Getter(AccessLevel.PACKAGE) @Setter(AccessLevel.PACKAGE) - private Image scaledImage; + private BufferedImage scaledImage; @Getter(AccessLevel.PACKAGE) @Setter @@ -52,7 +52,7 @@ public abstract class InfoBox @Setter private String tooltip; - public InfoBox(Image image, Plugin plugin) + public InfoBox(BufferedImage image, Plugin plugin) { this.plugin = plugin; setImage(image); diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBoxManager.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBoxManager.java index 4fd1c1ca11..228441a901 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBoxManager.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBoxManager.java @@ -27,7 +27,6 @@ package net.runelite.client.ui.overlay.infobox; import com.google.common.base.Preconditions; import com.google.common.collect.ComparisonChain; import java.awt.Graphics; -import java.awt.Image; import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.Collections; @@ -40,6 +39,7 @@ import lombok.extern.slf4j.Slf4j; import net.runelite.api.events.ConfigChanged; import net.runelite.client.config.RuneLiteConfig; import net.runelite.client.eventbus.Subscribe; +import net.runelite.client.game.AsyncBufferedImage; import net.runelite.client.plugins.PluginDescriptor; @Singleton @@ -72,6 +72,14 @@ public class InfoBoxManager updateInfoBoxImage(infoBox); infoBoxes.add(infoBox); refreshInfoBoxes(); + + BufferedImage image = infoBox.getImage(); + + if (image instanceof AsyncBufferedImage) + { + AsyncBufferedImage abi = (AsyncBufferedImage) image; + abi.onChanged(() -> updateInfoBoxImage(infoBox)); + } } public void removeInfoBox(InfoBox infoBox) @@ -118,7 +126,7 @@ public class InfoBoxManager } } - private void updateInfoBoxImage(final InfoBox infoBox) + public void updateInfoBoxImage(final InfoBox infoBox) { if (infoBox.getImage() == null) { @@ -126,8 +134,8 @@ public class InfoBoxManager } // Set scaled InfoBox image - final Image image = infoBox.getImage(); - Image resultImage = image; + final BufferedImage image = infoBox.getImage(); + BufferedImage resultImage = image; final double width = image.getWidth(null); final double height = image.getHeight(null); final double size = Math.max(2, runeLiteConfig.infoBoxSize()); // Limit size to 2 as that is minimum size not causing breakage