MCBBS Wiki欢迎您共同参与编辑!在参与编辑之前请先阅读Wiki方针

如果在编辑的过程中遇到了什么问题,可以去讨论板提问。

为了您能够无阻碍地参与编辑 未验证/绑定过邮箱的用户,请尽快绑定/验证

MCBBS Wiki GitHub群组已上线!

您可以在回声洞中发表吐槽!

服务器状态监控。点击进入

本站由MCBBS用户自行搭建,与MCBBS及东银河系漫游指南(北京)科技有限公司没有从属关系。点此了解 MCBBS Wiki 不是什么>>

用户:MashKJo/1.21.1模组开发教程/6.1.第一个方块

来自MCBBS Wiki
跳到导航 跳到搜索

方块的基类是net.minecraft.world.level.block.Block类,和物品一样,简单的方块可以直接new这个类;拥有额外的逻辑的则需要先继承再实例化。

public static final DeferredRegister.Blocks BLOCKS = DeferredRegister.createBlocks(TutorialMod.MODID);

public static final DeferredBlock<Block> EXAMPLE_BLOCK = BLOCKS.registerSimpleBlock("example_block", BlockBehaviour.Properties.of(). ...);

Block类接受一个BlockBehaviour.Properties,这是方块的属性,和物品的Item.Properties类似,你可以在其中设置方块的硬度、音效、爆炸抗性等。如果有些数值你拿不准,可以去Blocks类下看看原版方块的数值都是怎么填的。

注册完方块本身,我们还需要注册方块的物品形式(BlockItem)——没错,方块放在世界中才是方块,拿在手上的是方块的物品形式,本质上是ItemStack。

public static final DeferredItem<BlockItem> EXAMPLE_BLOCK_ITEM = ITEMS.registerSimpleBlockItem(MyBlockClass.EXAMPLE_BLOCK);

方块的本地化键名格式是block.<modid>.<registry_name>,如上述示例代码中注册的EXAMPLE_BLOCK的本地化键名为block.tutorialmod.example_block

blockstates和模型文件

我们的方块,现在放在世界中时,是一个六个面都是紫黑块的立方体。我们需要给它编写blockstates文件和模型文件。

首先在路径assets/<modid>/blockstates文件夹下以你的方块注册名为名创建JSON文件:

{
   "variants": {
       "": {
           "model": "<modid>:block/<name>"
       }
   }
}

我们的方块只有一种方块状态(有关方块状态,请见6.3节),所以用空字符串""表示,该blockstates文件将这一唯一方块状态的模型映射到了文件assets/<modid>/models/<name>.json

然后再创建这个模型文件:

{
   "parent": "minecraft:block/cube_all",
   "textures": {
       "all": "<modid>:block/<name>"
   }
}

由于我们创建的方块是一个满格的立方体,且六个面纹理相同,因此父模型设定为minecraft:block/cube_all;textures部分则将六个面的纹理映射到纹理文件assets/<modid>/textures/block/<name>.png

当然,如果你不想让六个面纹理都相同,可以选择继承模型minecraft:block/cube,你可以分别指定东南西北上下六个面,以及粒子的纹理。

把提前准备好的纹理放入指定的位置,如果你没出错的话,那么启动游戏后,方块被放在世界中时,已经显示为正常的纹理了。

但是方块拿在手上时还是紫黑块,我们需要给方块的物品形式也创建一个模型文件,我们只需直接继承我们写好的方块模型即可:

{
   "parent": "<modid>:block/<name>"
}

事实上,任何物品都可以通过模型文件继承方块模型来获得一个方块的外观。

方块类型(MapCodec<? extends Block>)

你可能注意到了,原版的Block子类都定义了一个public static final的MapCodec字段(有关Codec和MapCodec,详见第10章),即所谓的“方块类型”;还覆写了#codec方法。并且这些方块类型都被注册进了注册表BuiltInRegistries.BLOCK_TYPE。

由于方块目前仍是固有注册项,并未数据驱动化,因此这东西其实没啥用。不过为了和原版统一,你也可以为你的Block子类加上方块类型。如果你的方块子类的构造方法只接受一个BlockBehaviour.Properties,那么可以直接用#simpleCodec来得到一个MapCodec;如果构造方法不止这一个参数,你需要使用RecordCodecBuilder#mapCodec来创建MapCodec,方块属性参数的Codec填BlockBehaviour#propertiesCodec。