第1周:第一个物品

接下来我们会创建第一个物品,制作物品分为4部分:

  • 创建一个物品
  • 注册这个物品
  • 添加物品材质
  • 添加语言文件

创建一个物品

首先,我们需要创建一个类com.example.examplemod.item.Rudder

因为,所有的物品都是继承于item类,所以我们要写一个类也继承于它。代码如下。

package com.example.examplemod.item;

public class Rubber extends Item {
}

接着我们在Rudder中添加如下代码。

    private static final String name = "rubber";
    public Rubber(){
        this.setRegistryName(name);
        this.setUnlocalizedName(ExampleMod.MODID+":"+name);
        this.setCreativeTab(CreativeTabs.MISC);
    }

构造函数里面的三个调用分别是:

  • 设置注册名字
  • 设置非本地化名字
  • 设置创造物品栏

注册这个物品

接下来我们需要注册这个物品,在1.12.2的forge中注册物品使用事件。
我们需要创建一个类com.example.examplemod.register.ItemsRegister。 在其中写上如下代码。

package com.example.examplemod.register;

import com.example.examplemod.item.*;
import net.minecraft.item.Item;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;

@Mod.EventBusSubscriber
public class ItemsRegister {
    public static final Item RUDDER = new Rudder();
    public ItemsRegister(){
        MinecraftForge.EVENT_BUS.register(this);
    }
    @SubscribeEvent
    public static void registerItems(RegistryEvent.Register<Item> event)
    {
        event.getRegistry().registerAll(
                RUDDER
        );
    }
}
  • MinecraftForge.EVENT_BUS.register(this);在构造这个类时,注册这个监听。
  • public static final Item RUDDER = new Rudder();就是创建一个物品的实例。
  • @SubscribeEvent public static void registerItems(RegistryEvent.Register<Item> event){}是监听一个事件RegistryEvent.Register<Item>当注册物品时就调用方法。
  • event.getRegistry().registerAll(RUDDER);是调用事件的注册函数,注册我们的物品。

最后,我们在CommonProxy中的preInit函数中new一个ItemsRegister就可以了,代码如下:

    new ItemsRegister();

现在我们打开游戏,创建一个新的世界看一下吧。此时我们就可以在杂物的创造物品栏看到这个物品了。

添加物品材质

此时我们的物品是没有材质的,现在我们需要给他创建材质。

resources中创建assets/examplemod/textures/items文件夹,把我们的材质放到里面。

  • PS:材质来源于网络,如有侵权请联系我删除。

resources中创建assets/examplemod/models/item/rubber.json文件,写下如下内容:

{
    "parent": "minecraft:item/generated",
    "textures": {
        "layer0": "examplemod:items/rubber"
    }
}
  • "parent": "minecraft:item/generated":使用item/generated的模型。
  • "textures": {}:材质。
  • "layer0": "examplemod:items/rubber":第0个图层的位置。
  • PS:可以自行理解一下这个的定位方法,很好理解,layer0就会定位到textures文件夹。
  • PS:理论来说可以有多图层的材质 (未经核实)

现在我们需要创建一个文件com.example.examplemod.register.ModelRegister,代码如下:

package com.example.examplemod.register;

import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.item.Item;
import net.minecraftforge.client.event.ModelRegistryEvent;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;

public class ModelRegister {
    public ModelRegister(){
        MinecraftForge.EVENT_BUS.register(this);
    }
    @SubscribeEvent
    public void registerItemModels(ModelRegistryEvent event) {
        registerItemModel(ItemsRegister.RUDDER);
    }
    private void registerItemModel(Item item) {
        ModelLoader.setCustomModelResourceLocation(item, 0, new ModelResourceLocation(item.getRegistryName(), "inventory"));
    }
}
  • @SubscribeEvent public void registerItemModels(ModelRegistryEvent event) {}注册监听ModelRegistryEvent事件。
  • ModelLoader.setCustomModelResourceLocation(item, 0, new ModelResourceLocation(item.getRegistryName(), "inventory"));将物品设置材质地址,其中inventory一般不需要改变。

然后在ClientProxy中的preInit阶段new一个ModelRegister就可以了。代码如下:

    @Override
    public void preInit(FMLPreInitializationEvent event){
        super.preInit(event);
        new ModelRegister();
    }

现在我们就可以进入游戏查看了。

添加语言文件

现在我们要给我们的物品添加语言文件。
ClientProxy创建文件assets/examplemod/lang/zh_cn.lang,在其中写上如下文字:

item.examplemod:rubber.name=橡胶

ClientProxy创建文件assets/examplemod/lang/en_us.lang,在其中写上如下文字:

item.examplemod:rubber.name=rubber

现在打开游戏就可以看到我们的语言了。


当然我们也有到目前为止的代码点击此处

results matching ""

    No results matching ""