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 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),

View File

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

View File

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

View File

@@ -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<ChatColor> 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(
"<col" + chatColor.getType().name() + ">",
ColorUtil.colorTag(color));
}
}
final AtomicReference<String> resultMessage = new AtomicReference<>(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();
return runeLiteFormatMessage;
}
private void refreshAll()