在Mod中添加一個新的物品分為3步:
- 創建物品
- 注冊物品
- 添加模型和材質
- (設置語言文件)
創建物品
Minecraft中,所有的物品繼承於 Item 類,我們試着創建一個鐵板。
在 moonfan.mymod.item
包下新建一個類 ItemIronPlate 並繼承 Item 類:
public class ItemIronPlate extends Item {
public ItemIronPlate(){
}
}
注冊物品
物品需要在注冊表內注冊后才能被加載,而注冊是一個事件,我們可以用之前事件系統的內容來解決。
在 item 包內新建 ItemLoader.java,這里直接使用簡便的 @Mod.EventBusSubscriber
:
@Mod.EventBusSubscriber
public class ItemLoader {
public static Item ironPlate = new ItemIronPlate();
@SubscribeEvent
public static void registerItem(RegistryEvent.Register<Item> event){
event.getRegistry().register(ironPlate.setRegistryName("mymod:iron_plate"));
}
}
event.getRegistry()
獲取注冊表,用 register()
注冊單一物品,用 registerAll()
注冊傳入的所有物品。
物品需要一個用於注冊的名字,經過查看源碼以及參考其他 mod,注冊名應該使用 modid:物品注冊名
的格式,其中物品名使用下划線命名法。如果沒有用冒號,比如 modid.物品注冊名
,forge會將其整體視為一個物品注冊名,在前面添加上 modid:
前綴。
現在,我們進入游戲,使用 give 命令來獲取這個方塊。
給物品添加模型和材質
現在手里的物品還是紫黑塊,我們需要添加模型和材質。模型可以理解成對物品的形狀、位置、旋轉等的規定,材質就是我們看到的物品所顯示的圖片。
添加模型及材質也是一個事件,在 ItemLoader 里添加:
@SubscribeEvent
public static void registerItemModel(ModelRegistryEvent event){
ModelLoader.setCustomModelResourceLocation(ironPlate,0,new ModelResourceLocation(ironPlate.getRegistryName(),"inventory"));
}
這個方法指明物品的模型所在的位置,至於那個0以及 inventory 暫時沒有明白具體含義。
然后新建目錄 resources/assets/mymod/models/item/
,再新建 iron_plate.json,復制以下內容:
{
"parent": "item/generated",
"textures": {
"layer0": "mymod:items/iron_plate"
}
}
- parent 模型的繼承關系,Minecraft中有一些直接可以拿來用的基本模型:
- generated 普通物品的模型,比如雞蛋,鐵錠等等物品欄和拿在手里沒有區別的物品
- handheld 拿在手中的工具,如劍、鎬、斧等,這個模型對物品欄中顯示的圖片做了旋轉等變換,拿在手里的工具能夠顯示為真正的“拿在手里”而不是有一個奇怪的角度
- ······
- 資源文件中的路徑為 modid: 開頭,對應 resources/assets/modid/ 目錄,如果不加 modid: 前綴,默認為 minecraft: 即 Minecraft 自帶材質路徑。
- textures 模型所用的材質圖片,簡單的使用 layer0 作為圖片字段即可。這里表示定位到 mymod/textures/items/iron_plate.png。
現在我們可以新建目錄 resources/assets/mymod/textures/items/
,將圖片(png格式,最好為16x16的倍數)放在這里,重新運行,你會看到紫黑塊變成了你設置的材質。這里我直接使用了沉浸工程Mod中的鐵板圖片
創造模式物品欄
顯然,物品需要一個放進一個創造模式物品欄里,give命令實在是太麻煩了。
我們直接在 ItemIronPlate()
構造器里加一句 setCreativeTab(CreativeTabs.FOOD);
就好了,原版物品欄的名稱可以在CreativeTabs類里找到。
新的創造模式物品欄
在MyMod.java這個主類里添加字段:
public static final CreativeTabs MY_TAB = new CreativeTabs(MODID) {
@Override
public ItemStack getTabIconItem() {
return new ItemStack(ItemLoader.ironPlate);
}
};
再在 ItemIronPlate()
構造器里加入 setCreativeTab(MyMod.MY_TAB);
。重啟游戲,你會看到一個新的創造模式物品欄。
注意:必須以某種方式設置 Tab 的 Icon,如果留 null會引發崩潰
本地化
現在我們的物品還是一個 item.null.name 的名字,我們需要更正。
- 我們需要一個名稱,用於不限語言的代指某個物品,這個名字叫 UnlocalizedName 或者 TranslationKey
- 我們需要語言文件,將上面的代指名稱翻譯成各種語言,翻譯后的名稱叫本地化名稱
- 代指名稱使用物品的
setUnlocalizedName()
方法進行設置(新的版本為setTranslationKey()
) - 本地化名稱使用語言文件(*.lang)進行設置。
借鑒沉浸工程、林業等 mod 的寫法,代指名稱使用 modid.物品名的下划線命名
的形式
在 ItemIronPlate()
中添加
setUnlocalizedName("mymod.iron_plate");
新建文件夾 resources/assets/mymod/lang/
,新建 en_us.lang 文件,對應英文版本,在里面寫入(無需多余空格、引號等字符):
item.mymod.iron_plate.name=Iron Plate
然后我們新建 zh_cn.lang,對應中文版本,寫法同上。
注意:1.12語言文件名應該使用全小寫,比如 zh_cn 而不是 zh_CN
更實用的:哪里顯示不正常,就寫到等號左邊,創造模式物品欄名稱等均可設置