为什么我的配置文件无法修改Minecraft服务器的MOTD?
问题修复说明
现有代码/配置的错误点
- 监听器未注册:Main类
onEnable方法仅保存了默认配置,没有将PingListener注册到服务端事件总线,事件回调完全不会触发 PingListener中的plugin成员未初始化,调用时会直接抛出空指针异常- MOTD拼接逻辑错误:
plugin.getConfig().getString("motd" + "\n" + ...)是将拼接后的字符串当作配置键读取,而非读取两个键的值再拼接,永远读不到对应配置 - 配置文件默认值非法:
maxplayers配置为字符串空值,调用getInt读取时会返回默认值0,无法正常显示最大玩家数;motd、motd_line_2无默认值会导致MOTD显示为空 - 颜色转义逻辑冗余:嵌套调用两次
Utils.chat属于不必要的重复操作
修复后的代码
1. me.zavage.motd.Main
package me.zavage.motd; import me.zavage.motd.listeners.PingListener; import org.bukkit.plugin.java.JavaPlugin; public class Main extends JavaPlugin { @Override public void onEnable() { saveDefaultConfig(); // 注册监听器 getServer().getPluginManager().registerEvents(new PingListener(this), this); } }
2. me.zavage.motd.listeners.PingListener
package me.zavage.motd.listeners; import java.io.File; import org.bukkit.Bukkit; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.server.ServerListPingEvent; import me.zavage.motd.Main; import me.zavage.motd.utils.Utils; public class PingListener implements Listener { private Main plugin; // 增加构造方法初始化plugin public PingListener(Main plugin) { this.plugin = plugin; } @EventHandler public void onPing(ServerListPingEvent e) { e.setMaxPlayers(plugin.getConfig().getInt("maxplayers")); // 修正MOTD拼接逻辑:先读两个配置值再拼接,再统一转颜色 String motdFull = plugin.getConfig().getString("motd") + "\n" + plugin.getConfig().getString("motd_line_2"); e.setMotd(Utils.chat(motdFull)); try { e.setServerIcon(Bukkit.loadServerIcon(new File(plugin.getConfig().getString("server_icon_path")))); } catch (Exception e1) { e1.printStackTrace(); } } }
3. config.yml 配置参考(修正默认值)
# 只能填写无小数的正整数 maxplayers: 20 motd: '§a欢迎来到我的服务器' # MOTD第二行内容 motd_line_2: '§b请遵守服务器规则' # 服务端根目录新建icon文件夹,将64*64像素的png图标放入后填写路径 # 路径示例:"C:\Users\user\Desktop\minecraft test server\icon\icon.png" server_icon_path: 'icon/icon.png'
内容的提问来源于stack exchange,提问作者Zavage
相关产品推荐
相关产品推荐

