我想为我的插件添加颜色格式(就像必需品在聊天中有颜色一样)。例如,&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);
忽略"坏词"部分,它只是为了防止人们使用脏话。如何解决这个问题,以便玩家可以在聊天中使用颜色代码?
答案 0 :(得分:1)
使用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循环之外)。
答案 1 :(得分:1)
你解构了包含多个单词的String。您需要做的是创建一个额外的字符串并在循环中重新编译消息。然后你的:chatevent.setMessage(newly_contructed_message_from_your_loop);
但是我会想象你使用的任何东西都可能需要将它们分成多个不同的对象来从循环中创建消息。
答案 2 :(得分:1)
如果您想翻译颜色代码(例如,来自&
符号),您可以使用ChatColor.translateAlternateColorCodes
ChatColor.translateAlternateColorCodes('&', str);
这会自动将所有&
颜色代码转换为带有§
符号的颜色代码,并因此转换为相应的ChatColor
。
因此,例如,如果您使用
String original = "&atest";
String formatted = ChatColor.translateAlternateColorCodes('&', original);
formatted
等于"§atest"
,等于ChatColor.GREEN + "test"
。
如果您想允许玩家使用&
颜色代码进行聊天,您可以先收听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)
从字符串中删除颜色如果它是一个诅咒词(这会阻止玩家通过在诅咒词前面加上颜色代码来绕过检查员)