用户:MashKJo/1.12.2模组开发教程/5.第一个物品

MashKJo留言 | 贡献2024年12月5日 (四) 20:01的版本 (// Edit via Wikiplus)

所有物品都是net.minecraft.item.Item类的实例。要加入一个新物品,可以直接实例化Item类,也可以先继承Item类再实例化。

对于没有什么额外行为的物品(一般这种物品会被设计为合成材料或生物掉落物),一般都选择前者;反之则选择后者。Item类有许多setter和getter。限于我们目前的知识水平,getter笔者暂且不讲(后面就知道为什么了),先讲setter。

Item类包括但不限于如下的一些setter:

  • setCreativeTab:用于设定物品所在的创造模式物品栏(CreativeTabs),传入一个CreativeTabs对象,原版所有的创造模式物品栏都在CreativeTabs类中以静态字段的方式存在
  • setUnlocalizedName:用于设定物品在lang文件中所使用的本地化键名,传入一个字符串,如传入"example_item"这个字符串,那么它在lang文件中的本地化键名就是item.example_item.name
  • setMaxStackSize:用于设定物品在格子中的最大堆叠数(默认为64)
  • setMaxDamage:这个setter的含义有些复杂,在一定情况下,用于设定物品能被损耗的最大次数——其实就是耐久值
  • setNoRepair:用于设定物品不可被修复
  • setContainerItem:用于设定该物品的“容器物品”——传入一个Item对象,实际效果为在工作台中参与合成后,设定的这个“ContainerItem”会留在工作台格子中

此外,不要忘了还要调用setRegistryName这一setter——这是Item类实现IForgeRegistryEntry<Item>获得的方法。

上述setter的返回值是Item类型的,因此这代表着我们可以new完Item之后直接通过链式调用这些setter来设定该Item对象的一些属性;如果你是先继承了Item类,这些一般在构造方法中被调用:

如,笔者这里添加了一个红宝石(Ruby)物品:

src/main/java/net/tutorial_mod/item/TutorialModItems.java:

public static Item RUBY = new Item().setRegistryName(TutorialMod.MODID, "ruby")
                        .setUnlocalizedName("ruby")
                        .setCreativeTabs(CreativeTabs.MISC);

笔者这里新建了一个类:TutorialModItems,来统一存放模组添加的所有物品实例——这是一个好习惯,建议读者也这么做。

最后,再通过监听RegistryEvent.Register<Item>事件注册:

src/main/java/net/tutorial_mod/item/ItemRegistryHandler.java:

package net.tutorial_mod.item;

import static net.tutorial_mod.item.TutorialModItems.*;

import net.minecraft.item.Item;
import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.tutorial_mod.TutorialMod;

@Mod.EventBusSubscriber(modid = TutorialMod.MODID)
public class ItemRegistryHandler {
   @SubscribeEvent
   public static void registerItems(RegistryEvent.Register<Item> event){
       event.getRegistry().register(RUBY);
   }
}