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