如何添加聊天颜色?
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.ChatColor
:
import 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)
检查它是否是诅咒词(这将防止玩家通过在脏话前面加上颜色代码来绕过审查)
我想为我的插件添加颜色格式(比如 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.ChatColor
:
import 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)
检查它是否是诅咒词(这将防止玩家通过在脏话前面加上颜色代码来绕过审查)