a458461328
求助,怎么把自己的MOD放到最后加载,我每次新添物品都会导致其他mod的物品id发生变化

3TUSK
导致其他mod的物品id发生变化

这就是数字 ID 从 1.8 开始就 depreacted 然后你现在还在用的理由?

z15203234760@si
不错不错

SumCraft
增加新物品,新物品的数字id不会占用以后的物品的.如果是单机的话,每次重开世界都可能是新的id

a458461328
本帖最后由 a458461328 于 2021-9-10 09:38 编辑
3TUSK 发表于 2021-9-10 09:08
这就是数字 ID 从 1.8 开始就 depreacted 然后你现在还在用的理由?

因为我要在我的MOD里生成其他MOD的物品和生物,只能根据id在所有已注册的物品中寻找.找不到这方面的资料就只好这样,请大佬指点一下

a458461328
咸鱼气功王 发表于 2021-9-10 09:35
增加新物品,新物品的数字id不会占用以后的物品的.如果是单机的话,每次重开世界都可能是新的id ...

原来每次重开id会变啊,了解,谢谢大佬解答

SumCraft
a458461328 发表于 2021-9-10 09:42
原来每次重开id会变啊,了解,谢谢大佬解答

你可以使用material name(不知道forge是不是也这么叫的)去获取其他mod的物品的

a458461328
咸鱼气功王 发表于 2021-9-10 09:44
你可以使用material name(不知道forge是不是也这么叫的)去获取其他mod的物品的

好的,这就去实践一下

a458461328
咸鱼气功王 发表于 2021-9-10 09:44
你可以使用material name(不知道forge是不是也这么叫的)去获取其他mod的物品的

实践回来了
1.当mods不变时,重开世界并不会导致ID改变(重开了10次,可能数据不过多)
2.当mods改变后,继续之前的存档也不会改变ID
3.当mods改变后,重开世界会ID会有变化

使用 Item.getItemById(ID) 会在mod修改后ID变化导致不可以
修改为 Item.getByNameOrId("物品名称") 解决问题

另外想请教一下如何生成其他mod的生物

3TUSK
本帖最后由 3TUSK 于 2021-9-10 11:10 编辑
a458461328 发表于 2021-9-10 09:36
因为我要在我的MOD里生成其他MOD的物品和生物,只能根据id在所有已注册的物品中寻找.找不到这方面的资料就 ...

ForgeRegistries.ITEMS.getValue(...)。
实体则是 ForgeRegistries.ENTITIES.getValue(...),返回的是 Forge 的 EntityEntry<?>,你可以在这里找到实体的工厂方法。
对 1.13+ 来说,ForgeRegistries.ENTITIES.getValue(...) 返回的是原版的 EntityType<?>,这个类取代了旧版 Forge 的 EntityEntry<?>。


数字 ID 从 1.7 开始就是自动分配的,自动分配的原则大抵是先到先得:如果后来加了新 Mod,那 Mod 抢到哪一个数字 ID 就完全不好说了。

但是数字 ID 到 ResourceLocation 之间的映射是保存在 level.dat 里的。这意味着,对于一个已经建立的存档,数字 ID 的分配是固定的,而此时对于新加的 Mod 的方块物品等等来说他们会重新进行一次 ID 分配。对 Forge 来说,Forge 从 1.7 以来就一直接管着这整个过程。

对于 Forge 来说,数字 ID 不会被回收:当你删除一个 Mod 后再添加新 Mod,新 Mod 不会获得删掉的 Mod 已经占用的数字 ID。此时若再加入被删除的 Mod,不仅可以拿到之前已经占去的数字 ID,若世界中存在被删除的 Mod 的方块等且未被其他方块覆盖,也会被恢复(这个过程偶尔会被称为 Resuscitation)。

a458461328
3TUSK 发表于 2021-9-10 11:02
ForgeRegistries.ITEMS.getValue(...)。
实体则是 ForgeRegistries.ENTITIES.getValue(...),返回的是 For ...

懂了,非常感谢大佬