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

Bukkit 1.8自定义TabList时服务器崩溃问题求助

问题原因

报错核心是Minecraft 1.8版本的com.mojang.authlib.properties.PropertyMap类不存在removeAll(String)方法——该方法的参数应为Property对象而非字符串,你使用的PlayerList工具类错误地通过反射调用了这个不存在的方法,触发NoSuchMethodException导致服务器崩溃。

修复步骤

针对你使用的PlayerList.java文件,需要修改反射调用removeAll的逻辑:

  1. 定位到报错栈指向的PlayerList.java:513附近,找到类似以下的代码:
invokeMethod(props, "removeAll", "textures");
  1. 将其替换为遍历移除指定属性的逻辑,适配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();
    }
}
  1. 同时检查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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 04:33:43