资源栈¶
资源栈(Resource Stack)是Minecraft基岩版中多个资源包按优先级叠加后的加载序列。资源栈决定了当多个资源包提供同名文件、同名资源或同一客户端定义时,最终由哪一份资源生效。
概述¶
资源包并不是彼此孤立加载的。一个世界可以同时启用多个资源包,玩家也可以在全局设置中启用全局资源包。游戏会将这些资源包排列成一个有序栈,并按优先级解析其中的纹理、模型、动画、声音、界面等资源。
一般而言,位于栈顶的资源包具有更高优先级。当多个资源包提供同一路径的文件或同一资源定义时,较高优先级资源包中的内容会覆盖较低优先级资源包中的内容。
世界资源与全局资源¶
资源栈可能同时包含世界资源包和全局资源包。世界资源包由世界自身指定,通常用于保证地图、附加包或世界模板的必要显示效果;全局资源包由玩家在客户端设置中启用,通常用于界面主题、纹理替换或个人偏好。
世界资源包对世界内容具有更强的绑定关系,尤其当行为包依赖某个资源包时,游戏需要确保客户端加载对应资源。全局资源包则更适合作为玩家侧的外观覆盖层。
覆盖规则¶
资源栈的覆盖规则依照资源类型分为三类机制:
路径覆盖¶
对于通过文件路径直接引用且没有独立标识符的资源,在相同路径下放置新文件即可完全替换。适用此机制的资源类型包括:
- 纹理贴图
- 音效文件
- 战利品表
- 交易表
- 游戏命令
标识符覆盖¶
对于通过标识符(identifier字段)进行注册和引用的资源,只需在新文件中声明相同的标识符即可完全替换,路径不影响覆盖效果。适用此机制的资源类型包括:
- 行为包实体
- 客户端实体
- 动画
- 模型
- 动画控制器
- 生成规则
- 合成配方
- 粒子特效
- 渲染控制器
标识符覆盖不会合并
标识符覆盖会用新文件完整替代旧文件,不会自动合并组件。如需修改原版实体,必须先完整复制原版文件,再在此基础上进行修改。
注册表覆盖¶
部分特殊的注册表文件采用合并机制:多个资源包提供的同类文件会按优先级合并为一份,高优先级包中的定义条目将覆盖低优先级包中的同名条目,而不影响其他条目。适用此机制的文件包括:
- 所有JSON UI文件
- 所有语言文件(
.lang) item_texture.jsonflipbook_textures.jsonterrain_texture.jsonsounds.jsonmusic_definitions.jsonsound_definitions.json
不可覆盖内容¶
以下内容无法通过上述任何方式进行覆盖:
- 原版物品(部分)
- 原版方块
- 原版迷雾效果(需改用新建赋命名空间的迷雾定义并在对应场合全局替换引用)
冲突¶
资源栈冲突通常发生在多个资源包修改同一个原版资源或使用相同短名称时。例如,两个资源包都覆盖同一个UI文件,只有优先级更高的文件会生效;两个附加包都使用table作为物品纹理短名称,则可能导致其中一个物品显示错误纹理。
良好的命名空间和独特资源短名称可以降低冲突概率。资源包若只是补充新资源,应尽量避免覆盖原版文件;若必须覆盖原版文件,应明确记录覆盖范围和可能影响。
与行为包栈¶
行为包也存在按顺序加载和覆盖的现象,但资源栈专指客户端资源包的叠加。行为包栈影响实体、物品、方块、函数、地物等服务端数据的解析;资源栈影响视觉、听觉和界面资源的解析。两者经常通过清单文件中的依赖关系配合使用。
调试¶
命令系统提供的/packstack命令可以输出当前客户端或服务端包栈信息,用于确认资源包或行为包的实际加载顺序。资源显示异常、模型不匹配或声音缺失时,检查资源栈顺序通常是定位问题的重要步骤。