Java 如何添加聊天颜色?

Java 如何添加聊天颜色?,java,bukkit,Java,Bukkit,我想给我的插件添加颜色格式(就像essentials在聊天中有颜色一样)。例如,&6test将变成金色的“test” 我差点加上那些颜色,但我有个问题。它删除整个消息并保留绿色测试消息。如何添加颜色 现在我用的是: public void onPlayerChat(AsyncPlayerChatEvent chatevent){ for (String word : chatevent.getMessage().split(" ")){ word = word.repla

我想给我的插件添加颜色格式(就像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);

忽略“脏话”部分,这只是为了防止人们使用脏话。如何修复此问题,以便玩家可以在聊天中使用颜色代码?

使用
ChatColor.{COLORNAME}

例如:
word=word.replaceAll(“&2”,ChatColor.GREEN+“test”)

所有可用颜色代码的完整列表如下:

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

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


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

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


但是我可以想象,无论您使用什么,您可能都必须将它们分割成多个不同的对象,以便从循环中创建消息。

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

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

例如,如果您使用

String original = "&atest";
String formatted = ChatColor.translateAlternateColorCodes('&', original);
格式化
将等于
“§atest”
,这等于
ChatColor.GREEN+“test”

如果您想允许玩家使用
&
颜色代码聊天,您可以先侦听
AsyncPlayerChatEvent
(在一个类中),然后使用
.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”的原因是您正在拆分字符串,而不是重新构建它


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

它与word=word.replaceAll(&2“,“§2test”)相同;它仍然不能解决我的问题。我想我已经在编辑中解决了它。没关系,我发现了另一个错误,这是在编辑中提到的。所以我的代码看起来如何我不明白。我如何使用它?我把它放在哪里。@Reaper123只要你想将
&ahi
更改为
§ahi
,例如,你就可以使用
ChatColor.translateAlternateColorCodes('&',stringToFormat)
。请看最后一个答案示例
@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);
}