[TaCZ] Timeless and Classics Zero

[TaCZ] Timeless and Classics Zero

7M Downloads

[Bug]: 向更新版本升级会导致旧的物品出现丢失材质的现象

SNWCreations opened this issue · 7 comments

commented

我已确认 ...

  • 我正在使用最新版的tacz
  • 无法在不安装tacz时复现

Minecraft和模组加载器版本

Minecraft 1.20.1, Forge 47.2.0

tacz的版本

1.1.4

Related Mods

None

Description

如题,个人建议增加 DataFixer 用于更新数据(并将其暴露给枪包,如果可能)。如果旧的物品被移除,则直接移除。
这或许不是一个立刻可以完成的事情,但是如果数据结构会有 breaking change 的话,则应该做向下兼容。

复现步骤

  1. 在装载 TACZ 1.0.3 的端上创建一个世界,拿出一些枪和配件,保存世界
  2. 升级模组到 1.1.4 ,加载世界
  3. 有些配件已经丢失材质

日志和崩溃报告

No response

commented

具体列一下丢失的内容?理论上对原有的数据结构没有几乎任何影响,只是移动了文件位置和加载方式

commented

查证过了,是之前有一个commit试图把消音器的错误拼写纠正导致的)

commented
commented

看了一圈forge好像没给原版的dfu开相关接口,我也没搜到相关资料,所以我在思考一些低成本方案,比如把旧版id在API中和新的id都映射到新的内容上,这样就都可以用,但是可能会影响外部一些直接访问nbt判断的东西,比如服务器什么的

commented

看了一圈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 ?

commented
commented

主要问题是这完全是个意外情况,当时我没注意到有这条提交,否则我当时就拦下来了(
这样看来这个位置确实是比较合适的,因为快上线了,最近也得考试,我先临时写一个简单补丁,至于枪包接口后续再看有没有需要吧