第一个物品 1.20 Forge 长线教程计划
本篇教程的视频
本篇教程的源代码
GitHub地址:TutorialMod-1.20.1-Forge-Item
注册物品
那么事不宜迟,我们来讲第一个物品
注册
首先我们创建一个ModItems
类,这个类用于注册
1 | public class ModItems { |
然后,我们要创建一个延迟注册器
,用于管理注册的物品
1 | public static final DeferredRegister<Item> ITEMS = |
这里的类型是DeferredRegister<Item>
Item
是原版的物品类,ForgeRegistries.ITEMS
是物品的注册表,TutorialMod.MOD_ID
是我们模组的命名空间
接下来我们就可以注册物品了
1 | public static final RegistryObject<Item> ICE_ETHER = |
这里我们注册了一个名为ICE_ETHER
的物品,类型是RegistryObject<Item>
,是一个注册表对象
然后我们用上面写的注册器,使用register
方法注册物品,第一个参数是物品的名称,第二个参数是一个Supplier
,用于提供物品
这里我们使用new Item(new Item.Properties())
来创建一个物品,Item.Properties
是物品的属性,这里我们使用默认的属性
模组的案例呢,都是Fabric
长线教程计划中的案例,我就不单独开其他的了
ResourceLocation
这里我们提一下关于物品的名称,这个也是物品的注册名,那么这里我们就要引出一个类,ResourceLocation
这个是原版的类
在Fabric
的Yarn
映射下,它叫Identifier
,这两个是同一个东西,都是用于表示资源位置
的类
当然我们这里注册物品并没有用上什么ResourceLocation
,但是在register
方法中用了
1 | public <I extends T> RegistryObject<I> register(final String name, final Supplier<? extends I> sup) |
所以我还是来提一嘴这个东西,我将其称之为模组开发道路上的第二块绊脚石
第一块呢,就是前面一期的Gradle
构建,那玩意确实得用点魔法
那么这里,什么崩溃
了,报错
了,黑紫块
了等等,往往是因为ResourceLocation
的问题
这里我们看看这个类中的注释,虽然这是其中一个方法的注释,但对整个类都是适用的
哎?有人就要说了,为什么这一个方法的注释就适用于整个类了?
说实话,Forge
在这里注释写得没有Fabric
那样详细,Fabric
的Identifier
类中类似的注释是写在开头的
而我对此的判断,一部分也是源自我已经有的开发经验,知道通其一,便可通其二
怎么来的了吧
当然,对于第一次接触模组开发的同学来说,这个藏在里面的东西自然是不知道的
这里的of
方法,也是实例化ResourceLocation
的,在这个方法下方的方法也是差不多的
我们就看其中抛出异常的提示
1 | ResourceLocationException |
翻译翻译,啥意思?它只能包含a-z
小写字母、0-9
数字、/
斜杠、.
点、_
下划线、-
短横这些字符
如果namespace
和path
包含其他字符,则抛出ResourceLocationException
异常
值得注意的,理论上这个也适用于命名空间
,也就是modid
,但短横并不能用
斜杠
是用来分级的,就像文件路径里面的斜杠
,同一个意思,用在路径中
所以什么大写字母
、中文字符
、空格
等等都是非法字符,都会造成游戏崩溃,绝对不能使用
对于另外的四个特殊字符,一般下划线
是代替空格的,斜杠
用来分路径,另外两个不怎么用
举一反三
我们也可以来举一反三
1 | public static final RegistryObject<Item> RAW_ICE_ETHER = |
对于这里的CARDBOARD
,我们使用了material/cardboard
作为物品的名称,实际上我们是将它归到了material
文件夹下,
在后面写物品模型的时候,你就会发现它于其他物品的区别
斜杠
是常用来进行分类的,这是在文件层级
上的分类
原版物品注册类
Item.Properties()
只是最简单的物品属性,在Items
类中我们还能看到许许多多的属性
1 | public static final Item APPLE = registerItem("apple", new Item((new Item.Properties()).food(Foods.APPLE))); |
比如原版的苹果
,它就是用food
方法来设置食物属性的
物品的属性我们会在后面的教程中展开讲讲
Items
类是原版的物品注册类,感兴趣的同学可以先研究起来了
注册事件
接下来我们还要写一个方法,用于初始化
注册物品这个事件
1 | public static void register(IEventBus eventBus){ |
而后,这个方法要在模组主类
的构造函数
中调用
1 | ModItems.register(modEventBus); |
数据文件
现在我们已经完成了物品的注册,虽然没写创造模式物品栏,但可以通过give
指令获取物品了
但如果你现在获取,你会发现你的物品是一个大大的黑紫块
,名字还老长一串,这显然不是我们想要的
我们还没写它们的数据文件
,所以接下来我们就来补齐它们
不过在此之前,我们现在resources
文件夹下创建一个assets
文件夹,这个文件夹是用于存放资源文件的
再在它下面创建一个与我们模组MOD_ID
相同名字的文件夹,这里就是tutorial_mod
原版文件
这里我提一下,如果说还从来没写过这些数据文件
,可以去查看原版的那些数据文件
这个项目菜单中的外部库
找到net.minecraft:client:extra:1.20.1
这个是游戏客户端放资源文件和数据文件的jar
包
这个库下面有个assets
和data
文件夹,
前者是放资源
文件的,像语言文件
、物品模型文件
、材质文件
等等,
后者是放数据
文件的,像战利品列表
、配方
等等
语言文件
在tutorial_mod
文件夹下创建一个lang
文件夹,这个文件夹用于存放语言文件
我们再在lang下面创建一个en_us.json
文件,这个文件是英文
语言文件,当其他语言文件缺省时,游戏会默认采用这个语言文件
当然,我们也可以创建一个zh_cn.json
文件,这个是简体中文
的语言文件
这里我们就写英文的吧
1 | { |
item.tutorial_mod.ice_ether
是物品实际注册的名字,当我们没有写语言文件时,在游戏中显示的就说这一串
另外两个也是一样的,不过,CARDBOARD
我们在注册时多加了一个material/
,而/在语言文件中会被替换为.,所以这里就是material.cardboard
所以语言文件的作用是翻译这一长串东西
物品注册的名字是item + . + MOD_ID + . + 物品注册名
同理,方块其实你也可以推测出来了,当然,我们在后面的教程中再说
物品模型
在tutorial_mod
文件夹下创建一个models
(注意复数)文件夹
再创建一个item
(注意单数)文件夹,用来存放物品的模型文件
我们再创建一个ice_ether.json
文件,这个文件就是ICE_ETHER
物品的模型文件
1 | { |
这里写的也是最简单的物品模型文件
parent
是父模型,这里我们使用的是item/generated
,也就是原一般版物品的模型
textures
是纹理,这里我们使用的是tutorial_mod:item/ice_ether,命名空间 + : + 文件夹
+ / + 文件名,
其对应的是textures/item
文件夹下的ice_ether.png
文件
另外两个也一样
RAW ICE ETHER
1 | { |
但是,对于CARDBOARD
而言,我们还得再item
下创建一个material
文件夹,然后创建一个cardboard.json
文件
1 | { |
所以,cardboard.json
文件的层级是resources/assets/tutorial_mod/models/item/material/cardboard.json
这就是为什么我说/
可以用来分类,这样就相当于CARDBOARD
被我们归在了material
下,当你有很多很多物品时,
如果全扔在一个文件夹下,后期维护起来肯定是很麻烦的,而归类则方便维护
至于这里的材质文件,你其实可以写成tutorial_mod:item/cardboard
,
但同样的道理,还是建议将material/
加上
材质文件
在tutorial_mod
文件夹下创建一个textures
文件夹,再创建一个item
文件夹,用来存放物品的材质文件
ICE ETHER
和RAW ICE ETHER
的材质文件就直接放item
下就行
而CARDBOARD
的材质文件则要放到item/material
下
材质文件的绘制?能画画的软件都可以,我用的Aseprite
,一个专业的像素画软件,Steam
上可以购买(70块
),你也可以到它的源代码仓库下载源代码自行编译,那是免费的
另外的Blockbench
也是不错的选择,一个轻量级的用于Minecraft
建模的三维软件,
但也可以画画,免费开源
后面我们也会用到Blockbench
制作自定义模型的物品和方块,感兴趣的同学可以先学
测试
那么在此之后,我们就可以启动游戏进行测试了
当然,因为没写创造模式物品栏,所以我们使用give
来获取物品
1 | /give @a tutorial_mod:ice_ether |
那么当我们获得物品且名字和材质都正确时,就说明物品已经添加成功了