的NeoForge1.20.4Mod开发的视频,这篇教程是我边学边总结的,与其说是教程更像我的学习笔记,如有不清楚的地方,大家可以在评论区提问。在我力所能及的范围内,我都会解答的。
物品属性覆盖(Item Property Override)是一个Minecraft原版的机制,用来实现比如弓箭根据不同的拉弓时间显示不同的弓的模型。我们用原版bow.json的模型文件,来解释一下什么是物品属性覆盖,
{
……省略内容……
"overrides": [
{
"predicate": {
"pulling": 1
},
"model": "item/bow_pulling_0"
},
{
"predicate": {
"pulling": 1,
"pull": 0.65
},
"model": "item/bow_pulling_1"
},
{
"predicate": {
"pulling": 1,
"pull": 0.9
},
"model": "item/bow_pulling_2"
}
]
}
"overrides" 是一个 模型覆盖规则数组:
"overrides": [
{ "predicate": {...}, "model": "..." },
{ "predicate": {...}, "model": "..." },
…
]
predicate(条件) 一组键值对,用来判断当前物品是否满足这个条件。
model(模型路径) 如果条件满足,就用这个模型来渲染它。
条件检查采用的是“大于等于”的规则 —— 只要属性值 ≥ predicate 指定值,这条规则就匹配
{
"predicate": {
"pulling": 1
},
"model": "item/bow_pulling_0"
}
bow.json这里的内容非常容易理解。当条件里的predicate(在游戏中定义会动态变化)的pulling大于等于1时(即处于拉弓状态),加载对应的模型,也就是item/bow_pulling_0。
我们也正要实现一个类似的功能,在这节中我们要实现一个「魔法锭」会根据物品堆叠的数量动态的改变模型。
创建MagicIngot类
public class MagicIngot extends Item {
public MagicIngot() {
super(new Properties());
}
}
创建PropertyRegistry类

@Mod.EventBusSubscriber(modid = ExampleMod.MODID,bus = Mod.EventBusSubscriber.Bus.MOD,value = Dist.CLIENT)
/**modid = ExampleMod.MODID: 指定了模组的ID,用来确保这个事件只属于ExampleMod模组
bus = Mod.EventBusSubscriber.Bus.MOD: 这里的MOD表示的是模组的事件
value = Dist.CLIENT: 指定事件只会在客户端触发。因为 ItemProperties 注册通常和物品的显示相关,必须在客户端执行*/
public class PropertyRegistry {
@SubscribeEvent//这个注解的作用是将一个方法标记为事件监听器,即当特定的事件发生时,Forge会自动调用这个方法来处理事件。
public static void propertyOverrideRegisTry(FMLClientSetupEvent event){//FMLClientSetupEvent是Forge提供的一个事件,用于在客户端启动时进行一些初始化操作
event.enqueueWork(()->{//将物品属性注册任务加入到客户端的工作队列中
ItemProperties.register(ModItems.MAGICINGOT.get(),new ResourceLocation(ExampleMod.MODID,"size"),(itemStack,level,livingEntity,int_num)->{//这个lambda的作用是根据物品的数量(getCount())来设置属性值
return itemStack.getCount();
});
});
}
}
模型JSON
{
"parent": "item/generated",//generated 模型通常用于不需要复杂渲染效果的物品
"textures": {
"layer0": "item/iron_ingot"//物品的默认外观是铁锭。你可以使用自己画的贴图,不过路径要改一下,之前的教程里有说
},
"overrides": [
{
"predicate": {
"examplemod:size": 16//物品堆叠数量大于等于16时,变成金锭。这里的examplemod:size就是前面方法里new ResourceLocation(ExampleMod.MODID,"size")新建的
},
"model": "item/gold_ingot"
}
]
}
效果展示

© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
















![表情[ciya]-方块工坊](https://crapark.com/wp-content/themes/zibll/img/smilies/ciya.gif)
![表情[se]-方块工坊](https://crapark.com/wp-content/themes/zibll/img/smilies/se.gif)
![表情[jie]-方块工坊](https://crapark.com/wp-content/themes/zibll/img/smilies/jie.gif)
暂无评论内容