From d5fe57865debff1a4fe3ce7229a548be48146095 Mon Sep 17 00:00:00 2001 From: Adam Date: Tue, 11 Jan 2022 21:30:16 -0500 Subject: [PATCH] chat message manager: support game chat color settings This will use the configured in-game setting for default chat colors, if configured. --- .../net/runelite/api/ChatMessageType.java | 4 +- .../main/java/net/runelite/api/VarPlayer.java | 33 ++++- .../net/runelite/client/chat/ChatColor.java | 20 ++- .../client/chat/ChatMessageManager.java | 123 +++++++++++++++--- 4 files changed, 149 insertions(+), 31 deletions(-) diff --git a/runelite-api/src/main/java/net/runelite/api/ChatMessageType.java b/runelite-api/src/main/java/net/runelite/api/ChatMessageType.java index d631395b89..e1bc085ab0 100644 --- a/runelite-api/src/main/java/net/runelite/api/ChatMessageType.java +++ b/runelite-api/src/main/java/net/runelite/api/ChatMessageType.java @@ -173,9 +173,9 @@ public enum ChatMessageType */ CLAN_CREATION_INVITATION(109), /** - * Clan wars challenge for clans rather than FCs + * Challenge offer for the clan tab */ - CLAN_CLAN_WARS_CHALLENGE(110), + CHALREQ_CLANCHAT(110), CLAN_GIM_FORM_GROUP(111), CLAN_GIM_GROUP_WITH(112), diff --git a/runelite-api/src/main/java/net/runelite/api/VarPlayer.java b/runelite-api/src/main/java/net/runelite/api/VarPlayer.java index c11574e662..6868dcd7c3 100644 --- a/runelite-api/src/main/java/net/runelite/api/VarPlayer.java +++ b/runelite-api/src/main/java/net/runelite/api/VarPlayer.java @@ -190,7 +190,38 @@ public enum VarPlayer /** * {@link NpcID} for the HP HUD */ - HP_HUD_NPC_ID(1683); + HP_HUD_NPC_ID(1683), + + /** + * Colors for chat messages + */ + SETTINGS_OPAQUE_CHAT_PUBLIC(2992), + SETTINGS_OPAQUE_CHAT_PRIVATE(2993), + SETTINGS_OPAQUE_CHAT_AUTO(2994), + SETTINGS_OPAQUE_CHAT_BROADCAST(2995), + SETTINGS_OPAQUE_CHAT_FRIEND(2996), + SETTINGS_OPAQUE_CHAT_CLAN(2997), + SETTINGS_OPAQUE_CHAT_GUEST_CLAN(3060), + SETTINGS_OPAQUE_CHAT_CLAN_BROADCAST(3192), + SETTINGS_OPAQUE_CHAT_IRON_GROUP_CHAT(3191), + SETTINGS_OPAQUE_CHAT_IRON_GROUP_BROADCAST(3193), + SETTINGS_OPAQUE_CHAT_TRADE_REQUEST(2998), + SETTINGS_OPAQUE_CHAT_CHALLENGE_REQUEST(2999), + + SETTINGS_TRANSPARENT_CHAT_PUBLIC(3000), + SETTINGS_TRANSPARENT_CHAT_PRIVATE(3001), + SETTINGS_TRANSPARENT_CHAT_AUTO(3002), + SETTINGS_TRANSPARENT_CHAT_BROADCAST(3003), + SETTINGS_TRANSPARENT_CHAT_FRIEND(3004), + SETTINGS_TRANSPARENT_CHAT_CLAN(3005), + SETTINGS_TRANSPARENT_CHAT_GUEST_CLAN(3061), + SETTINGS_TRANSPARENT_CHAT_CLAN_BROADCAST(3195), + SETTINGS_TRANSPARENT_CHAT_IRON_GROUP_CHAT(3194), + SETTINGS_TRANSPARENT_CHAT_IRON_GROUP_BROADCAST(3196), + SETTINGS_TRANSPARENT_CHAT_TRADE_REQUEST(3006), + SETTINGS_TRANSPARENT_CHAT_CHALLENGE_REQUEST(3007), + + ; private final int id; } diff --git a/runelite-client/src/main/java/net/runelite/client/chat/ChatColor.java b/runelite-client/src/main/java/net/runelite/client/chat/ChatColor.java index 0a6dfdfaf2..6db6101328 100644 --- a/runelite-client/src/main/java/net/runelite/client/chat/ChatColor.java +++ b/runelite-client/src/main/java/net/runelite/client/chat/ChatColor.java @@ -25,28 +25,26 @@ package net.runelite.client.chat; import java.awt.Color; +import javax.annotation.Nullable; +import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; +import net.runelite.api.VarPlayer; @Data -@EqualsAndHashCode(exclude = {"color", "isDefault"}) -public class ChatColor +@EqualsAndHashCode(exclude = {"color", "isDefault", "setting"}) +@AllArgsConstructor +class ChatColor { private ChatColorType type; private Color color; private boolean transparent; private boolean isDefault; + @Nullable + private VarPlayer setting; // varp for the in-game chat color setting public ChatColor(ChatColorType type, Color color, boolean transparent) { - this(type, color, transparent, false); - } - - public ChatColor(ChatColorType type, Color color, boolean transparent, boolean isDefault) - { - this.type = type; - this.color = color; - this.transparent = transparent; - this.isDefault = isDefault; + this(type, color, transparent, false, null); } } diff --git a/runelite-client/src/main/java/net/runelite/client/chat/ChatMessageManager.java b/runelite-client/src/main/java/net/runelite/client/chat/ChatMessageManager.java index 42bc06a17f..9f4ccb441a 100644 --- a/runelite-client/src/main/java/net/runelite/client/chat/ChatMessageManager.java +++ b/runelite-client/src/main/java/net/runelite/client/chat/ChatMessageManager.java @@ -37,13 +37,13 @@ import java.util.Objects; import java.util.Queue; import java.util.Set; import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.concurrent.atomic.AtomicReference; import javax.inject.Inject; import javax.inject.Singleton; import net.runelite.api.ChatMessageType; import net.runelite.api.Client; import net.runelite.api.MessageNode; import net.runelite.api.Player; +import net.runelite.api.VarPlayer; import net.runelite.api.Varbits; import net.runelite.api.events.ResizeableChanged; import net.runelite.api.events.ScriptCallbackEvent; @@ -311,6 +311,86 @@ public class ChatMessageManager return null; } + // get the variable holding the chat color from the settings, from script4484 + private static VarPlayer getSettingsColor(ChatMessageType type, boolean transparent) + { + if (transparent) + { + switch (type) + { + case PUBLICCHAT: + case MODCHAT: + return VarPlayer.SETTINGS_TRANSPARENT_CHAT_PUBLIC; + case PRIVATECHATOUT: + case MODPRIVATECHAT: + case PRIVATECHAT: + case LOGINLOGOUTNOTIFICATION: + return VarPlayer.SETTINGS_TRANSPARENT_CHAT_PRIVATE; + case AUTOTYPER: + case MODAUTOTYPER: + return VarPlayer.SETTINGS_TRANSPARENT_CHAT_AUTO; + case BROADCAST: + return VarPlayer.SETTINGS_TRANSPARENT_CHAT_BROADCAST; + case FRIENDSCHAT: + return VarPlayer.SETTINGS_TRANSPARENT_CHAT_FRIEND; + case CLAN_CHAT: + return VarPlayer.SETTINGS_TRANSPARENT_CHAT_CLAN; + case TRADEREQ: + return VarPlayer.SETTINGS_TRANSPARENT_CHAT_TRADE_REQUEST; + case CHALREQ_TRADE: + case CHALREQ_FRIENDSCHAT: + case CHALREQ_CLANCHAT: + return VarPlayer.SETTINGS_TRANSPARENT_CHAT_CHALLENGE_REQUEST; + case CLAN_GUEST_CHAT: + return VarPlayer.SETTINGS_TRANSPARENT_CHAT_GUEST_CLAN; + case CLAN_GIM_CHAT: + return VarPlayer.SETTINGS_TRANSPARENT_CHAT_IRON_GROUP_CHAT; + case CLAN_MESSAGE: + return VarPlayer.SETTINGS_TRANSPARENT_CHAT_CLAN_BROADCAST; + case CLAN_GIM_MESSAGE: + return VarPlayer.SETTINGS_TRANSPARENT_CHAT_IRON_GROUP_BROADCAST; + } + } + else + { + switch (type) + { + case PUBLICCHAT: + case MODCHAT: + return VarPlayer.SETTINGS_OPAQUE_CHAT_PUBLIC; + case PRIVATECHATOUT: + case MODPRIVATECHAT: + case PRIVATECHAT: + case LOGINLOGOUTNOTIFICATION: + return VarPlayer.SETTINGS_OPAQUE_CHAT_PRIVATE; + case AUTOTYPER: + case MODAUTOTYPER: + return VarPlayer.SETTINGS_OPAQUE_CHAT_AUTO; + case BROADCAST: + return VarPlayer.SETTINGS_OPAQUE_CHAT_BROADCAST; + case FRIENDSCHAT: + return VarPlayer.SETTINGS_OPAQUE_CHAT_FRIEND; + case CLAN_CHAT: + return VarPlayer.SETTINGS_OPAQUE_CHAT_CLAN; + case TRADEREQ: + return VarPlayer.SETTINGS_OPAQUE_CHAT_TRADE_REQUEST; + case CHALREQ_TRADE: + case CHALREQ_FRIENDSCHAT: + case CHALREQ_CLANCHAT: + return VarPlayer.SETTINGS_OPAQUE_CHAT_CHALLENGE_REQUEST; + case CLAN_GUEST_CHAT: + return VarPlayer.SETTINGS_OPAQUE_CHAT_GUEST_CLAN; + case CLAN_GIM_CHAT: + return VarPlayer.SETTINGS_OPAQUE_CHAT_IRON_GROUP_CHAT; + case CLAN_MESSAGE: + return VarPlayer.SETTINGS_OPAQUE_CHAT_CLAN_BROADCAST; + case CLAN_GIM_MESSAGE: + return VarPlayer.SETTINGS_OPAQUE_CHAT_IRON_GROUP_BROADCAST; + } + } + return null; + } + /** * Load all configured colors */ @@ -324,13 +404,13 @@ public class ChatMessageManager Color defaultTransparent = getDefaultColor(chatMessageType, true); if (defaultTransparent != null) { - cacheColor(new ChatColor(ChatColorType.NORMAL, defaultTransparent, true, true), chatMessageType); + cacheColor(new ChatColor(ChatColorType.NORMAL, defaultTransparent, true, true, getSettingsColor(chatMessageType, true)), chatMessageType); } Color defaultOpaque = getDefaultColor(chatMessageType, false); if (defaultOpaque != null) { - cacheColor(new ChatColor(ChatColorType.NORMAL, defaultOpaque, false, true), chatMessageType); + cacheColor(new ChatColor(ChatColorType.NORMAL, defaultOpaque, false, true, getSettingsColor(chatMessageType, false)), chatMessageType); } } @@ -785,23 +865,32 @@ public class ChatMessageManager final boolean transparent = client.isResized() && transparencyVarbit != 0; final Collection chatColors = colorCache.get(type); - - if (chatColors == null || chatColors.isEmpty()) + for (ChatColor chatColor : chatColors) { - return runeLiteFormatMessage; + if (chatColor.isTransparent() == transparent) + { + Color color = chatColor.getColor(); + + VarPlayer varp = chatColor.getSetting(); + if (varp != null) + { + // Apply configured color from game settings, if set + assert chatColor.isDefault(); + int v = client.getVar(varp); + if (v != 0) + { + color = new Color(v - 1); + } + } + + // Replace custom formatting with actual colors + runeLiteFormatMessage = runeLiteFormatMessage.replaceAll( + "", + ColorUtil.colorTag(color)); + } } - final AtomicReference resultMessage = new AtomicReference<>(runeLiteFormatMessage); - - // Replace custom formatting with actual colors - chatColors.stream() - .filter(chatColor -> chatColor.isTransparent() == transparent) - .forEach(chatColor -> - resultMessage.getAndUpdate(oldMessage -> oldMessage.replaceAll( - "", - ColorUtil.colorTag(chatColor.getColor())))); - - return resultMessage.get(); + return runeLiteFormatMessage; } private void refreshAll()