From fa9a178f4a1037be04536c0fb75a8dc0279f2233 Mon Sep 17 00:00:00 2001 From: Adam Date: Mon, 3 Jan 2022 11:45:26 -0500 Subject: [PATCH] Fix race with client startup and low detail/chat icon loading Since c1aa0c4898900361593e423792b475c08f141e49 moved client startup to be much earlier, the plugins can now start after the client is already at the login screen. This causes the low detail plugin and chat icon manager to not initialize correctly as they are waiting on the event for the login screen. --- .../runelite/client/game/ChatIconManager.java | 33 ++++++++--------- .../chatchannel/ChatChannelPlugin.java | 23 ++++++------ .../plugins/lowmemory/LowMemoryPlugin.java | 35 ++++++++++--------- 3 files changed, 46 insertions(+), 45 deletions(-) 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 1637f3a3fe..5578578015 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 @@ -38,9 +38,7 @@ 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; +import net.runelite.client.callback.ClientThread; import net.runelite.client.util.ImageUtil; @Singleton @@ -55,15 +53,23 @@ public class ChatIconManager private BufferedImage[] friendsChatRankImages; private BufferedImage[] clanRankImages; - private int friendsChatOffset; - private int clanOffset; + private int friendsChatOffset = -1; + private int clanOffset = -1; @Inject - private ChatIconManager(Client client, SpriteManager spriteManager, EventBus eventBus) + private ChatIconManager(Client client, SpriteManager spriteManager, ClientThread clientThread) { this.client = client; this.spriteManager = spriteManager; - eventBus.register(this); + clientThread.invokeLater(() -> + { + if (client.getGameState().getState() >= GameState.LOGIN_SCREEN.getState()) + { + loadRankIcons(); + return true; + } + return false; + }); } @Nullable @@ -87,22 +93,13 @@ public class ChatIconManager public int getIconNumber(final FriendsChatRank friendsChatRank) { - return friendsChatOffset + friendsChatRank.ordinal() - 1; + return friendsChatOffset == -1 ? -1 : friendsChatOffset + friendsChatRank.ordinal() - 1; } public int getIconNumber(final ClanTitle clanTitle) { int rank = clanTitle.getId(); - return clanOffset + clanRankToIdx(rank); - } - - @Subscribe - public void onGameStateChanged(GameStateChanged gameStateChanged) - { - if (gameStateChanged.getGameState() == GameState.LOGIN_SCREEN && friendsChatOffset == 0) - { - loadRankIcons(); - } + return clanOffset == -1 ? -1 : clanOffset + clanRankToIdx(rank); } private void loadRankIcons() diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/chatchannel/ChatChannelPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/chatchannel/ChatChannelPlugin.java index d1277b981d..7268e6aaf8 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/chatchannel/ChatChannelPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/chatchannel/ChatChannelPlugin.java @@ -632,18 +632,21 @@ public class ChatChannelPlugin extends Plugin if (rank != null && rank != FriendsChatRank.UNRANKED) { int iconNumber = chatIconManager.getIconNumber(rank); - final String img = ""; - if (message.getType() == ChatMessageType.FRIENDSCHAT) + if (iconNumber > -1) { - message.getMessageNode() - .setSender(message.getMessageNode().getSender() + " " + img); + final String img = ""; + if (message.getType() == ChatMessageType.FRIENDSCHAT) + { + message.getMessageNode() + .setSender(message.getMessageNode().getSender() + " " + img); + } + else + { + message.getMessageNode() + .setName(img + message.getMessageNode().getName()); + } + client.refreshChat(); } - else - { - message.getMessageNode() - .setName(img + message.getMessageNode().getName()); - } - client.refreshChat(); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/lowmemory/LowMemoryPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/lowmemory/LowMemoryPlugin.java index 4e980af0da..a8c67a0a56 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/lowmemory/LowMemoryPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/lowmemory/LowMemoryPlugin.java @@ -29,7 +29,6 @@ import javax.inject.Inject; import net.runelite.api.Client; import net.runelite.api.GameState; import net.runelite.api.events.BeforeRender; -import net.runelite.api.events.GameStateChanged; import net.runelite.client.callback.ClientThread; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; @@ -57,10 +56,18 @@ public class LowMemoryPlugin extends Plugin @Override protected void startUp() { - if (client.getGameState() == GameState.LOGGED_IN) + clientThread.invoke(() -> { - clientThread.invoke(() -> client.changeMemoryMode(config.lowDetail())); - } + // When the client starts it initializes the texture size based on the memory mode setting. + // Don't set low memory before the login screen is ready to prevent loading the low detail textures, + // which breaks the gpu plugin due to it requiring the 128x128px textures + if (client.getGameState().getState() >= GameState.LOGIN_SCREEN.getState()) + { + client.changeMemoryMode(config.lowDetail()); + return true; + } + return false; + }); } @Override @@ -80,19 +87,13 @@ public class LowMemoryPlugin extends Plugin { if (configChanged.getGroup().equals(LowMemoryConfig.GROUP)) { - clientThread.invoke(() -> client.changeMemoryMode(config.lowDetail())); - } - } - - @Subscribe - public void onGameStateChanged(GameStateChanged event) - { - // When the client starts it initializes the texture size based on the memory mode setting. - // Don't set low memory before the login screen is ready to prevent loading the low detail textures, - // which breaks the gpu plugin due to it requiring the 128x128px textures - if (event.getGameState() == GameState.LOGIN_SCREEN) - { - client.changeMemoryMode(config.lowDetail()); + clientThread.invoke(() -> + { + if (client.getGameState().getState() >= GameState.LOGIN_SCREEN.getState()) + { + client.changeMemoryMode(config.lowDetail()); + } + }); } }