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

Minecraft脏话检测插件如何在玩家骂人时执行游戏或其他插件命令

实现方案

Bukkit 中执行命令需要在服务端主线程操作,由于 AsyncPlayerChatEvent 是异步事件,你需要通过调度器将命令执行逻辑提交到主线程运行,具体修改如下:


1. 核心逻辑说明

  • 控制台执行命令用 Bukkit.dispatchCommand(Bukkit.getConsoleSender(), 命令内容),权限为最高级,适合执行禁言、踢人等惩罚操作
  • 如果需要以玩家身份执行命令,将第一个参数替换为玩家对象即可
  • 所有 Bukkit 核心API操作必须放在主线程执行,否则会抛出并发修改异常

2. 可配置化惩罚命令(推荐)

先在你的插件config.yml中添加惩罚命令配置,支持用%player%占位符替换为违规玩家名称:

# 原有脏话列表配置保留
swears:
  - 脏话1
  - 脏话2
# 新增惩罚命令配置
punish-commands:
  - "mute %player% 15m 违规发言:说脏话"
  - "broadcast 玩家%player%因说脏话被禁言15分钟"

3. 修改后的事件类代码

package com.beam.sweardetector; // 补充你的包名

import com.beam.sweardetector.SwearDetector;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import org.bukkit.event.player.PlayerJoinEvent;

public class EventsClass implements Listener {
    SwearDetector plugin = SwearDetector.getPlugin(SwearDetector.class);

    @EventHandler
    public void onPlayerJoinEvent(PlayerJoinEvent event) {
        Player player = event.getPlayer();
        player.sendMessage(ChatColor.GOLD + "This server is running AntiSwear v1.0 by BeamCRASH");
    }

    @EventHandler
    public void chatevent (AsyncPlayerChatEvent event) {
        Player player = event.getPlayer();
        for(String s: event.getMessage().split(" ")) {
            if(plugin.getConfig().getStringList("swears").contains(s)) {
                event.setCancelled(true);
                player.sendMessage(ChatColor.DARK_RED + "§lSwearing is not allowed on this server!");
                
                // 提交命令执行逻辑到主线程
                Bukkit.getScheduler().runTask(plugin, () -> {
                    // 遍历配置中的所有惩罚命令执行
                    for(String command : plugin.getConfig().getStringList("punish-commands")) {
                        // 替换玩家占位符
                        String finalCommand = command.replace("%player%", player.getName());
                        // 控制台执行命令
                        Bukkit.dispatchCommand(Bukkit.getConsoleSender(), finalCommand);
                    }
                });
                // 检测到脏话后直接跳出循环,避免重复执行
                break;
            }
        }
    }
}

4. 固定命令版本(不需要配置文件的简化版)

如果你不需要配置化,只想硬编码执行固定命令,直接替换调度器内的逻辑即可,比如检测到脏话直接踢人:

Bukkit.getScheduler().runTask(plugin, () -> {
    Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "kick " + player.getName() + " 禁止说脏话");
});

内容的提问来源于stack exchange,提问作者BeamCRASH

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 13:24:05