chat message manager: support game chat color settings

This will use the configured in-game setting for default chat colors, if
configured.
This commit is contained in:
Adam
2022-01-11 21:30:16 -05:00
parent 513c250d28
commit d5fe57865d
4 changed files with 149 additions and 31 deletions

View File

@@ -173,9 +173,9 @@ public enum ChatMessageType
*/ */
CLAN_CREATION_INVITATION(109), 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_FORM_GROUP(111),
CLAN_GIM_GROUP_WITH(112), CLAN_GIM_GROUP_WITH(112),

View File

@@ -190,7 +190,38 @@ public enum VarPlayer
/** /**
* {@link NpcID} for the HP HUD * {@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; private final int id;
} }

View File

@@ -25,28 +25,26 @@
package net.runelite.client.chat; package net.runelite.client.chat;
import java.awt.Color; import java.awt.Color;
import javax.annotation.Nullable;
import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import net.runelite.api.VarPlayer;
@Data @Data
@EqualsAndHashCode(exclude = {"color", "isDefault"}) @EqualsAndHashCode(exclude = {"color", "isDefault", "setting"})
public class ChatColor @AllArgsConstructor
class ChatColor
{ {
private ChatColorType type; private ChatColorType type;
private Color color; private Color color;
private boolean transparent; private boolean transparent;
private boolean isDefault; private boolean isDefault;
@Nullable
private VarPlayer setting; // varp for the in-game chat color setting
public ChatColor(ChatColorType type, Color color, boolean transparent) public ChatColor(ChatColorType type, Color color, boolean transparent)
{ {
this(type, color, transparent, false); this(type, color, transparent, false, null);
}
public ChatColor(ChatColorType type, Color color, boolean transparent, boolean isDefault)
{
this.type = type;
this.color = color;
this.transparent = transparent;
this.isDefault = isDefault;
} }
} }

View File

@@ -37,13 +37,13 @@ import java.util.Objects;
import java.util.Queue; import java.util.Queue;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.atomic.AtomicReference;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Singleton; import javax.inject.Singleton;
import net.runelite.api.ChatMessageType; import net.runelite.api.ChatMessageType;
import net.runelite.api.Client; import net.runelite.api.Client;
import net.runelite.api.MessageNode; import net.runelite.api.MessageNode;
import net.runelite.api.Player; import net.runelite.api.Player;
import net.runelite.api.VarPlayer;
import net.runelite.api.Varbits; import net.runelite.api.Varbits;
import net.runelite.api.events.ResizeableChanged; import net.runelite.api.events.ResizeableChanged;
import net.runelite.api.events.ScriptCallbackEvent; import net.runelite.api.events.ScriptCallbackEvent;
@@ -311,6 +311,86 @@ public class ChatMessageManager
return null; 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 * Load all configured colors
*/ */
@@ -324,13 +404,13 @@ public class ChatMessageManager
Color defaultTransparent = getDefaultColor(chatMessageType, true); Color defaultTransparent = getDefaultColor(chatMessageType, true);
if (defaultTransparent != null) 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); Color defaultOpaque = getDefaultColor(chatMessageType, false);
if (defaultOpaque != null) 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 boolean transparent = client.isResized() && transparencyVarbit != 0;
final Collection<ChatColor> chatColors = colorCache.get(type); final Collection<ChatColor> chatColors = colorCache.get(type);
for (ChatColor chatColor : chatColors)
if (chatColors == null || chatColors.isEmpty())
{ {
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(
"<col" + chatColor.getType().name() + ">",
ColorUtil.colorTag(color));
}
} }
final AtomicReference<String> resultMessage = new AtomicReference<>(runeLiteFormatMessage); return runeLiteFormatMessage;
// Replace custom formatting with actual colors
chatColors.stream()
.filter(chatColor -> chatColor.isTransparent() == transparent)
.forEach(chatColor ->
resultMessage.getAndUpdate(oldMessage -> oldMessage.replaceAll(
"<col" + chatColor.getType().name() + ">",
ColorUtil.colorTag(chatColor.getColor()))));
return resultMessage.get();
} }
private void refreshAll() private void refreshAll()