Bukkit 1.8自定义TabList时服务器崩溃问题求助
问题原因
报错核心是Minecraft 1.8版本的com.mojang.authlib.properties.PropertyMap类不存在removeAll(String)方法——该方法的参数应为Property对象而非字符串,你使用的PlayerList工具类错误地通过反射调用了这个不存在的方法,触发NoSuchMethodException导致服务器崩溃。
修复步骤
针对你使用的PlayerList.java文件,需要修改反射调用removeAll的逻辑:
- 定位到报错栈指向的
PlayerList.java:513附近,找到类似以下的代码:
invokeMethod(props, "removeAll", "textures");
- 将其替换为遍历移除指定属性的逻辑,适配1.8版本的API:
// 获取PropertyMap中的所有属性集合 Collection<Property> properties = (Collection<Property>) invokeMethod(props, "values"); // 遍历移除名为"textures"的属性 Iterator<Property> iterator = properties.iterator(); while (iterator.hasNext()) { Property prop = iterator.next(); if (prop.getName().equals("textures")) { iterator.remove(); } }
- 同时检查
ReflectionUtil.getMethod方法(对应PlayerList.java:934),删除按String.class参数查找removeAll方法的错误逻辑,避免再次触发异常。
简化替代方案(推荐)
Bukkit 1.8原生API已支持直接设置TabList头部、尾部,还能修改玩家列表条目显示击杀数,无需依赖第三方工具类,兼容性更强:
// 设置TabList头部和致谢信息 Player targetPlayer = ...; // 目标玩家对象 targetPlayer.setPlayerListHeaderFooter( "§bPlugin UHC", "§ePlugin by Av32000\n With the help of \n RedFly32 " ); // 给所有在线玩家设置击杀数显示 for (Player onlinePlayer : Bukkit.getOnlinePlayers()) { int playerKills = getPlayerKillCount(onlinePlayer); // 替换为你获取击杀数的方法 onlinePlayer.setPlayerListName("§a" + onlinePlayer.getName() + " §7| Kills: " + playerKills); }
内容的提问来源于stack exchange,提问作者Av32000
相关产品推荐
相关产品推荐

