首页 > 其他分享 >我的世界1.20.1模组开发---9.添加作物

我的世界1.20.1模组开发---9.添加作物

时间:2023-11-22 17:35:47浏览次数:34  
标签:模组 get CORN --- new 1.20 public 方块 作物

介绍

  这次我们来添加以下作物,类似于马铃薯、小麦之类的农作物,当我们种下种子后就会慢慢生长,当长到成熟阶段后,破坏农作物我们可以获取到对应的种子和果实。这次我们来添加一个玉米作物,大致流程就是种下玉米种子后等待一定时间后就会成熟,我们破坏掉成熟的作物后,就会掉落玉米和玉米种子。玉米的状态和原版的小麦是一样的,所以我们这次就根据原版的小麦的写法来创建玉米。我们可以进到Items类(这个类里面放了所有原版的物品,我们开发中可以参考里面的物品的写法)中搜索WHEAT关键字,就能看到小麦是如何实现的了。

  由于作物涉及到多个物品,所以我们总共需要注册两个item(玉米种子、玉米果实)和一个block(玉米作物方块),这个方块就是我们把种子种到耕地后,能在耕地看到这个作物方块只是它不是一整个方块大小,总之我们添加玉米作物就要注册这三个东西,缺一不可。

  这次注册种子物品时和以前不一样的是,我们这次不能直接new一个Item类,要new一个ItemNameBlockItem类。注册玉米果实时,直接new一个Item类就行,但是因为玉米果实是可以直接吃的,我们需要设置属性时添加是food属性来设置食物的各种参数。另外在注册玉米作物方块时也和平常的方块注册有所不同,这里的不同后面再具体描述。

  下面是注册玉米的种子和果实的代码,要注意和其他的物品注册不同。

//添加玉米种子(注意这里要new一个ItemNameBlockItem类)
    public static final RegistryObject<Item>CORN_SEED=ITEMS.register("corn_seed",
            ()->new ItemNameBlockItem(ModBlocks.CORN_CROP.get(),new Item.Properties()));

    //添加玉米果实
    public static final RegistryObject<Item>CORN=ITEMS.register("corn",
            ()->new Item(new Item.Properties()
                    .food(new FoodProperties.Builder()//为这个物品添加食物属性
                            .nutrition(2)//营养值
                            .saturationMod(2F)//饱食度
                            //吃完后的效果,给玩家添加了一个再生效果,依次为 玩家获得的效果、持续时间(20=1s)、等级(从0开始),触发概率
                            .effect(new MobEffectInstance(MobEffects.REGENERATION, 400, 1), 1.0F).build())));

  我们还需要新建一个CornCrop类用来创建我们的玉米作物方块,这个类需要继承CropBlock类,这是原版的作物方块类,小麦作物方块就是用这个类创建的,但是因为我们想设置一些和原版不一样的地方,所以需要继承这个类并重写下面的这些方法来实现。

public class CornCrop extends CropBlock {
    public static final IntegerProperty AGE=IntegerProperty.create("age",0,6);
    public CornCrop(Properties pProperties) {
        super(pProperties);
    }

    @Override
    protected IntegerProperty getAgeProperty() {
        return AGE;
    }

    @Override
    public int getMaxAge() {
        return 6;
    }

    @Override
    protected ItemLike getBaseSeedId() {
        return ModItems.CORN_SEED.get();
    }

    @Override
    protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> pBuilder) {
        pBuilder.add(AGE);
    }
}

  我们需要创建一个IntegerProperty类型的变量来表示玉米作物的生长周期,上述代码中说明了玉米作物的最小阶段为0,最大阶段为6,也就是有7个阶段。因为每一个阶段的样子都不一样,所以我们也就需要七张不同的贴图来显示不同时期的作物方块。创建好这个类之后,直接在ModBlocksnew这个类注册一个作物方块即可。

  另外,因为作物方块属于一个多状态的方块,再使用方块模型生成器生成json文件时也和其他的方块有所不同。

        //添加作物方块
        this.registerCropBlockModel(ModBlocks.CORN_CROP.get());
        


        //注册作物方块
        public void registerCropBlockModel(Block block){
            //获取最大生成阶段
            int maxAge= CropBlock.MAX_AGE;
            //因为这是一个多状态方块,要用这个构造器类为每个阶段创建一个不同的模型
            VariantBlockStateBuilder builder =getVariantBuilder(block);
            //变量每个阶段,为每个阶段创建一个模型
            for(int i=0;i<maxAge;i++){
                //注意,是CornCrop.AGE,而不是CornBlock.AGE,这里传入的AGE必须是我们定义的才行
                builder.partialState().with(CornCrop.AGE,i).modelForState()//这句是在i阶段创建了一个基础模型
                      .modelFile(models().crop(name(block).split("_")[0]+"_stage"+i,
                                               cropTextureSuffix(block,"_stage"+i)).renderType("cutout"))//对模型进行设置
                        .addModel();//完成模型配置
            }
        }
        
    public ResourceLocation cropTextureSuffix(Block block,String suffix){
        ResourceLocation name=key(block);
        return new ResourceLocation(name.getNamespace(),ModelProvider.BLOCK_FOLDER+"/"+name.getPath().split("_")[0]+suffix);
    }


    public ResourceLocation key(Block block){
        return ForgeRegistries.BLOCKS.getKey(block);
    }

    public String name(Block block){
        return key(block).getPath();
    }

代码

  首先我们需要在ModItems类里注册我们的种子和果实。

    //添加玉米种子
    public static final RegistryObject<Item>CORN_SEED=ITEMS.register("corn_seed",
            ()->new ItemNameBlockItem(ModBlocks.CORN_CROP.get(),new Item.Properties()));

    //添加玉米果实
    public static final RegistryObject<Item>CORN=ITEMS.register("corn",
            ()->new Item(new Item.Properties()
                    .food(new FoodProperties.Builder()//为这个物品添加食物属性
                            .nutrition(2)//营养值
                            .saturationMod(2F)//饱食度
                            //吃完后的效果,给玩家添加了一个效果,依次为 玩家获得的效果、持续时间(20=1s)、等级(从0开始),触发概率
                            .effect(new MobEffectInstance(MobEffects.REGENERATION, 400, 1), 1.0F).build())));

  然后需要在block/custom目录下创建一个CornCrop类表示我们的作物方块,这个类要继承CropBlock类,并重写下面的这些方法。

public class CornCrop extends CropBlock {
    //创建一个作物生长阶段的属性,参数依次为 名称  最小阶段  最大阶段
    public static final IntegerProperty AGE=IntegerProperty.create("age",0,6);
    public CornCrop(Properties pProperties) {
        super(pProperties);
    }

    @Override
    protected IntegerProperty getAgeProperty() {
        return AGE;
    }
    //这里需要返回我们的最大阶段
    @Override
    public int getMaxAge() {
        return 6;
    }

    @Override
    protected ItemLike getBaseSeedId() {
        return ModItems.CORN_SEED.get();
    }
    
    //把我们的阶段属性添加到构造器
    @Override
    protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> pBuilder) {
        pBuilder.add(AGE);
    }
}

  然后再到ModBlocks类注册玉米作物方块,因为是参考原版的小麦来的,属性直接复制原版的小麦即可。

    //注册玉米作物方块
    public static  final RegistryObject<Block>CORN_CROP=BLOCKS.register("corn_crop",
            ()->new CornCrop(BlockBehaviour.Properties.copy(Blocks.WHEAT)));

  接着就需要到ModItemModelGen类中设置玉米种子和玉米果实的模型json文件。

        itemGenerateModel(ModItems.CORN.get(),resourceItem(itemName(ModItems.CORN.get())));
        itemGenerateModel(ModItems.CORN_SEED.get(),resourceItem(itemName(ModItems.CORN_SEED.get())));

  然后去ModBlockModelGen类设置作物方块的模型json文件。 

//添加作物方块
        this.registerCropBlockModel(ModBlocks.CORN_CROP.get());


    //注册作物方块
    public void registerCropBlockModel(Block block){
        int maxAge= CropBlock.MAX_AGE;
        VariantBlockStateBuilder builder =getVariantBuilder(block);
        for(int i=0;i<maxAge;i++){
            //注意,是CornCrop.AGE,而不是CornBlock.AGE,这里传入的AGE必须是我们定义的才行
            builder.partialState().with(CornCrop.AGE,i).modelForState()
                  .modelFile(models().crop(name(block).split("_")[0]+"_stage"+i,
                          cropTextureSuffix(block,"_stage"+i)).renderType("cutout"))
                    .addModel();
        }
    }


    public ResourceLocation cropTextureSuffix(Block block,String suffix){
        ResourceLocation name=key(block);
        return new ResourceLocation(name.getNamespace(),ModelProvider.BLOCK_FOLDER+"/"+name.getPath().split("_")[0]+suffix);
    }


    public ResourceLocation key(Block block){
        return ForgeRegistries.BLOCKS.getKey(block);
    }

    public String name(Block block){
        return key(block).getPath();
    }

  因为破坏成熟的作物会掉落种子和果实,所以还需要在ModLootTableGen类里面设置一下作物方块的掉落物,这里可以直接参考原版小麦的写法,修改一些参数即可。

        add(ModBlocks.CORN_CROP.get(),(block)->{
            //                           掉落的果实,        掉落的种子 ,              这个参数复制原版的改一下参数就行
            return createCropDrops(block,ModItems.CORN.get(),ModItems.CORN_SEED.get(),lootitemcondition$builder1);
        });
        //从原版复制过来,修改一下参数即可                                                                              这里改成我们的作物方块|||                       这里填写我们作物的AGE属性,以及可收获果实的阶段(一般都是最大阶段)|||
        LootItemCondition.Builder lootitemcondition$builder1 = LootItemBlockStatePropertyCondition.hasBlockStateProperties(ModBlocks.CORN_CROP.get()).setProperties(StatePropertiesPredicate.Builder.properties().hasProperty(CropBlock.AGE, 6));

  最后在ModLangGen类里面生成一些种子和果实的语言文件即可。

        add(ModItems.CORN.get(),"Corn");
        add(ModItems.CORN_SEED.get(),"Corn Seed");

  最后把贴图放到对应位置即可。

标签:模组,get,CORN,---,new,1.20,public,方块,作物
From: https://www.cnblogs.com/xiaomingbook/p/17849887.html

相关文章

  • 家宽-6- ESXI下安装ikuai
    一: 下载ikuai的ISO镜像文件到电脑桌面下载链接:https://www.ikuai8.com/component/download(注意:32位的镜像至少分配1G内存给虚拟机,64位的至少4G内存)   二:登录esxi, 创建ikuai虚拟机,点击:虚拟机—创建/注册虚拟机   三:  选择创建新虚拟机,点击下一页  ......
  • JD-GUI 反编译jar包
    JD-GUI反编译jar包,jar包反编译成java文件下载网上开源jar包或者其他项目提供了jar但是没有源码此时需要反编译1.下载jd-guihttps://jd-gui.apponic.com/mac/选择适合自己的版本2.解压tar-xvfjd-gui-osx-1.6.6.tar3.点击jd-gui.app打开软件如果出现无法验证开发者,你确定要运行此......
  • flotat浮点数类型的误差问题,float a=0.1; 2-a*a*100,和int(2-a*a*100); float的误差问
    来在于洛谷的《深入浅出程序设计竞赛》(基础篇)#include<stdio.h>intmain(){ floata=0.1; printf("%f%f\n",a,a*a); printf("%d\n",int(2-a*a*100)); printf("%.10f",2-a*a*100); return0;}执行结果 原因是这样的,float是浮点数,在执行界面出现的6位小......
  • 设计模式学习每日总结-第十天
    第十天装饰模式:动态地给一个对象增加额外职责。有点:更灵活地增加子类缺点:小子类多,占资源  ......
  • [Navicat 更新试用脚本 -- bat]
    [Navicat更新试用脚本--bat]注意:将下方代码写入文件,后缀改为.bat,最后双击执行即可!@echooffechoDeleteHKEY_CURRENT_USER\Software\PremiumSoft\NavicatPremium\Registration[versionandlanguage]for/f%%iin('"REGQUERY"HKEY_CURRENT_USER\Software\PremiumSo......
  • 老知识复盘-SQL从提交到执行到底经历了什么
    一、什么是SQLsql(StructuredQueryLanguage:结构化查询语言)是高级的费过程化编程语言,允许用户在高层数据结构上工作,是一种数据查询和程序设计语言,也是(ANSI)的一项标准的计算机语言.but...目前仍然存在着许多不同版本的sql语言,为了与ANSI标准相兼容,它们必须以相似......
  • 基于CrossLink-NX FPGA的核心板电路设计
     引言FieldProgrammableGate Array(简称,FPGA)于1985年由XILINX创始人之一RossFreeman发明,第一颗FPGA芯片XC2064为XILINX所发明,FPGA一经发明,后续的发展速度之快,超出大多数人的想象,近些年的FPGA,始终引领先进的工艺。在通信等领域FPGA有着广泛的应用,通信领域需要高速的通信协......
  • Transferability of the Chinese Eco-environmental Protection Measure
    TheUnitedStatesfacesmultipleairpollutionproblems,someofwhichmainlyinclude:1.CarbondioxideemissionsTheUnitedStatesisoneofthelargestcarbondioxideemittersintheworld.Thisismainlyduetoitshighindustrializationandhighenerg......
  • 【luogu题解】P9749 [CSP-J 2023] 公路
    \(Meaning\)\(Solution\)这道题我来讲一个不一样的解法:\(dp\)在写\(dp\)之前,我们需要明确以下几个东西:状态的表示,状态转移方程,边界条件和答案的表示。状态的表示\(dp[i]\)表示到达第\(i\)个站点所需要的最少钱数,\(w[i]\)表示在使用最少钱数到达第\(i\)个站点时多余......
  • 14-基础SQL-DCL(数据控制语言)
    DCL-介绍DCL英文全称是DataControlLanguage(数据控制语言),用来管理数据库用户、控制数据库的访问权限DCL-管理用户查询用户(用户信息通常保存在mysql数据库下的user表)USEmysql;SELECT*FROMuser;创建用户CREATEUSER"用户名"@"主机名"IDENTIFIED"密码";......