从调用链上看,mc在渲染物品的时候需要一个BakedModel,这个对象在ItemRenderer
的getModel
方法中返回
1 | public BakedModel getModel(ItemStack stack, int seed) { Level level, LivingEntity entity, |
这里可以看到mc对三叉戟模型和望远镜模型做了特殊判定,下面会继续从itemModelShaper
中获取模型,这里neoforge把它替换为了RegistryAwareItemModelShaper
来进行处理。
1 | /** |
我们可以看到每个Item
对应着一个BakedModel
,而ModelResourceLocation
与BakedModel
的对应关系在ModelManager
中声明。那么结论是,我们只需要把ModelManager中Map<ModelResourceLocation, BakedModel> bakedRegistry
记录的对应数据覆写,即可实现替换目标模型。
这里,neoforge提供了一个事件ModelEvent.ModifyBakingResult,可以用来往models中写入新的或覆写键值对。
1 |
|
这样,我们就实现了偷天换日,直接在模型加载层面上替换为了实现了BakedModel接口的新类BitItemSmartModel。