今天我们来添加一个物品。
3.1.基础部分
在主包com.rycb.etech
下新建一个包items
,然后再新建一个包,名为base
,作为基础物品模板存放的包。
在上述包com.rycb.etech.items.base
下新建一个类ItemBasicBase
,并继承Item
类,实现IHasModel
接口,作为最基础的基础物品类:
src/main/java/com/rycb/etech/items/base/ItemBasicBase.java
:
package com.rycb.etech.items.base;
import com.rycb.etech.EasyTech;
import com.rycb.etech.init.ModItems;
import com.rycb.etech.util.IHasModel;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
public class ItemBasicBase extends Item implements IHasModel {
/**
*
* @param UnlocalizedName 未初始化名
* @param RegistryName 注册名
* @param tab 创造模式物品栏
*/
public ItemBasicBase(String UnlocalizedName, String RegistryName, CreativeTabs tab) {
setUnlocalizedName(UnlocalizedName);
setCreativeTab(tab);
setRegistryName(RegistryName);
ModItems.ITEMS.add(this);
}
@Override
public void registerModels() {
EasyTech.proxy.registerItemRender(this, 0, "inventory");
}
}
- 这里的
UnlocalizedName
是物品的未本地化名称,在i18n中会有用 setCreativeTab
是用来指定物品的创造模式物品栏setRegistryName
是用来指定物品的注册名
那么,创造模式物品栏有哪些呢?
Minecraft里内置的有
CreativeTabs.DECORATIONS //装饰性方块
CreativeTabs.BREWING //酿造
CreativeTabs.COMBAT //战斗
CreativeTabs.BUILDING_BLOCKS //建筑方块
CreativeTabs.FOOD //食物
CreativeTabs.MATERIALS //杂项
CreativeTabs.MISC //也是杂项
CreativeTabs.REDSTONE //红石
CreativeTabs.TOOLS //工具
CreativeTabs.TRANSPORTATION //交通
当然,我们还可以自制 创造模式物品栏。
在这一步,读者可能会发现这里会有两个被IDEA标红的内容, IHasModel
和ModItems
。这些是什么呢?一个是Mod的重要元素,一个是Mod的重要元素。
在util
包中新建一个接口(注意,是接口)IHasModel
。
src/main/com/rycb/etech/util/IHasModel
:
package com.rycb.etech.util;
public interface IHasModel {
void registerModels();
}
之后就不用管它了。
接下来,在com.rycb.etech
包(根目录)下新建一个包,命名为init
,在其中新建一个类ModItems
,用于初始化Mod物品。
我们来做一个硫磺吧!
src/main/java/com/rycb/etech/init/ModItems.java
:
package com.rycb.etech.init;
import net.minecraft.item.Item;
import java.util.ArrayList;
import java.util.List;
/**
* @author RYCBStudio/Java Department
* <p>Create Time: 2022/8/5 16:21</p>
* <p>Use the IntelliJ IDEA</p>
* <p>Location: EasyTech/com.rycb.etech.init/ModItems.java</p>
* <h1><center>ModItems</center></h1>
*/
public class ModItems{
public static final List<Item> ITEMS = new ArrayList<Item>();
/**
* Ores
*/
//硫
public static final Item SULFUR = new ItemBasicBase("sulfur", "sulfur", EasyTech.ETECH_TAB);
}
新建一个类进行初始化的原因是当你的物品越来越多,如果所有的注册过程都直接在CommonProxy类中进行,随着注册的对象越来越多,这些注册的对象会越来越难以管理。换句话说,这体现了代码模块化的原则。
首先,我们要新建一个数组来存放这些物品:
src/main/java/com/rycb/etech/init/ModItems.java
(部分):
public static final List<Item> ITEMS = new ArrayList<Item>();
其次,是初始化这个物品:
src/main/java/com/rycb/etech/init/ModItems.java
(部分):
public static final Item SULFUR = new ItemBasicBase("sulfur", "sulfur", EasyTech.ETECH_TAB);
ItemBasicBase
的这些在前面的代码中已说过,这里不多做赘述。
然后,就是来注册这些物品。
3.2.注册物品
在上一个部分中,我们已经实例化了物品。接下来,就是注册他们。
在com.rycb.etech.util
包下新建一个包,命名为handlers
,在其中新建一个类RegistryHandler
,用于注册Mod物品。
src/main/java/com/rycb/etech/util/handlers/RegistryHandler.java
:
package com.rycb.etech.util.handlers;
import com.rycb.etech.init.ModItems;
import com.rycb.etech.util.IHasModel;
import net.minecraft.item.Item;
import net.minecraftforge.client.event.ModelRegistryEvent;
import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
@EventBusSubscriber
public class RegistryHandler {
@SubscribeEvent
public static void onItemRegister(RegistryEvent.Register<Item> event) {
event.getRegistry().registerAll(ModItems.ITEMS.toArray(new Item[0]));
}
@SubscribeEvent
public static void onModelRegister(ModelRegistryEvent event) {
for (Item item : ModItems.ITEMS) {
if (item instanceof IHasModel) {
((IHasModel) item).registerModels();
}
}
}
}
这里用到了一个for
循环,来全部注册ModItems
类里面的物品。
好,现在运行游戏(不会吧,你居然还不知道怎么运行游戏?),就可以在你设置的创造模式物品栏里找到你的物品了~。
3.3. 紫…黑块?
可以看到,你手上的物品,现在还什么都没有,只是一个紫黑块,这是因为你没有添加模型和材质。模型的作用是保证你手里的物品是一个长方体,而材质的作用,就是给这个长方体上色。
在资源文件夹resources
中,新建一个目录assets/etech
,作为Mod的资源文件夹:
在assets.etech
目录中新建一个目录model
,用于存放Mod各种东西的模型:
(建议先新建一个.keep文件,以避免出现这种情况:)(懂的都懂)
在models
目录中新建一个目录item
,在其中新建一个文件sulfur.json
(你注册的物品名.json)
或者你也可以像我一样直接写个模板文件。(这里不多做赘述)(传送门)
在其中写这样一些语句:
src/main/resources/assets/etech/models/item/sulfur.json
:
{
"parent": "item/generated",
"textures": {
"layer0": "etech:items/sulfur"
}
}
将其中的etech
改为你的Mod id,sulfur
改为你的物品注册名就可以了~
接着,放入材质:(材质文件夹是src/main/resources/assets/etech/textures
,和上述一样操作就可以了)
物品材质是在textures/items
目录下哦
比如,我写的是硫磺,就是这个材质:
⚠注意⚠:MC里面的物品材质绝大多数都是16x16或2nx2n的,请尽量使用16x16的!
大家还记得第二章中的ClientProxy
中重写的CommonProxy
的registerItemRender()
方法吗?它就是来加载物品渲染的。
@Override
public void registerItemRender(Item item, int meta, String id) {
ModelLoader.setCustomModelResourceLocation(item, meta, new ModelResourceLocation(item.getRegistryName(), id));
}
运行游戏,你就能看到你上了材质的物品了!
3.4.item.sulfur.name
?
可以看到,你手上的物品,虽说有了材质,可名字却怪怪的。这是什么呢?item.sulfur.name
是你的物品的UnlocalizedName
(未本地化名称),我们需要i18n来进行本地化。
下面内容来自来自Wikipedia:
本地化则是指当移植软件时,加上与特定区域设置有关的信息和翻译文件的过程。国际化是指在设计软件,将软件与特定语言及地区脱钩的过程。当软件被移植到不同的语言及地区时,软件本身不用做内部工程上的改变或修正。
在你的资源文件夹assets.etech
目录下,新建一个目录lang
,作为Mod的语言文件。
英语是全球最广泛使用的语言,Minecraft的默认使用语言也是英语,所以很明显地,我们应该首先对英语提供支持。
So,在lang
目录下新建文件en_us.lang
,注意等号的两边没有空格:
src/main/resources/assets/etech/lang/en_us.lang
:
item.sulfur.name=Sulfur
item.sulfur.name
便是硫磺的名称,这个名称由该物品的setUnlocalizedName方法设置。
如果搞不清楚语言文件等号前面应该使用什么,可以先不写,在游戏中看一看,然后把不正常的部分写入语言文件。
当然,作为面向中国人制作的Mod,中文语言文件还是要有的。在同一个文件夹下新建文件zh_cn.lang
:
item.sulfur.name=硫磺
当然,你也可以添加其他语言文件,如繁体中文(zh_tw)等,语言文件的文件名通常按照“语言_国家(地区)”代码标准。
最后说一句,语言文件一定要使用UTF-8编码。