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

Minecraft Java插件setResourcepack被拒后重发材质包请求失败

问题背景

开发支持自定义材质包加载的Minecraft Java版插件时,使用如下代码发送材质包请求:

player.setResourcepack("<url>");

该代码首次执行可正常触发客户端材质包下载提示弹窗,功能正常;但玩家一旦选择拒绝材质包请求,后续重复执行该代码不会再弹出任何提示,程序运行全程无报错,无法重新向玩家发送材质包请求。

问题根因

该现象是Minecraft客户端原生缓存机制导致,不属于服务端代码错误:玩家对某一材质包做出拒绝选择后,客户端会本地记录该材质包的对应标识,后续服务端发送相同标识的材质包请求会被客户端直接静默拦截,不会触发弹窗提示。旧版单参数setResourcePack方法会默认用资源包URL生成固定标识,玩家拒绝后就会命中客户端缓存。

可行解决方案
  • 高版本适配方案(适用于1.18及以上服务端)
    弃用旧的单参数setResourcePack方法,使用带唯一UUID参数的API重载,每次发送材质包请求时传入新生成的随机UUID,客户端会将其识别为全新的材质包请求,不会命中之前的拒绝缓存,示例代码:
    // 每次发送请求生成新的随机UUID作为资源包唯一标识
    player.setResourcePack(UUID.randomUUID(), "<你的材质包直链地址>", "", false);
    
    方法参数说明:第一个参数为资源包唯一标识,第二个为材质包直链URL,第三个为材质包SHA1哈希值(无校验需求可传空字符串),第四个为是否强制玩家接受材质包才能游玩,可按需配置。
  • 低版本兼容方案(适用于1.17及以下服务端)
    低版本API没有提供自定义资源包标识的参数,可以通过在材质包URL末尾拼接动态查询参数的方式,让客户端判定为不同的资源包地址,绕开本地拒绝缓存,示例代码:
    // 拼接当前时间戳作为动态参数,保证每次请求的URL存在差异
    String dynamicPackUrl = String.format("%s?t=%d", "<你的材质包直链地址>", System.currentTimeMillis());
    player.setResourcePack(dynamicPackUrl);
    
    使用该方案需要提前确认材质包存储服务支持忽略未知查询参数,不会因URL后缀变化返回404错误。
  • 配套优化逻辑
    注册PlayerResourcePackStatusEvent事件监听器,当监听到玩家返回DECLINED(拒绝)状态时,先向玩家发送文字提示说明材质包的作用,延迟1~3秒后再重新发送材质包请求,避免短时间高频发包被客户端限流拦截。
注意事项
  • 两次材质包请求的发送间隔不要低于1秒,短时间内重复发送请求会被客户端判定为异常请求做静默拦截。
  • 如果使用BungeeCord/Velocity等跨端代理,需要确认代理配置没有拦截重复的资源包数据包,必要时可以直接通过NMS发包的方式发送资源包数据包,绕过上层API的缓存逻辑。

内容的提问来源于stack exchange,提问作者DAOCMINECRAFT

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 19:06:33