本篇教程的视频

(待发布)

本篇教程的源代码

(待发布)

注册方块

学习了前面的注册物品和注册物品栏之后,大家应该已经大概知道方块怎么来写的吧

同样的,我们来创建一个ModBlock类,用来注册方块

1
2
3
public class ModBlock {

}

接下来我们写一个延迟注册器

1
2
public static final DeferredRegister.Blocks BLOCKS =
DeferredRegister.createBlocks(TutorialMod.MOD_ID);

这里我们写的类型的DeferredRegister.Blocks,用于方块的延迟注册器

同样也是传入TutorialMod.MOD_ID,即模组的命名空间

方块物品注册

那么我们现在可以开始注册方块了吗?No no no

在写之前,我们还得注意一件事,方块还有一个东西,BlockItem方块物品

方块是有两种状态的,放在世界里,那玩意叫方块,而放在物品栏GUI中,那它就是物品

只是方块物品是一种与方块绑定的物品,在使用时可以放下方块

所以,方块物品也是要注册的,这里我们先来写一个注册方法registerBlockItems,用来注册方块物品

1
2
3
private static <T extends Block> void registerBlockItems(String name, DeferredBlock<T> block) {
ModItems.ITEMS.register(name, () -> new BlockItem(block.get(), new Item.Properties()));
}

这个方法没有返回值,然后我们直接调用ModItems的延迟注册器ITEMS
register方法注册,传入name名字,后面实例化是是BlockItem,也就是方块物品,
物品属性就写最简单的好了

之后,我们再一个方块的注册方法registerBlock

1
2
3
4
5
private static <T extends Block> DeferredBlock<T> registerBlock(String name, Supplier<T> block) {
DeferredBlock<T> blocks = BLOCKS.register(name, block);
registerBlockItems(name, blocks);
return blocks;
}

方法返回值是DeferredBlock<T>TBlock的本身或者子类,因为到时候我们写自定义方块的时候是要继承Block

然后我们调用BLOCKSregister方法,传入name名字,blocks是方块

再调用registerBlockItems方法,这样在注册方块的同时就将方块物品也注册了

最后返回block,也就是注册的方块

注册方块

现在我们就可以开始注册方块了,这里我们注册一个ICE_ETHER_BLOCK

1
2
public static final DeferredBlock<Block> ICE_ETHER_BLOCK =
registerBlock("ice_ether_block", () -> new Block(Block.Properties.of().strength(3.0F, 3.0F)));

这里我们调用registerBlock方法,传入名字,
然后我们实例化BlockBlock.PropertiesBlock的属性,
这里我们用of来创建一个属性,你也可以使用copy将原版某一个方块的属性复制过来

strength是方块硬度,第一个参数是方块硬度,决定方块的挖掘时间,第二个参数是爆炸抗性

顺便,我们瞅瞅原版那些方块的属性

原版方块注册类

原版方块注册类在Blocks中,这里我们来看看STONE

1
2
3
4
5
6
7
8
9
10
public static final Block STONE = register(
"stone",
new Block(
BlockBehaviour.Properties.of()
.mapColor(MapColor.STONE)
.instrument(NoteBlockInstrument.BASEDRUM)
.requiresCorrectToolForDrops()
.strength(1.5F, 6.0F)
)
);

mapColor是显示在地图上方块的颜色,instrument是音符盒放在上面发出的声音,
requiresCorrectToolForDrops是是否需要正确的工具才能掉落,这个我们会在战利品列表这期教程中讲解,
strength是方块硬度

其他的属性我们在后面会逐步讲到,比如作物流体等等

举一反三

同样的,我们来注册其他的方块

1
2
3
4
public static final DeferredBlock<Block> RAW_ICE_ETHER_BLOCK =
registerBlock("raw_ice_ether_block", () -> new Block(Block.Properties.of().strength(2.0F, 3.0F)));
public static final DeferredBlock<Block> ICE_ETHER_ORE =
registerBlock("ice_ether_ore", () -> new Block(Block.Properties.of().strength(1.5F, 0.5F)));

这里的strength中的具体数值大家可以按照自己的实际来更改

注册事件

最后,不要忘记还要注册事件

1
2
3
public static void register(IEventBus eventBus) {
BLOCKS.register(eventBus);
}

以及,要在模组主类构造函数中调用这个方法

1
ModBlocks.register(modEventBus);

加入物品栏

还有别忘了把方块物品加入物品栏

1
2
3
output.accept(ModBlocks.ICE_ETHER_BLOCK);
output.accept(ModBlocks.RAW_ICE_ETHER_BLOCK);
output.accept(ModBlocks.ICE_ETHER_ORE);

数据文件

方块状态文件

方块除了语言文件、模型文件之外,还要写一个方块状态文件,用来决定方块的各个状态

门的开关楼梯方块的各种连接栅栏的连接等等,这些都是由方块状态来决定的,
而方块状态文件是返回不同状态下不同的模型

方块状态我们会在未来好好讲解的,综合一些常用的方块状态类型

这里我们就来写最简单的方块状态文件

resouces/assets/tutorial_mod下创建一个blockstates文件夹,注意复数,然后创建一个ice_ether_block.json文件

1
2
3
4
5
6
7
{
"variants": {
"": {
"model": "tutorial_mod:block/ice_ether_block"
}
}
}

这个就是最简单的方块状态,""表示只有一种状态,model是方块模型

另外两个同样如此

ICE ETHER ORE

1
2
3
4
5
6
7
{
"variants": {
"": {
"model": "tutorial_mod:block/ice_ether_ore"
}
}
}

RAW ICE ETHER BLOCK

1
2
3
4
5
6
7
{
"variants": {
"": {
"model": "tutorial_mod:block/raw_ice_ether_block"
}
}
}

语言文件

按照之前物品写法的推断,怎么写大家应该知道了吧

没错,就是block + . + MOD_ID + . + 方块注册名

1
2
3
"block.tutorial_mod.ice_ether_block": "Ice Ether Block",
"block.tutorial_mod.raw_ice_ether_block": "Raw Ice Ether Block",
"block.tutorial_mod.ice_ether_ore": "Ice Ether Ore",

模型文件

方块模型文件

models文件夹下创建一个block文件夹,然后创建一个ice_ether_block.json文件

1
2
3
4
5
6
{
"parent": "block/cube_all",
"textures": {
"all": "tutorial_mod:block/ice_ether_block"
}
}

也和物品的模型文件差不多

parent是父模型,block/cube_all表示一个六面共用同一个材质的方块,
textures是材质,all对应上面的cube_alltutorial_mod:block/ice_ether_block是材质路径

另外两个同理

ICE ETHER ORE

1
2
3
4
5
6
{
"parent": "block/cube_all",
"textures": {
"all": "tutorial_mod:block/ice_ether_ore"
}
}

RAW ICE ETHER BLOCK

1
2
3
4
5
6
{
"parent": "block/cube_all",
"textures": {
"all": "tutorial_mod:block/raw_ice_ether_block"
}
}

物品模型文件

方块还是有一个对应的方块物品的,不过,它就是以方块的模型文件为父级模型

ICE ETHER BLOCK

1
2
3
{
"parent":"tutorial_mod:block/ice_ether_block"
}

ICE ETHER ORE
{
“parent”:”tutorial_mod:block/ice_ether_ore”
}

1
2
3
4
5
`RAW ICE ETHER BLOCK`
```json
{
"parent":"tutorial_mod:block/raw_ice_ether_block"
}

材质文件

textures文件夹下创建一个block文件夹,然后就放方块对应的材质文件即可

测试

好了,现在我们就可以测试一下了

如果你能获得方块物品,并能够放下方块且显示正确,那么方块就添加成功了