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:
@@ -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),
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user