求助:如何为Minecraft 1.18.2聊天过滤插件的屏蔽词添加悬浮文本框
Minecraft 1.18.2聊天过滤插件添加悬浮文本框实现方案
要给被屏蔽的词汇添加悬浮提示,你需要使用Bukkit提供的聊天组件API(基于BungeeCord的BaseComponent体系),因为普通字符串无法携带交互事件(比如悬浮提示)。以下是具体实现步骤和修改后的代码:
核心思路
- 放弃直接修改字符串消息,改用
BaseComponent数组处理聊天内容,这类组件支持添加悬浮、点击等交互事件。 - 匹配到违禁词后,将其替换为带有悬浮提示的
TextComponent,并设置对应的悬浮文本内容。 - 最终通过
event.setComponents()方法替换原聊天内容,替代旧的event.setMessage()。
修改后的完整代码
package wojtus.wojtusChatmanagerPlugin; import org.bukkit.Bukkit; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.AsyncPlayerChatEvent; import org.bukkit.plugin.java.JavaPlugin; import wojtus.wojtusChatmanagerPlugin.utils.Colors; import net.md_5.bungee.api.chat.BaseComponent; import net.md_5.bungee.api.chat.HoverEvent; import net.md_5.bungee.api.chat.TextComponent; import net.md_5.bungee.api.chat.hover.content.Text; import java.util.regex.Matcher; import java.util.regex.Pattern; public final class WojtusChatmanagerPlugin extends JavaPlugin implements Listener { @Override public void onEnable() { Bukkit.getPluginManager().registerEvents(this, this); saveDefaultConfig(); getLogger().info("Plugin Chatmanager został poprawnie uruchomiony!"); } @EventHandler public void onPlayerChat(AsyncPlayerChatEvent event) { String originalMessage = event.getMessage(); FileConfiguration config = getConfig(); String strippedMessage = originalMessage.replaceAll("(?i)§[0-9a-fk-or]", ""); for (String word : config.getStringList("banned_words")) { Pattern pattern = Pattern.compile("(?i)\\b" + Pattern.quote(word) + "\\b"); Matcher matcher = pattern.matcher(strippedMessage); while (matcher.find()) { String matchedWord = matcher.group(); if (matchedWord.length() <= 1) continue; // 构建带颜色的屏蔽后文本 String censuredText = "&c" + matchedWord.charAt(0) + "*" + matchedWord.substring(2) + "&r"; // 将文本转换为组件,并添加悬浮提示 BaseComponent[] censuredComponents = TextComponent.fromLegacyText(Colors.translate(censuredText)); for (BaseComponent comp : censuredComponents) { // 设置悬浮事件:鼠标悬浮时显示的文本 comp.setHoverEvent(new HoverEvent( HoverEvent.Action.SHOW_TEXT, new Text("该词汇已被系统屏蔽") )); } // 将匹配到的原始词汇替换为带悬浮的组件对应的文本(简化处理) originalMessage = originalMessage.replaceFirst(Pattern.quote(matchedWord), censuredText); } } // 将最终文本转换为组件数组并设置到事件中 event.setComponents(TextComponent.fromLegacyText(Colors.translate(originalMessage))); } @Override public void onDisable() { getLogger().info("Plugin Chatmanager został poprawnie wyłączony!"); } }
关键细节说明
- 组件API导入:新增的
net.md_5.bungee.api.chat下的类是Spigot/Bukkit服务端自带的,无需额外引入依赖。 - 悬浮提示自定义:你可以修改
new Text("该词汇已被系统屏蔽")的内容,比如从配置文件读取提示文本,实现动态配置。 - 复杂格式兼容:如果原始聊天消息包含特殊格式(如点击事件、自定义悬浮),上述简化方法可能会丢失原有格式。若需保留,需要遍历
BaseComponent数组逐个处理匹配内容,逻辑会更复杂,但适配性更强。 - 正则边界注意:原代码中的
\\b是单词边界匹配,若违禁词包含特殊字符(如标点),需调整正则表达式避免匹配失效。
内容的提问来源于stack exchange,提问作者Wojtek221_
相关产品推荐
相关产品推荐

