我想在我的插件中添加颜色格式(就像聊天中的必需品有颜色一样)。例如,&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.ChatColor
:import 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);
但我想,无论你使用什么,你都可能需要将它们分离成多个不同的对象,以在循环中创建消息。