• Minecraft 1.18.1、1.18.2模组开发 16.种植作物(crop)


    一年前的今天我们制作了1.12.2的作物教程:Minecraft 1.12.2模组开发(十五) 种植作物

    我们本次在1.18.2中实现一个农作物。

    1.在blocks包中新建一个我们的作物类BlockHerb。

    BlockHerb.java

    package com.joy187.re8joymod.blocks;
    
    import com.joy187.re8joymod.init.ItemInit;
    
    import net.minecraft.core.BlockPos;
    import net.minecraft.world.level.BlockGetter;
    import net.minecraft.world.level.ItemLike;
    import net.minecraft.world.level.block.Block;
    import net.minecraft.world.level.block.CarrotBlock;
    import net.minecraft.world.level.block.CropBlock;
    import net.minecraft.world.level.block.state.BlockState;
    import net.minecraft.world.phys.shapes.CollisionContext;
    import net.minecraft.world.phys.shapes.VoxelShape;
    
    public class BlockHerb extends CropBlock{
        //每个阶段我们的作物的高低
        private static final VoxelShape[] SHAPE_BY_AGE = new VoxelShape[]{
                Block.box(0.0D, 0.0D, 0.0D, 16.0D, 2.0D, 16.0D),
                Block.box(0.0D, 0.0D, 0.0D, 16.0D, 4.0D, 16.0D),
                Block.box(0.0D, 0.0D, 0.0D, 16.0D, 6.0D, 16.0D),
                Block.box(0.0D, 0.0D, 0.0D, 16.0D, 8.0D, 16.0D),
                Block.box(0.0D, 0.0D, 0.0D, 16.0D, 10.0D, 16.0D),
                Block.box(0.0D, 0.0D, 0.0D, 16.0D, 12.0D, 16.0D),
                Block.box(0.0D, 0.0D, 0.0D, 16.0D, 14.0D, 16.0D),
                Block.box(0.0D, 0.0D, 0.0D, 16.0D, 16.0D, 16.0D)};
    
        public BlockHerb(Properties builder)
        {
            super(builder);
        }
    
        //该作物对应哪个物品
        protected ItemLike getBaseSeedId() {
            return ItemInit.HERB.get();
        }
    
        public VoxelShape getShape(BlockState state, BlockGetter blockgetter, BlockPos blockpos, CollisionContext contex) {
            return SHAPE_BY_AGE[state.getValue(this.getAgeProperty())];
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    将我们的作物类在BlockInit中进行注册

        public static RegistryObject<Block> HERB_BLOCK = BLOCKS.register("herb_block",
        		()-> new CropBlock(BlockBehaviour.Properties.of(Material.PLANT).noCollission().randomTicks().instabreak().sound(SoundType.CROP)));
        
    
    • 1
    • 2
    • 3

    2.在ItemInit中声明一个我们的作物物品:

        //该作物对应我们的作物方块,可以定义吃了作物之后的回复值(像胡萝卜、土豆一样)
        public static final RegistryObject<Item> HERB = ITEMS.register("herb1",
                ()-> new ItemNameBlockItem(BlockInit.HERB_BLOCK.get(),new Item.Properties()
                        .tab(Main.TUTORIAL_TAB).food(new FoodProperties.Builder().nutrition(2).saturationMod(0.5F).alwaysEat().build())
        ));
        
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3.在项目主类的clientSetup()中添加我们的方块渲染模式

    
    	public Main() {
    		IEventBus bus = FMLJavaModLoadingContext.get().getModEventBus();
    
    		ItemInit.ITEMS.register(bus);
    		BlockInit.BLOCKS.register(bus);
    		EntityInit.ENTITY_TYPES.register(bus);
    		EffectInit.EFFECTS.register(bus);
    		PotionInit.POTIONS.register(bus);
    		SoundInit.SOUNDS.register(bus);
            
    
            //将我们的clientSetup函数进行注册
            bus.addListener(this::clientSetup);
    
    		MinecraftForge.EVENT_BUS.register(this);
    	}
    
        private void clientSetup(final FMLClientSetupEvent event) {
            //EntityRenderers.register(EntityInit.DUND1.get(), RenderDund::new);
            ItemBlockRenderTypes.setRenderLayer(BlockInit.EBONY_LEAVES.get(), RenderType.cutout());
            
            //添加这个,可以让我们的作物像小麦的生长图像一样
            ItemBlockRenderTypes.setRenderLayer(BlockInit.HERB_BLOCK.get(), RenderType.cutout());
    
            
            MenuScreens.register(MenuInit.VIRUS_GENERATOR_MENU.get(), VirusGeneratorScreen::new);
    
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    4.代码部分结束,进入资源包制作

    1.在resources\assets\你的modid\lang中的en_us.json添加我们作物的方块和物品的名称:

      "block.re8joymod.herb_block":"Herb",
      "item.re8joymod.herb1":"Herb",
    
    • 1
    • 2

    2.在blockstates中新建一个我们的作物.json文件,用来指定每一阶段的生长状态

    herb_block.json

    {
      "variants": {
        "age=0": {
          "model": "re8joymod:block/herb_block_stage0"
        },
        "age=1": {
          "model": "re8joymod:block/herb_block_stage1"
        },
        "age=2": {
          "model": "re8joymod:block/herb_block_stage2"
        },
        "age=3": {
          "model": "re8joymod:block/herb_block_stage3"
        },
        "age=4": {
          "model": "re8joymod:block/herb_block_stage4"
        },
        "age=5": {
          "model": "re8joymod:block/herb_block_stage5"
        },
        "age=6": {
          "model": "re8joymod:block/herb_block_stage6"
        },
        "age=7": {
          "model": "re8joymod:block/herb_block_stage7"
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    3.由于我们定义了8个阶段的作物生长流程,所以需要制作8个这样的方块模型文件,在models/block中新建八个文件

    cr4.png
    每一个都写成这种形式:
    herb_block_stage0.json

    {
      "parent": "minecraft:block/crop",
      "textures": {
        "crop": "re8joymod:block/herb_block_stage0"
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    4.在models/item中新建一个我们的物品模型文件

    herb1.json

    {
    	"parent": "item/generated",
    	"textures": {
    		"layer0": "re8joymod:items/herb1"
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    5.在textures/block中添加我们作物不同阶段的贴图:

    cr5.png

    6.在textures/item中添加我们作物的手持贴图:

    cr6.png

    7.在resources\data\你的modid\loot_tables\blocks下新建一个我们的作物战利品文件,指明我们破坏了作物后掉落什么:

    herb_block.json

    {
      "type": "minecraft:block",
      "pools": [
        {
          "rolls": 1.0,
          "entries": [
            {
              "type": "minecraft:alternatives",
              "children": [
                {
                  "type": "minecraft:item",
                  "conditions": [
                    {
                      "condition": "minecraft:block_state_property",
                      //对应我们的作物方块,到达最终阶段的掉落物
                      "block": "re8joymod:herb_block",
                      "properties": {
                        "age": "7"
                      }
                    }
                  ],
                  "name": "re8joymod:herb1"
                },
                {
                  //掉落我们的作物物品
                  "type": "minecraft:item",
                  "name": "re8joymod:herb1"
                }
              ]
            }
          ]
        }
      ],
      "functions": [
        {
          "function": "minecraft:explosion_decay"
        }
      ]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    5.保存所有文件 -> 进入游戏调试

    crop.png #### 各种生长状态都显示正常。

  • 相关阅读:
    python 图形界面“诈金花”游戏,更新了!附完整代码
    Dubbo之Adaptive注解用法
    < Python全景系列-3 > Python控制流程盘点及高级用法、神秘技巧大揭秘!
    基于vue的移动端如何监听系统返回
    44. 通配符匹配 ●●● & HJ71 字符串通配符 ●●
    03 MongoDB文档的各种增加、更新、删除操作总结
    初始化列表
    relectron框架——打包前端vue3、react为pc端exe可执行程序
    WPS-系统右键:开启后无法显示
    【Markdown语法高级】让你的博客更精彩(四:设置字体样式以及颜色对照表)
  • 原文地址:https://blog.csdn.net/Jay_fearless/article/details/124918333