Minecraft 1.12.2 Mod開發筆記——新的物品


在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中的鐵板圖片

iron_plate

創造模式物品欄

顯然,物品需要一個放進一個創造模式物品欄里,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

更實用的:哪里顯示不正常,就寫到等號左邊,創造模式物品欄名稱等均可設置


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM