From 474ef1562b1a9dbfb950edc99888b6c0b85519c6 Mon Sep 17 00:00:00 2001 From: Adam Date: Wed, 26 May 2021 15:23:19 -0400 Subject: [PATCH] chat icon manager: add clan chat icons --- .../runelite/client/game/ChatIconManager.java | 43 ++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/game/ChatIconManager.java b/runelite-client/src/main/java/net/runelite/client/game/ChatIconManager.java index 6e80237e96..58f334ca96 100644 --- a/runelite-client/src/main/java/net/runelite/client/game/ChatIconManager.java +++ b/runelite-client/src/main/java/net/runelite/client/game/ChatIconManager.java @@ -37,6 +37,7 @@ import net.runelite.api.EnumID; import net.runelite.api.FriendsChatRank; import net.runelite.api.GameState; import net.runelite.api.IndexedSprite; +import net.runelite.api.clan.ClanTitle; import net.runelite.api.events.GameStateChanged; import net.runelite.client.eventbus.EventBus; import net.runelite.client.eventbus.Subscribe; @@ -52,8 +53,10 @@ public class ChatIconManager private final SpriteManager spriteManager; private BufferedImage[] friendsChatRankImages; + private BufferedImage[] clanRankImages; private int friendsChatOffset; + private int clanOffset; @Inject private ChatIconManager(Client client, SpriteManager spriteManager, EventBus eventBus) @@ -74,11 +77,25 @@ public class ChatIconManager return friendsChatRankImages[friendsChatRank.ordinal() - 1]; } + @Nullable + public BufferedImage getRankImage(final ClanTitle clanTitle) + { + int rank = clanTitle.getId(); + int idx = clanRankToIdx(rank); + return clanRankImages[idx]; + } + public int getIconNumber(final FriendsChatRank friendsChatRank) { return friendsChatOffset + friendsChatRank.ordinal() - 1; } + public int getIconNumber(final ClanTitle clanTitle) + { + int rank = clanTitle.getId(); + return clanOffset + clanRankToIdx(rank); + } + @Subscribe public void onGameStateChanged(GameStateChanged gameStateChanged) { @@ -91,22 +108,25 @@ public class ChatIconManager private void loadRankIcons() { final EnumComposition friendsChatIcons = client.getEnum(EnumID.FRIENDS_CHAT_RANK_ICONS); + final EnumComposition clanIcons = client.getEnum(EnumID.CLAN_RANK_GRAPHIC); { IndexedSprite[] modIcons = client.getModIcons(); friendsChatOffset = modIcons.length; + clanOffset = friendsChatOffset + friendsChatIcons.size(); IndexedSprite blank = ImageUtil.getImageIndexedSprite( new BufferedImage(modIcons[0].getWidth(), modIcons[0].getHeight(), BufferedImage.TYPE_INT_ARGB), client); - modIcons = Arrays.copyOf(modIcons, friendsChatOffset + friendsChatIcons.size()); + modIcons = Arrays.copyOf(modIcons, friendsChatOffset + friendsChatIcons.size() + clanIcons.size()); Arrays.fill(modIcons, friendsChatOffset, modIcons.length, blank); client.setModIcons(modIcons); } friendsChatRankImages = new BufferedImage[friendsChatIcons.size()]; + clanRankImages = new BufferedImage[clanIcons.size()]; final IndexedSprite[] modIcons = client.getModIcons(); @@ -120,6 +140,21 @@ public class ChatIconManager modIcons[friendsChatOffset + fi] = ImageUtil.getImageIndexedSprite(friendsChatRankImages[fi], client); }); } + + for (int i = 0; i < clanIcons.size(); i++) + { + final int key = clanIcons.getKeys()[i]; + final int idx = clanRankToIdx(key); + + assert idx >= 0 && idx < clanIcons.size(); + + spriteManager.getSpriteAsync(clanIcons.getIntValue(key), 0, sprite -> + { + final BufferedImage img = ImageUtil.resizeCanvas(sprite, IMAGE_DIMENSION.width, IMAGE_DIMENSION.height); + clanRankImages[idx] = img; + modIcons[clanOffset + idx] = ImageUtil.getImageIndexedSprite(img, client); + }); + } } private static BufferedImage friendsChatImageFromSprite(final BufferedImage sprite) @@ -127,4 +162,10 @@ public class ChatIconManager final BufferedImage canvas = ImageUtil.resizeCanvas(sprite, IMAGE_DIMENSION.width, IMAGE_DIMENSION.height); return ImageUtil.outlineImage(canvas, IMAGE_OUTLINE_COLOR); } + + private static int clanRankToIdx(int key) + { + // keys are -5 to 264, with no 0 + return key < 0 ? ~key : (key + 4); + } }