====== 添加自定义作物 ======
本教程将教会您如何添加像小麦和胡萝卜那样的作物。创建自定义的作物时,需要做以下这些事情:
* 自定义的种子物品
* 作物方块和种子物品的注册表
* 作物方块类
* 为你的作物设计的方块状态和模型
===== 创建作物类 =====
为创建自定义作物,我们需要先创建一个方块类。你需要用你的作物名称命名你的类,并且继承 ''CropBlock''。你还需要添加 ''AbstractBlock.Settings'' 并为作物创建形状。每个 ''Block.createCubiodShape'' 都定义了作物在各生长阶段的碰撞箱大小。你可以根据自己的喜好来配置这些值。
public class CustomCropBlock extends CropBlock {
private static final VoxelShape[] AGE_TO_SHAPE = new VoxelShape[]{Block.createCuboidShape(0.0D, 0.0D, 0.0D, 16.0D, 2.0D, 16.0D),
Block.createCuboidShape(0.0D, 0.0D, 0.0D, 16.0D, 3.0D, 16.0D),
Block.createCuboidShape(0.0D, 0.0D, 0.0D, 16.0D, 4.0D, 16.0D),
Block.createCuboidShape(0.0D, 0.0D, 0.0D, 16.0D, 5.0D, 16.0D),
Block.createCuboidShape(0.0D, 0.0D, 0.0D, 16.0D, 6.0D, 16.0D),
Block.createCuboidShape(0.0D, 0.0D, 0.0D, 16.0D, 7.0D, 16.0D),
Block.createCuboidShape(0.0D, 0.0D, 0.0D, 16.0D, 8.0D, 16.0D),
Block.createCuboidShape(0.0D, 0.0D, 0.0D, 16.0D, 9.0D, 16.0D)
};
public CustomCropBlock(AbstractBlock.Settings settings) {
super(settings);
}
}
配置完成后,你需要定义你的种子物品并添加外观性状。我们还没有添加种子物品,因此暂时先使用其他的。下面的代码,使用长方体形状、种子物品和外观形状应该是这样子:
public class CustomCropBlock extends CropBlock {
private static final VoxelShape[] AGE_TO_SHAPE = new VoxelShape[]{Block.createCuboidShape(0.0D, 0.0D, 0.0D, 16.0D, 2.0D, 16.0D),
Block.createCuboidShape(0.0D, 0.0D, 0.0D, 16.0D, 3.0D, 16.0D),
Block.createCuboidShape(0.0D, 0.0D, 0.0D, 16.0D, 4.0D, 16.0D),
Block.createCuboidShape(0.0D, 0.0D, 0.0D, 16.0D, 5.0D, 16.0D),
Block.createCuboidShape(0.0D, 0.0D, 0.0D, 16.0D, 6.0D, 16.0D),
Block.createCuboidShape(0.0D, 0.0D, 0.0D, 16.0D, 7.0D, 16.0D),
Block.createCuboidShape(0.0D, 0.0D, 0.0D, 16.0D, 8.0D, 16.0D),
Block.createCuboidShape(0.0D, 0.0D, 0.0D, 16.0D, 9.0D, 16.0D)
};
public CustomCropBlock(AbstractBlock.Settings settings) {
super(settings);
}
public ItemConvertible getSeedsItem() {
return TutorialMod.CUSTOM_SEEDS;
}
public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
return AGE_TO_SHAPE[(Integer)state.get(this.getAgeProperty())];
}
}
===== 注册您的作为和种子物品 =====
现在需要注册作物和用作种子的物品。本教程不介绍种子模型和类,请参考 [[items]] 页面。特别要注意,要添加 ''AliasedBlockItem'' 以确保您的种子物品绑定到作物方块上。
public class TutorialMod implements ModInitializer {
public static final CropBlock CUSTOM_CROP_BLOCK = new CustomCropBlock(AbstractBlock.Settings.create().nonOpaque().noCollision().ticksRandomly().breakInstantly().sounds(BlockSoundGroup.CROP));
public static final Item CUSTOM_SEEDS = new AliasedBlockItem(TutorialMod.CUSTOM_CROP_BLOCK, new Item.Settings().group(ItemGroup.MISC));
@Override
public void onInitialize() {
Registry.register(Registries.BLOCK, new Identifier("tutorial","custom_crop_block"), CUSTOM_CROP_BLOCK);
Registry.register(Registries.ITEM, new Identifier("tutorial","custom_seeds"), CUSTOM_SEEDS);
}
}
你很可能还需要 ''BlockRenderMapLayer'',这样你的作物才会显示为透明裁切的格式。在客户端初始化器中:
@Environment(EnvType.CLIENT)
public class TutorialModClient implements ClientModInitializer {
@Override
public void onInitializeClient() {
BlockRenderLayerMap.INSTANCE.putBlocks(RenderLayer.getCutout(), CUSTOM_CROP_BLOCK);
}
}
===== 创建方块状态和模型 =====
我们已经完成了注册和代码,现在需要添加模型。下面的例子展示了使用 ''minecraft:block/crop'' 格式的简单生长阶段模型。你也可以使用 ''minecraft:block/cross'' 以使用交叉形的模型。您**必须**为拥有的每个生长阶段创建一个单独的模型。这个例子只呈现了单一的阶段,你可以将“0”替换成对应的生长阶段的数字。
{
"parent": "minecraft:block/crop",
"textures": {
"crop": "minecraft:block/custom_crop_block_stage0"
}
}
最后,您还需要为您的作物创建方块状态,以给作物的每个生长阶段都注册单独的模型。
{
"variants": {
"age=0": {
"model": "tutorial:block/custom_crop_block_stage0"
},
"age=1": {
"model": "tutorial:block/custom_crop_block_stage0"
},
"age=2": {
"model": "tutorial:block/custom_crop_block_stage1"
},
"age=3": {
"model": "tutorial:block/custom_crop_block_stage1"
},
"age=4": {
"model": "tutorial:block/custom_crop_block_stage2"
},
"age=5": {
"model": "tutorial:block/custom_crop_block_stage2"
},
"age=6": {
"model": "tutorial:block/custom_crop_block_stage3"
},
"age=7": {
"model": "tutorial:block/custom_crop_block_stage3"
}
}
}
===== 大功告成! =====
如果你正确完成了本教程的所有部分,那么你现在就应该有一个生效的作物了!这个作物可以用骨粉催熟,并且只能用种子物品放置在耕地上。