You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:如何为Minecraft 1.18.2聊天过滤插件的屏蔽词添加悬浮文本框

Minecraft 1.18.2聊天过滤插件添加悬浮文本框实现方案

要给被屏蔽的词汇添加悬浮提示,你需要使用Bukkit提供的聊天组件API(基于BungeeCord的BaseComponent体系),因为普通字符串无法携带交互事件(比如悬浮提示)。以下是具体实现步骤和修改后的代码:

核心思路

  1. 放弃直接修改字符串消息,改用BaseComponent数组处理聊天内容,这类组件支持添加悬浮、点击等交互事件。
  2. 匹配到违禁词后,将其替换为带有悬浮提示的TextComponent,并设置对应的悬浮文本内容。
  3. 最终通过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_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 02:24:53