Fix race with client startup and low detail/chat icon loading

Since c1aa0c4898 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.
This commit is contained in:
Adam
2022-01-03 11:45:26 -05:00
parent d7c367b677
commit fa9a178f4a
3 changed files with 46 additions and 45 deletions

View File

@@ -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()

View File

@@ -632,18 +632,21 @@ public class ChatChannelPlugin extends Plugin
if (rank != null && rank != FriendsChatRank.UNRANKED)
{
int iconNumber = chatIconManager.getIconNumber(rank);
final String img = "<img=" + iconNumber + ">";
if (message.getType() == ChatMessageType.FRIENDSCHAT)
if (iconNumber > -1)
{
message.getMessageNode()
.setSender(message.getMessageNode().getSender() + " " + img);
final String img = "<img=" + iconNumber + ">";
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();
}
}

View File

@@ -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());
}
});
}
}