如何添加聊天颜色?

How do I add chat colors?

我想为我的插件添加颜色格式(比如 essentials 在聊天中有颜色)。例如,&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);

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

使用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(newly_contructed_message_from_your_loop);

但我想无论您使用什么,您都可能必须将它们分成多个不同的对象才能在循环内创建消息。

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

ChatColor.translateAlternateColorCodes('&', str);

这将自动将所有 & 颜色代码转换为带有 § 符号的颜色代码,并因此转换为相应的 ChatColor.

因此,例如,如果您使用

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

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

如果你想让玩家使用 & 颜色代码聊天,你可以先监听 AsyncPlayerChatEvent(在 class 里面 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, and then strip the colors from the string using ChatColor.stripColor(String) 检查它是否是诅咒词(这将防止玩家通过在脏话前面加上颜色代码来绕过审查)