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
相关产品推荐
相关产品推荐

