![[TaCZ] Timeless and Classics Zero](https://media.forgecdn.net/avatars/thumbnails/1005/666/256/256/638527114344804635.png)
[Bug]: 向更新版本升级会导致旧的物品出现丢失材质的现象
SNWCreations opened this issue · 7 comments
我已确认 ...
- 我正在使用最新版的tacz
- 无法在不安装tacz时复现
Minecraft和模组加载器版本
Minecraft 1.20.1, Forge 47.2.0
tacz的版本
1.1.4
Related Mods
None
Description
如题,个人建议增加 DataFixer 用于更新数据(并将其暴露给枪包,如果可能)。如果旧的物品被移除,则直接移除。
这或许不是一个立刻可以完成的事情,但是如果数据结构会有 breaking change 的话,则应该做向下兼容。
复现步骤
- 在装载 TACZ 1.0.3 的端上创建一个世界,拿出一些枪和配件,保存世界
- 升级模组到 1.1.4 ,加载世界
- 有些配件已经丢失材质
日志和崩溃报告
No response
看了一圈forge好像没给原版的dfu开相关接口,我也没搜到相关资料,所以我在思考一些低成本方案,比如把旧版id在API中和新的id都映射到新的内容上,这样就都可以用,但是可能会影响外部一些直接访问nbt判断的东西,比如服务器什么的
看了一圈forge好像没给原版的dfu开相关接口,我也没搜到相关资料,所以我在思考一些低成本方案,比如把旧版id在API中和新的id都映射到新的内容上,这样就都可以用,但是可能会影响外部一些直接访问nbt判断的东西,比如服务器什么的
对于目前以新功能为主要目标的开发工作来说,API breakage 不可怕,文档写好了就没什么大问题。
映射不是个好主意,因为命令没法 datafix :/
有人在 5 年前尝试给 1.13 的 Forge 写了 DFU 的接口,但是 stale 了:MinecraftForge/MinecraftForge#5695
如果要加入我们自己的 DFU rule ,从用 Mixin 注入 net.minecraft.util.datafix.DataFixers#addFixers 方法开始。
一个难点是,怎么让 MC 认识我们的 DataVersion ,从而针对我们的NBT升级。
又或者,注入加载 ItemStack 的过程,使用我们自己的 DataFixer ,不和MC的混一起(这样确实会更好,避免混淆)
最后,Item#verifyTagAfterLoad 或许是最好的选择?我们可以在这里完成 DataFix ?