第一个方块 1.21 NeoForge 长线教程计划
本篇教程的视频
(待发布)
本篇教程的源代码
(待发布)
注册方块
学习了前面的注册物品和注册物品栏之后,大家应该已经大概知道方块怎么来写的吧
同样的,我们来创建一个ModBlock
类,用来注册方块
1 | public class ModBlock { |
接下来我们写一个延迟注册器
1 | public static final DeferredRegister.Blocks BLOCKS = |
这里我们写的类型的DeferredRegister.Blocks
,用于方块的延迟注册器
同样也是传入TutorialMod.MOD_ID
,即模组的命名空间
方块物品注册
那么我们现在可以开始注册方块了吗?No no no
在写之前,我们还得注意一件事,方块还有一个东西,BlockItem
方块物品
方块是有两种状态的,放在世界
里,那玩意叫方块
,而放在物品栏GUI
中,那它就是物品
只是方块物品是一种与方块绑定的物品,在使用时可以放下方块
所以,方块物品也是要注册的,这里我们先来写一个注册方法registerBlockItems
,用来注册方块物品
1 | private static <T extends Block> void registerBlockItems(String name, DeferredBlock<T> block) { |
这个方法没有返回值,然后我们直接调用ModItems
的延迟注册器ITEMS
,
用register
方法注册,传入name
名字,后面实例化是是BlockItem,也就是方块物品,
物品属性就写最简单的好了
之后,我们再一个方块的注册方法registerBlock
1 | private static <T extends Block> DeferredBlock<T> registerBlock(String name, Supplier<T> block) { |
方法返回值是DeferredBlock<T>
,T
是Block
的本身或者子类,因为到时候我们写自定义方块
的时候是要继承Block
的
然后我们调用BLOCKS
的register
方法,传入name
名字,blocks
是方块
再调用registerBlockItems
方法,这样在注册方块
的同时就将方块物品
也注册了
最后返回block
,也就是注册的方块
注册方块
现在我们就可以开始注册方块了,这里我们注册一个ICE_ETHER_BLOCK
1 | public static final DeferredBlock<Block> ICE_ETHER_BLOCK = |
这里我们调用registerBlock
方法,传入名字,
然后我们实例化Block
,Block.Properties
是Block
的属性,
这里我们用of
来创建一个属性,你也可以使用copy
将原版某一个方块的属性复制过来
strength
是方块硬度,第一个参数是方块硬度
,决定方块的挖掘时间
,第二个参数是爆炸抗性
顺便,我们瞅瞅原版那些方块的属性
原版方块注册类
原版方块注册类在Blocks
中,这里我们来看看STONE
1 | public static final Block STONE = register( |
mapColor
是显示在地图上方块的颜色,instrument
是音符盒放在上面发出的声音,requiresCorrectToolForDrops
是是否需要正确的工具才能掉落,这个我们会在战利品列表
这期教程中讲解,strength
是方块硬度
其他的属性我们在后面会逐步讲到,比如作物
、流体
等等
举一反三
同样的,我们来注册其他的方块
1 | public static final DeferredBlock<Block> RAW_ICE_ETHER_BLOCK = |
这里的strength
中的具体数值大家可以按照自己的实际来更改
注册事件
最后,不要忘记还要注册事件
1 | public static void register(IEventBus eventBus) { |
以及,要在模组主类
的构造函数
中调用这个方法
1 | ModBlocks.register(modEventBus); |
加入物品栏
还有别忘了把方块物品加入物品栏
1 | output.accept(ModBlocks.ICE_ETHER_BLOCK); |
数据文件
方块状态文件
方块除了语言
文件、模型
文件之外,还要写一个方块状态
文件,用来决定方块的各个状态
像门的开关
、楼梯方块的各种连接
、栅栏的连接
等等,这些都是由方块状态
来决定的,
而方块状态文件是返回不同状态下不同的模型
方块状态我们会在未来好好讲解的,综合一些常用的方块状态类型
这里我们就来写最简单的方块状态文件
在resouces/assets/tutorial_mod
下创建一个blockstates
文件夹,注意复数,然后创建一个ice_ether_block.json
文件
1 | { |
这个就是最简单的方块状态,""
表示只有一种状态,model
是方块模型
另外两个同样如此
ICE ETHER ORE
1 | { |
RAW ICE ETHER BLOCK
1 | { |
语言文件
按照之前物品
写法的推断,怎么写大家应该知道了吧
没错,就是block + . + MOD_ID + . + 方块注册名
1 | "block.tutorial_mod.ice_ether_block": "Ice Ether Block", |
模型文件
方块模型文件
在models
文件夹下创建一个block
文件夹,然后创建一个ice_ether_block.json
文件
1 | { |
也和物品的模型文件差不多
parent
是父模型,block/cube_all
表示一个六面共用同一个材质的方块,textures
是材质,all
对应上面的cube_all
,tutorial_mod:block/ice_ether_block
是材质路径
另外两个同理
ICE ETHER ORE
1 | { |
RAW ICE ETHER BLOCK
1 | { |
物品模型文件
方块还是有一个对应的方块物品
的,不过,它就是以方块
的模型文件为父级模型
了
ICE ETHER BLOCK
1 | { |
ICE ETHER ORE
{
“parent”:”tutorial_mod:block/ice_ether_ore”
}
1 | `RAW ICE ETHER BLOCK` |
材质文件
在textures
文件夹下创建一个block
文件夹,然后就放方块对应的材质文件即可
测试
好了,现在我们就可以测试一下了
如果你能获得方块物品,并能够放下方块且显示正确,那么方块就添加成功了