Table of Contents

添加自定义作物

本教程将教会您如何添加像小麦和胡萝卜那样的作物。创建自定义的作物时,需要做以下这些事情:

创建作物类

为创建自定义作物,我们需要先创建一个方块类。你需要用你的作物名称命名你的类,并且继承 CropBlock。你还需要添加 AbstractBlock.Settings 并为作物创建形状。

  1. public class CustomCropBlock extends CropBlock {
  2. public CustomCropBlock(AbstractBlock.Settings settings) {
  3. super(settings);
  4. }
  5.  
  6. }

配置完成后,你需要定义你的种子物品并添加外观形状。每个 Block.createCubiodShape 都为作物生长的各个阶段定义了碰撞箱的大小。你可以根据自己的喜好进行配置,或者什么也不做,而是直接使用原版继承自 CropBlock 的,会直接使用和小麦一样的形状。

我们还没有添加种子物品,因此暂时先使用其他的。下面的代码,使用长方体形状、种子物品和外观形状应该是这样子:

  1. public class CustomCropBlock extends CropBlock {
  2. private static final VoxelShape[] AGE_TO_SHAPE = new VoxelShape[]{Block.createCuboidShape(0.0D, 0.0D, 0.0D, 16.0D, 2.0D, 16.0D),
  3. Block.createCuboidShape(0.0D, 0.0D, 0.0D, 16.0D, 3.0D, 16.0D),
  4. Block.createCuboidShape(0.0D, 0.0D, 0.0D, 16.0D, 4.0D, 16.0D),
  5. Block.createCuboidShape(0.0D, 0.0D, 0.0D, 16.0D, 5.0D, 16.0D),
  6. Block.createCuboidShape(0.0D, 0.0D, 0.0D, 16.0D, 6.0D, 16.0D),
  7. Block.createCuboidShape(0.0D, 0.0D, 0.0D, 16.0D, 7.0D, 16.0D),
  8. Block.createCuboidShape(0.0D, 0.0D, 0.0D, 16.0D, 8.0D, 16.0D),
  9. Block.createCuboidShape(0.0D, 0.0D, 0.0D, 16.0D, 9.0D, 16.0D)
  10. };
  11.  
  12. public CustomCropBlock(AbstractBlock.Settings settings) {
  13. super(settings);
  14. }
  15.  
  16. @Override
  17. protected ItemConvertible getSeedsItem() {
  18. return TutorialItems.CUSTOM_SEEDS;
  19. }
  20.  
  21. @Override
  22. protected VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
  23. return AGE_TO_SHAPE[getAge(state)];
  24. }
  25. }

注册你的作物和种子物品

现在需要注册作物和用作种子的物品。种子模型和类(包括为方便而用的静态 static 方法)本页不作介绍,请参考 itemsblocks 页面。特别要注意,要添加 AliasedBlockItem 以确保您的种子物品绑定到作物方块上。

TutorialBlocks.java
  1. public static final CropBlock CUSTOM_CROP = register("custom_crop", new CustomCropBlock(AbstractBlock.Settings.create().nonOpaque().noCollision().ticksRandomly().breakInstantly().sounds(BlockSoundGroup.CROP)));
TutorialItems.java
  1. public static final Item CUSTOM_SEEDS = register("custom_seeds", new AliasedBlockItem(TutorialBlocks.CUSTOM_CROP, new Item.Settings()));

你很可能还需要 BlockRenderMapLayer,这样你的作物才会显示为透明裁切的格式(参见 blockappearance)。在客户端初始化器中:

TutorialModClient.class
  1. @Environment(EnvType.CLIENT)
  2. public class ExampleModClient implements ClientModInitializer {
  3. // ...
  4.  
  5. @Override
  6. public void onInitializeClient() {
  7. // ...
  8. BlockRenderLayerMap.INSTANCE.putBlocks(RenderLayer.getCutout(), TutorialBlocks.CUSTOM_CROP);
  9. }
  10. }

创建方块状态和模型

我们已经完成了注册和代码,现在需要添加模型。下面的例子展示了使用 minecraft:block/crop 格式的简单生长阶段模型。你也可以使用 minecraft:block/cross 以使用交叉形的模型。您必须为拥有的每个生长阶段创建一个单独的模型。这个例子只呈现了单一的阶段,你可以将“0”替换成对应的生长阶段的数字。

src/main/resources/assets/tutorial/models/block/custom_crop_stage0.json
{
  "parent": "minecraft:block/crop",
  "textures": {
    "crop": "tutorial:block/custom_crop_stage0"
  }
}

最后,您还需要为您的作物创建方块状态,以给作物的每个生长阶段都注册单独的模型。

src/main/resources/assets/tutorial/blockstates/custom_crop.json
{
  "variants": {
    "age=0": {
      "model": "tutorial:block/custom_crop_stage0"
    },
    "age=1": {
      "model": "tutorial:block/custom_crop_stage0"
    },
    "age=2": {
      "model": "tutorial:block/custom_crop_stage1"
    },
    "age=3": {
      "model": "tutorial:block/custom_crop_stage1"
    },
    "age=4": {
      "model": "tutorial:block/custom_crop_stage2"
    },
    "age=5": {
      "model": "tutorial:block/custom_crop_stage2"
    },
    "age=6": {
      "model": "tutorial:block/custom_crop_stage3"
    },
    "age=7": {
      "model": "tutorial:block/custom_crop_stage3"
    }
  }
}

战利品表

方块还需要战利品表,否则被破坏后什么也不会掉落。不过,你可以直接模仿原版的。例如,复制原版的 data/minecraft/loot_table/blocks/wheat.json 到你模组的 src/main/resources/data/tutorial/loot_table/blocks/custom_crop.json 并替换相关的 ID。也可以使用数据生成器生成战利品表。

大功告成!

如果你正确完成了本教程的所有部分,那么你现在就应该有一个生效的作物了!这个作物可以用骨粉催熟,并且只能用种子物品放置在耕地上。