Bukkit插件开发:无法正确从config.yml读取配置键,求排查方向
核心问题点
- Java字符串比较错误:你代码中使用
==对比字符串entity.getType().toString() == mobname,==在Java中是对比对象内存地址,不是对比字符串内容,永远会返回false,所以功能不会触发。 - 大小写不匹配:
entity.getType().toString()返回的是全大写的实体类型名称(比如杀死兔子会返回RABBIT),但你的配置文件里mobs.rabbit.name填的是小写的rabbit,就算用对了字符串对比方法也匹配不上。 - 重载命令逻辑顺序错误:你是先发重载提示再执行
reloadConfig(),如果修改了重载提示文本,第一次执行重载永远返回的是修改前的内容,且命令处理完成后没有返回true,会触发客户端未知命令提示。 - 遗漏命令注册(大概率问题):Bukkit插件自定义命令必须在
plugin.yml中完成注册才能生效,你没有贴出该文件,如果没有配置命令,/mobeffects指令本身就无法使用。
修正方案
- 替换字符串对比逻辑
把mobDeath方法中的
if (entity.getType().toString() == mobname)
替换为
if (entity.getType().toString().equalsIgnoreCase(mobname))
equalsIgnoreCase会忽略大小写对比字符串内容,刚好适配你配置文件里的小写名称。
- 修正重载命令逻辑
把onCommand方法中重载部分的逻辑调整为:
if (args[0].equalsIgnoreCase("reload")) { this.reloadConfig(); // 先重载配置,再读配置发消息 for (String msg: this.getConfig().getStringList("reload.message")) { sender.sendMessage(ChatColor.translateAlternateColorCodes('&', msg)); } return true; // 命令处理完成返回true,避免报错 }
- 检查
plugin.yml配置
确保你的plugin.yml中已经注册了对应命令,示例配置:
name: LukesMobEffects main: com.mk7smp.LukesMobEffects.Main version: 1.0 commands: mobeffects: description: 重载MobEffects配置 usage: /<command> reload permissions: mobeffects.reload: description: 允许使用重载命令 default: op
排查方向
如果修改后还是不生效,可以在代码关键位置加控制台日志定位问题:
- 在
mobDeath方法开头加getLogger().info("触发实体死亡事件,实体类型:"+entity.getType().toString());,确认事件是否正常触发 - 在字符串对比前加
getLogger().info("配置读取到的实体名:"+mobname+",当前死亡实体名:"+entity.getType().toString());,确认读取的配置是否正确、是否能匹配上
内容的提问来源于stack exchange,提问作者pssluke
相关产品推荐
相关产品推荐

