Merge pull request #9275 from abextm/empty-cache-firsttime
runelite-client: Handle startup with an empty cache better
This commit is contained in:
@@ -360,6 +360,7 @@ public interface Client extends GameEngine
|
|||||||
* @param scale the scale of the sprite
|
* @param scale the scale of the sprite
|
||||||
* @return the created sprite
|
* @return the created sprite
|
||||||
*/
|
*/
|
||||||
|
@Nullable
|
||||||
SpritePixels createItemSprite(int itemId, int quantity, int border, int shadowColor, int stackable, boolean noted, int scale);
|
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
|
* @param fileId the sprites file ID
|
||||||
* @return the sprite image of the file
|
* @return the sprite image of the file
|
||||||
*/
|
*/
|
||||||
|
@Nullable
|
||||||
SpritePixels[] getSprites(IndexDataBase source, int archiveId, int fileId);
|
SpritePixels[] getSprites(IndexDataBase source, int archiveId, int fileId);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ public class ClientThread
|
|||||||
{
|
{
|
||||||
if (client.isClientThread())
|
if (client.isClientThread())
|
||||||
{
|
{
|
||||||
if (r.getAsBoolean())
|
if (!r.getAsBoolean())
|
||||||
{
|
{
|
||||||
invokes.add(r);
|
invokes.add(r);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,6 +41,8 @@ import net.runelite.api.Client;
|
|||||||
import net.runelite.api.GameState;
|
import net.runelite.api.GameState;
|
||||||
import net.runelite.api.SpritePixels;
|
import net.runelite.api.SpritePixels;
|
||||||
import net.runelite.client.callback.ClientThread;
|
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;
|
import net.runelite.client.util.ImageUtil;
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
@@ -52,6 +54,9 @@ public class SpriteManager
|
|||||||
@Inject
|
@Inject
|
||||||
private ClientThread clientThread;
|
private ClientThread clientThread;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private InfoBoxManager infoBoxManager;
|
||||||
|
|
||||||
public Cache<Long, BufferedImage> cache = CacheBuilder.newBuilder()
|
public Cache<Long, BufferedImage> cache = CacheBuilder.newBuilder()
|
||||||
.maximumSize(128L)
|
.maximumSize(128L)
|
||||||
.expireAfterAccess(1, TimeUnit.HOURS)
|
.expireAfterAccess(1, TimeUnit.HOURS)
|
||||||
@@ -74,6 +79,11 @@ public class SpriteManager
|
|||||||
}
|
}
|
||||||
|
|
||||||
SpritePixels[] sp = client.getSprites(client.getIndexSprites(), archive, 0);
|
SpritePixels[] sp = client.getSprites(client.getIndexSprites(), archive, 0);
|
||||||
|
if (sp == null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
BufferedImage img = sp[file].toBufferedImage();
|
BufferedImage img = sp[file].toBufferedImage();
|
||||||
|
|
||||||
cache.put(key, img);
|
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
|
* Calls setIcon on c, ensuring it is repainted when this changes
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -322,10 +322,12 @@ public class BarrowsPlugin extends Plugin
|
|||||||
final LoopTimer loopTimer = new LoopTimer(
|
final LoopTimer loopTimer = new LoopTimer(
|
||||||
PRAYER_DRAIN_INTERVAL_MS,
|
PRAYER_DRAIN_INTERVAL_MS,
|
||||||
ChronoUnit.MILLIS,
|
ChronoUnit.MILLIS,
|
||||||
spriteManager.getSprite(SpriteID.TAB_PRAYER, 0),
|
null,
|
||||||
this,
|
this,
|
||||||
true);
|
true);
|
||||||
|
|
||||||
|
spriteManager.getSpriteAsync(SpriteID.TAB_PRAYER, 0, loopTimer);
|
||||||
|
|
||||||
loopTimer.setPriority(InfoBoxPriority.MED);
|
loopTimer.setPriority(InfoBoxPriority.MED);
|
||||||
loopTimer.setTooltip("Prayer Drain");
|
loopTimer.setTooltip("Prayer Drain");
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
package net.runelite.client.plugins.cooking;
|
package net.runelite.client.plugins.cooking;
|
||||||
|
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
import java.awt.Image;
|
import java.awt.image.BufferedImage;
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import net.runelite.client.plugins.Plugin;
|
import net.runelite.client.plugins.Plugin;
|
||||||
@@ -37,7 +37,7 @@ final class FermentTimer extends InfoBox
|
|||||||
|
|
||||||
private Instant fermentTime;
|
private Instant fermentTime;
|
||||||
|
|
||||||
FermentTimer(Image image, Plugin plugin)
|
FermentTimer(BufferedImage image, Plugin plugin)
|
||||||
{
|
{
|
||||||
super(image, plugin);
|
super(image, plugin);
|
||||||
reset();
|
reset();
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ import java.awt.Dimension;
|
|||||||
import java.awt.Graphics2D;
|
import java.awt.Graphics2D;
|
||||||
import java.awt.Rectangle;
|
import java.awt.Rectangle;
|
||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
|
import javax.annotation.Nullable;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
@@ -87,8 +88,10 @@ class InstanceMapOverlay extends Overlay
|
|||||||
|
|
||||||
@Setter
|
@Setter
|
||||||
private boolean isCloseButtonHovered;
|
private boolean isCloseButtonHovered;
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
private Rectangle closeButtonBounds;
|
private Rectangle closeButtonBounds;
|
||||||
|
|
||||||
private BufferedImage closeButtonImage;
|
private BufferedImage closeButtonImage;
|
||||||
private BufferedImage closeButtonHoveredImage;
|
private BufferedImage closeButtonHoveredImage;
|
||||||
|
|
||||||
@@ -166,8 +169,6 @@ class InstanceMapOverlay extends Overlay
|
|||||||
|
|
||||||
if (image == null)
|
if (image == null)
|
||||||
{
|
{
|
||||||
BufferedImage closeButton = getCloseButtonImage();
|
|
||||||
|
|
||||||
SpritePixels map = client.drawInstanceMap(viewedPlane);
|
SpritePixels map = client.drawInstanceMap(viewedPlane);
|
||||||
image = minimapToBufferedImage(map);
|
image = minimapToBufferedImage(map);
|
||||||
synchronized (this)
|
synchronized (this)
|
||||||
@@ -177,7 +178,12 @@ class InstanceMapOverlay extends Overlay
|
|||||||
mapImage = image;
|
mapImage = image;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BufferedImage closeButton = getCloseButtonImage();
|
||||||
|
BufferedImage closeButtonHover = getCloseButtonHoveredImage();
|
||||||
|
if (closeButton != null && closeButtonBounds == null)
|
||||||
|
{
|
||||||
closeButtonBounds = new Rectangle(image.getWidth() - closeButton.getWidth() - 5, 6,
|
closeButtonBounds = new Rectangle(image.getWidth() - closeButton.getWidth() - 5, 6,
|
||||||
closeButton.getWidth(), closeButton.getHeight());
|
closeButton.getWidth(), closeButton.getHeight());
|
||||||
}
|
}
|
||||||
@@ -191,8 +197,15 @@ class InstanceMapOverlay extends Overlay
|
|||||||
drawPlayerDot(graphics, client.getLocalPlayer(), Color.white, Color.black);
|
drawPlayerDot(graphics, client.getLocalPlayer(), Color.white, Color.black);
|
||||||
}
|
}
|
||||||
|
|
||||||
graphics.drawImage(isCloseButtonHovered ? getCloseButtonHoveredImage() : getCloseButtonImage(),
|
if (isCloseButtonHovered)
|
||||||
(int) closeButtonBounds.getX(), (int) closeButtonBounds.getY(), null);
|
{
|
||||||
|
closeButton = closeButtonHover;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (closeButton != null)
|
||||||
|
{
|
||||||
|
graphics.drawImage(closeButton, (int) closeButtonBounds.getX(), (int) closeButtonBounds.getY(), null);
|
||||||
|
}
|
||||||
|
|
||||||
return new Dimension(image.getWidth(), image.getHeight());
|
return new Dimension(image.getWidth(), image.getHeight());
|
||||||
}
|
}
|
||||||
@@ -252,6 +265,7 @@ class InstanceMapOverlay extends Overlay
|
|||||||
return img;
|
return img;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
private BufferedImage getCloseButtonImage()
|
private BufferedImage getCloseButtonImage()
|
||||||
{
|
{
|
||||||
if (closeButtonImage == null)
|
if (closeButtonImage == null)
|
||||||
@@ -261,6 +275,7 @@ class InstanceMapOverlay extends Overlay
|
|||||||
return closeButtonImage;
|
return closeButtonImage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
private BufferedImage getCloseButtonHoveredImage()
|
private BufferedImage getCloseButtonHoveredImage()
|
||||||
{
|
{
|
||||||
if (closeButtonHoveredImage == null)
|
if (closeButtonHoveredImage == null)
|
||||||
|
|||||||
@@ -299,6 +299,11 @@ public class PuzzleSolverOverlay extends Overlay
|
|||||||
arrow = getUpArrow();
|
arrow = getUpArrow();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (arrow == null)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
int x = puzzleBoxLocation.getX() + blankX * PUZZLE_TILE_SIZE
|
int x = puzzleBoxLocation.getX() + blankX * PUZZLE_TILE_SIZE
|
||||||
+ PUZZLE_TILE_SIZE / 2 - arrow.getWidth() / 2;
|
+ PUZZLE_TILE_SIZE / 2 - arrow.getWidth() / 2;
|
||||||
|
|
||||||
|
|||||||
@@ -193,7 +193,8 @@ public class RaidsPlugin extends Plugin
|
|||||||
|
|
||||||
if (config.raidsTimer() && message.startsWith(RAID_START_MESSAGE))
|
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);
|
infoBoxManager.addInfoBox(timer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,6 @@
|
|||||||
package net.runelite.client.plugins.raids;
|
package net.runelite.client.plugins.raids;
|
||||||
|
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
import java.awt.image.BufferedImage;
|
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.time.LocalTime;
|
import java.time.LocalTime;
|
||||||
@@ -47,9 +46,9 @@ public class RaidsTimer extends InfoBox
|
|||||||
@Setter
|
@Setter
|
||||||
private boolean stopped;
|
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;
|
this.startTime = startTime;
|
||||||
floorTime = startTime;
|
floorTime = startTime;
|
||||||
stopped = false;
|
stopped = false;
|
||||||
|
|||||||
@@ -64,7 +64,6 @@ import net.runelite.api.Point;
|
|||||||
import net.runelite.api.SpriteID;
|
import net.runelite.api.SpriteID;
|
||||||
import net.runelite.api.WorldType;
|
import net.runelite.api.WorldType;
|
||||||
import net.runelite.api.events.ChatMessage;
|
import net.runelite.api.events.ChatMessage;
|
||||||
import net.runelite.api.events.GameStateChanged;
|
|
||||||
import net.runelite.api.events.GameTick;
|
import net.runelite.api.events.GameTick;
|
||||||
import net.runelite.api.events.LocalPlayerDeath;
|
import net.runelite.api.events.LocalPlayerDeath;
|
||||||
import net.runelite.api.events.WidgetLoaded;
|
import net.runelite.api.events.WidgetLoaded;
|
||||||
@@ -235,6 +234,8 @@ public class ScreenshotPlugin extends Plugin
|
|||||||
.build();
|
.build();
|
||||||
|
|
||||||
clientToolbar.addNavigation(titleBarButton);
|
clientToolbar.addNavigation(titleBarButton);
|
||||||
|
|
||||||
|
spriteManager.getSpriteAsync(SpriteID.CHATBOX_REPORT_BUTTON, 0, s -> reportButton = s);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -245,16 +246,6 @@ public class ScreenshotPlugin extends Plugin
|
|||||||
keyManager.unregisterKeyListener(hotkeyListener);
|
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
|
@Subscribe
|
||||||
public void onGameTick(GameTick event)
|
public void onGameTick(GameTick event)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ package net.runelite.client.plugins.statusbars;
|
|||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
import java.awt.Dimension;
|
import java.awt.Dimension;
|
||||||
import java.awt.Graphics2D;
|
import java.awt.Graphics2D;
|
||||||
import java.awt.Image;
|
import java.awt.image.BufferedImage;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import net.runelite.api.Client;
|
import net.runelite.api.Client;
|
||||||
import net.runelite.api.MenuEntry;
|
import net.runelite.api.MenuEntry;
|
||||||
@@ -83,7 +83,7 @@ class StatusBarsOverlay extends Overlay
|
|||||||
private final TextComponent textComponent = new TextComponent();
|
private final TextComponent textComponent = new TextComponent();
|
||||||
private final ItemStatChangesService itemStatService;
|
private final ItemStatChangesService itemStatService;
|
||||||
|
|
||||||
private final Image prayerImage;
|
private final BufferedImage prayerImage;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
private StatusBarsOverlay(Client client, StatusBarsConfig config, SkillIconManager skillIconManager, ItemStatChangesService itemstatservice)
|
private StatusBarsOverlay(Client client, StatusBarsConfig config, SkillIconManager skillIconManager, ItemStatChangesService itemstatservice)
|
||||||
@@ -225,7 +225,7 @@ class StatusBarsOverlay extends Overlay
|
|||||||
|
|
||||||
if (config.enableSkillIcon() || config.enableCounter())
|
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 counterHealth = client.getBoostedSkillLevel(Skill.HITPOINTS);
|
||||||
final int counterPrayer = client.getBoostedSkillLevel(Skill.PRAYER);
|
final int counterPrayer = client.getBoostedSkillLevel(Skill.PRAYER);
|
||||||
final String counterHealthText = Integer.toString(counterHealth);
|
final String counterHealthText = Integer.toString(counterHealth);
|
||||||
@@ -294,7 +294,7 @@ class StatusBarsOverlay extends Overlay
|
|||||||
return (int) Math.round(ratio * size);
|
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 widthOfCounter = graphics.getFontMetrics().stringWidth(counterText);
|
||||||
final int centerText = (WIDTH - PADDING) / 2 - (widthOfCounter / 2);
|
final int centerText = (WIDTH - PADDING) / 2 - (widthOfCounter / 2);
|
||||||
|
|||||||
@@ -25,22 +25,17 @@
|
|||||||
package net.runelite.client.plugins.timers;
|
package net.runelite.client.plugins.timers;
|
||||||
|
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
import java.awt.image.BufferedImage;
|
|
||||||
import lombok.AccessLevel;
|
import lombok.AccessLevel;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import net.runelite.api.SpriteID;
|
import net.runelite.api.SpriteID;
|
||||||
import net.runelite.client.game.ItemManager;
|
|
||||||
import net.runelite.client.game.SpriteManager;
|
|
||||||
|
|
||||||
|
@Getter(AccessLevel.PACKAGE)
|
||||||
enum GameIndicator
|
enum GameIndicator
|
||||||
{
|
{
|
||||||
VENGEANCE_ACTIVE(SpriteID.SPELL_VENGEANCE_OTHER, GameTimerImageType.SPRITE, "Vengeance active");
|
VENGEANCE_ACTIVE(SpriteID.SPELL_VENGEANCE_OTHER, GameTimerImageType.SPRITE, "Vengeance active");
|
||||||
|
|
||||||
@Getter(AccessLevel.PACKAGE)
|
|
||||||
private final String description;
|
private final String description;
|
||||||
@Getter(AccessLevel.PACKAGE)
|
|
||||||
private String text;
|
private String text;
|
||||||
@Getter(AccessLevel.PACKAGE)
|
|
||||||
private Color textColor;
|
private Color textColor;
|
||||||
private final int imageId;
|
private final int imageId;
|
||||||
private final GameTimerImageType imageType;
|
private final GameTimerImageType imageType;
|
||||||
@@ -58,17 +53,4 @@ enum GameIndicator
|
|||||||
{
|
{
|
||||||
this(imageId, idType, description, "", null);
|
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,16 +26,15 @@
|
|||||||
*/
|
*/
|
||||||
package net.runelite.client.plugins.timers;
|
package net.runelite.client.plugins.timers;
|
||||||
|
|
||||||
import java.awt.image.BufferedImage;
|
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
import java.time.temporal.ChronoUnit;
|
import java.time.temporal.ChronoUnit;
|
||||||
|
import lombok.AccessLevel;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import net.runelite.api.GraphicID;
|
import net.runelite.api.GraphicID;
|
||||||
import net.runelite.api.ItemID;
|
import net.runelite.api.ItemID;
|
||||||
import net.runelite.api.SpriteID;
|
import net.runelite.api.SpriteID;
|
||||||
import net.runelite.client.game.ItemManager;
|
|
||||||
import net.runelite.client.game.SpriteManager;
|
|
||||||
|
|
||||||
|
@Getter(AccessLevel.PACKAGE)
|
||||||
enum GameTimer
|
enum GameTimer
|
||||||
{
|
{
|
||||||
STAMINA(ItemID.STAMINA_POTION4, GameTimerImageType.ITEM, "Stamina", 2, ChronoUnit.MINUTES, true),
|
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),
|
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);
|
DRAGON_FIRE_SHIELD(ItemID.DRAGONFIRE_SHIELD_11284, GameTimerImageType.ITEM, "Dragonfire Shield Special", 2, ChronoUnit.MINUTES);
|
||||||
|
|
||||||
@Getter
|
|
||||||
private final Duration duration;
|
private final Duration duration;
|
||||||
@Getter
|
|
||||||
private final Integer graphicId;
|
private final Integer graphicId;
|
||||||
@Getter
|
|
||||||
private final String description;
|
private final String description;
|
||||||
@Getter
|
|
||||||
private final boolean removedOnDeath;
|
private final boolean removedOnDeath;
|
||||||
@Getter
|
|
||||||
private final Duration initialDelay;
|
private final Duration initialDelay;
|
||||||
private final int imageId;
|
private final int imageId;
|
||||||
private final GameTimerImageType imageType;
|
private final GameTimerImageType imageType;
|
||||||
@@ -129,17 +123,4 @@ enum GameTimer
|
|||||||
{
|
{
|
||||||
this(imageId, idType, description, null, time, unit, delay, false);
|
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,7 +25,6 @@
|
|||||||
package net.runelite.client.plugins.timers;
|
package net.runelite.client.plugins.timers;
|
||||||
|
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
import java.awt.Image;
|
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import net.runelite.client.plugins.Plugin;
|
import net.runelite.client.plugins.Plugin;
|
||||||
import net.runelite.client.ui.overlay.infobox.InfoBox;
|
import net.runelite.client.ui.overlay.infobox.InfoBox;
|
||||||
@@ -36,9 +35,9 @@ public class IndicatorIndicator extends InfoBox
|
|||||||
@Getter
|
@Getter
|
||||||
private final GameIndicator indicator;
|
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;
|
this.indicator = indicator;
|
||||||
setPriority(InfoBoxPriority.MED);
|
setPriority(InfoBoxPriority.MED);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,7 +24,6 @@
|
|||||||
*/
|
*/
|
||||||
package net.runelite.client.plugins.timers;
|
package net.runelite.client.plugins.timers;
|
||||||
|
|
||||||
import java.awt.image.BufferedImage;
|
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.time.temporal.ChronoUnit;
|
import java.time.temporal.ChronoUnit;
|
||||||
@@ -36,9 +35,9 @@ class TimerTimer extends Timer
|
|||||||
{
|
{
|
||||||
private final GameTimer 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;
|
this.timer = timer;
|
||||||
setPriority(InfoBoxPriority.MED);
|
setPriority(InfoBoxPriority.MED);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,7 +26,6 @@
|
|||||||
package net.runelite.client.plugins.timers;
|
package net.runelite.client.plugins.timers;
|
||||||
|
|
||||||
import com.google.inject.Provides;
|
import com.google.inject.Provides;
|
||||||
import java.awt.image.BufferedImage;
|
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@@ -866,8 +865,16 @@ public class TimersPlugin extends Plugin
|
|||||||
{
|
{
|
||||||
removeGameTimer(timer);
|
removeGameTimer(timer);
|
||||||
|
|
||||||
BufferedImage image = timer.getImage(itemManager, spriteManager);
|
TimerTimer t = new TimerTimer(timer, this);
|
||||||
TimerTimer t = new TimerTimer(timer, this, image);
|
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());
|
t.setTooltip(timer.getDescription());
|
||||||
infoBoxManager.addInfoBox(t);
|
infoBoxManager.addInfoBox(t);
|
||||||
return t;
|
return t;
|
||||||
@@ -882,8 +889,16 @@ public class TimersPlugin extends Plugin
|
|||||||
{
|
{
|
||||||
removeGameIndicator(gameIndicator);
|
removeGameIndicator(gameIndicator);
|
||||||
|
|
||||||
BufferedImage image = gameIndicator.getImage(itemManager, spriteManager);
|
IndicatorIndicator indicator = new IndicatorIndicator(gameIndicator, this);
|
||||||
IndicatorIndicator indicator = new IndicatorIndicator(gameIndicator, image, 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());
|
indicator.setTooltip(gameIndicator.getDescription());
|
||||||
infoBoxManager.addInfoBox(indicator);
|
infoBoxManager.addInfoBox(indicator);
|
||||||
|
|
||||||
|
|||||||
@@ -29,9 +29,9 @@ import java.awt.Color;
|
|||||||
import java.awt.Dimension;
|
import java.awt.Dimension;
|
||||||
import java.awt.FontMetrics;
|
import java.awt.FontMetrics;
|
||||||
import java.awt.Graphics2D;
|
import java.awt.Graphics2D;
|
||||||
import java.awt.Image;
|
|
||||||
import java.awt.Point;
|
import java.awt.Point;
|
||||||
import java.awt.Rectangle;
|
import java.awt.Rectangle;
|
||||||
|
import java.awt.image.BufferedImage;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
import net.runelite.client.ui.FontManager;
|
import net.runelite.client.ui.FontManager;
|
||||||
@@ -53,7 +53,7 @@ public class InfoBoxComponent implements LayoutableRenderableEntity
|
|||||||
private String text;
|
private String text;
|
||||||
private Color color = Color.WHITE;
|
private Color color = Color.WHITE;
|
||||||
private Color backgroundColor = ComponentConstants.STANDARD_BACKGROUND_COLOR;
|
private Color backgroundColor = ComponentConstants.STANDARD_BACKGROUND_COLOR;
|
||||||
private Image image;
|
private BufferedImage image;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Dimension render(Graphics2D graphics)
|
public Dimension render(Graphics2D graphics)
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
package net.runelite.client.ui.overlay.infobox;
|
package net.runelite.client.ui.overlay.infobox;
|
||||||
|
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
import java.awt.Image;
|
import java.awt.image.BufferedImage;
|
||||||
import lombok.AccessLevel;
|
import lombok.AccessLevel;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
@@ -38,11 +38,11 @@ public abstract class InfoBox
|
|||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
private Image image;
|
private BufferedImage image;
|
||||||
|
|
||||||
@Getter(AccessLevel.PACKAGE)
|
@Getter(AccessLevel.PACKAGE)
|
||||||
@Setter(AccessLevel.PACKAGE)
|
@Setter(AccessLevel.PACKAGE)
|
||||||
private Image scaledImage;
|
private BufferedImage scaledImage;
|
||||||
|
|
||||||
@Getter(AccessLevel.PACKAGE)
|
@Getter(AccessLevel.PACKAGE)
|
||||||
@Setter
|
@Setter
|
||||||
@@ -52,7 +52,7 @@ public abstract class InfoBox
|
|||||||
@Setter
|
@Setter
|
||||||
private String tooltip;
|
private String tooltip;
|
||||||
|
|
||||||
public InfoBox(Image image, Plugin plugin)
|
public InfoBox(BufferedImage image, Plugin plugin)
|
||||||
{
|
{
|
||||||
this.plugin = plugin;
|
this.plugin = plugin;
|
||||||
setImage(image);
|
setImage(image);
|
||||||
|
|||||||
@@ -27,7 +27,6 @@ package net.runelite.client.ui.overlay.infobox;
|
|||||||
import com.google.common.base.Preconditions;
|
import com.google.common.base.Preconditions;
|
||||||
import com.google.common.collect.ComparisonChain;
|
import com.google.common.collect.ComparisonChain;
|
||||||
import java.awt.Graphics;
|
import java.awt.Graphics;
|
||||||
import java.awt.Image;
|
|
||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
@@ -40,6 +39,7 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
import net.runelite.api.events.ConfigChanged;
|
import net.runelite.api.events.ConfigChanged;
|
||||||
import net.runelite.client.config.RuneLiteConfig;
|
import net.runelite.client.config.RuneLiteConfig;
|
||||||
import net.runelite.client.eventbus.Subscribe;
|
import net.runelite.client.eventbus.Subscribe;
|
||||||
|
import net.runelite.client.game.AsyncBufferedImage;
|
||||||
import net.runelite.client.plugins.PluginDescriptor;
|
import net.runelite.client.plugins.PluginDescriptor;
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
@@ -72,6 +72,14 @@ public class InfoBoxManager
|
|||||||
updateInfoBoxImage(infoBox);
|
updateInfoBoxImage(infoBox);
|
||||||
infoBoxes.add(infoBox);
|
infoBoxes.add(infoBox);
|
||||||
refreshInfoBoxes();
|
refreshInfoBoxes();
|
||||||
|
|
||||||
|
BufferedImage image = infoBox.getImage();
|
||||||
|
|
||||||
|
if (image instanceof AsyncBufferedImage)
|
||||||
|
{
|
||||||
|
AsyncBufferedImage abi = (AsyncBufferedImage) image;
|
||||||
|
abi.onChanged(() -> updateInfoBoxImage(infoBox));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void removeInfoBox(InfoBox 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)
|
if (infoBox.getImage() == null)
|
||||||
{
|
{
|
||||||
@@ -126,8 +134,8 @@ public class InfoBoxManager
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Set scaled InfoBox image
|
// Set scaled InfoBox image
|
||||||
final Image image = infoBox.getImage();
|
final BufferedImage image = infoBox.getImage();
|
||||||
Image resultImage = image;
|
BufferedImage resultImage = image;
|
||||||
final double width = image.getWidth(null);
|
final double width = image.getWidth(null);
|
||||||
final double height = image.getHeight(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
|
final double size = Math.max(2, runeLiteConfig.infoBoxSize()); // Limit size to 2 as that is minimum size not causing breakage
|
||||||
|
|||||||
Reference in New Issue
Block a user