如何添加聊天颜色



我想在我的插件中添加颜色格式(就像聊天中的必需品有颜色一样)。例如,&6test将变成"test"中的金色。

我差点加上那些颜色,但我有个问题。它会删除整个消息并留下绿色测试消息。如何添加颜色?

现在我正在使用这个:

public void onPlayerChat(AsyncPlayerChatEvent chatevent){
    for (String word : chatevent.getMessage().split(" ")){
        word = word.replaceAll("&2", "§2test");
        chatevent.setMessage(word);
        if(SysMng.getConfig().getStringList("badwords").contains(word)){
            if (!chatevent.getPlayer().hasPermission("bypassbadwords")){
            chatevent.setCancelled(true);
            chatevent.getPlayer().sendMessage(ChatColor.RED + "Dont use dirty or swear words!");
         }
      }
    }
 }

但是,正如我所说,它删除了整个消息,并留下了绿色测试消息。这是由以下原因引起的:

word = word.replaceAll("&2", "§2test");
chatevent.setMessage(word);

忽略"脏话"部分,这只是为了防止人们使用脏话。我该如何解决这个问题,以便玩家可以在聊天中使用颜色代码?

如果您想翻译颜色代码(例如来自&符号),可以使用ChatColor.translateAlternateColorCodes

ChatColor.translateAlternateColorCodes('&', str);

这将自动将所有&颜色代码转换为具有§符号的颜色代码,并因此转换为其各自的ChatColor

例如,如果你使用

String original = "&atest";
String formatted = ChatColor.translateAlternateColorCodes('&', original);

formatted将等于等于ChatColor.GREEN + "test""§atest"

如果你想让玩家使用&颜色代码聊天,你可以先收听AsyncPlayerChatEvent(在implements Listener的类内),然后使用.translateAlternateColorCodes 将消息设置为正确颜色的消息

@EventHandler
public void playerChat(AsyncPlayerChatEvent e){
    //get the chat message
    String original = e.getMessage();
    //format the chat message with &colorCodes
    String formatted = ChatColor.translateAlternateColorCodes('&', original);
    //set the message to the formatted message
    e.setMessage(formatted);
}

使用此功能,如果玩家键入类似"&6Hello,&aWorld!"的内容,它将被翻译为ChatColor.GOLD + "Hello, " + ChatColor.GREEN + "World!"

整个消息被"§2test"替换的原因是,您正在拆分字符串,而不是重建它。

相反,您应该在使用translateAlternateColorCodes之后将字符串拆分为,然后使用ChatColor.stripColor(String)从字符串中去除颜色,然后再检查它是否是诅咒词(这将防止玩家通过在诅咒词前面放置颜色代码来绕过审查员)

使用ChatColor.{COLORNAME}

示例:word = word.replaceAll("&2", ChatColor.GREEN + "test");

所有可用颜色代码的完整列表如下:https://hub.spigotmc.org/javadocs/spigot/org/bukkit/ChatColor.html

您可能需要像这样导入org.bukkit.ChatColorimport org.bukkit.ChatColor;

编辑:至于没有更换正确零件的原因,与颜色无关。您使用的.replaceAll(String regex, String replacement)需要一个正则表达式,因为您不关心正则表达式,只需使用.replace(CharSequence target, CharSequence replacement)函数即可。它仍然会替换所有出现的字符串。

EDIT2:您还为每个单词调用chatevent.setMessage(word);,您只想在处理完所有单词后才调用它。使用StringBuilder并将每个单词附加到其中,然后在末尾设置消息(在for循环之外)。

您正在解构包含多个单词的字符串。您需要做的是创建一个额外的字符串,并在循环中重新编译消息。然后执行:chatevent.setMessage(newre_constructured_message_from_your_loop);

但我想,无论你使用什么,你都可能需要将它们分离成多个不同的对象,以在循环中创建消息。

最新更新