NeoForge-1.20.4Mod开发教程之物品属性覆盖

NeoForge-1.20.4Mod开发教程之物品属性覆盖

本篇教程参考为Flandre芙兰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类

2d9b71759520260130142959

@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"
    }
  ]
 }

最后不要忘记注册和添加到创造物品栏

 

效果展示

13f6e4f77520260130142930

© 版权声明
THE END
喜欢就支持一下吧
点赞4 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容