User Tools

Site Tools


zh_cn:tutorial:items

This is an old revision of the document!


添加物品

介绍

添加一个基本的物品是编写模组的第一步。 你将需要创建一个Item对象,注册它,并赋予它一个纹理。要向物品添加其他行为,你将需要一个自定义的Item类。 在本教程以及以后的所有教程中,tutorial命名空间均用作模组的ID的占位符。如果你有单独的模组ID,则应当使用它。

注册物品

首先,创建一个Item的实例。我们将其存放在模组主类的顶部。Item的构造方法接受一个Item.Settings(或FabricItemSettings)对象,该对象用于设置物品属性,例如创造模式物品栏中的分类、耐久和堆叠数量。

  1. public class ExampleMod implements ModInitializer
  2. {
  3. // 新物品的实例
  4. public static final Item FABRIC_ITEM = new Item(new FabricItemSettings().group(ItemGroup.MISC));
  5. [...]
  6. }

这里使用原版注册方式来注册,基本语法是Registry#register(Registry Type, Identifier, Content),注册表类型被存储为Registry对象内的静态字段,标识符用来给内容“加标签”。Content则是您添加的东西的一个实例。这可以随时调用,只要发生在初始化阶段。

  1. public class ExampleMod implements ModInitializer
  2. {
  3. // 新物品的实例
  4. public static final Item FABRIC_ITEM = new Item(new FabricItemSettings().group(ItemGroup.MISC));
  5.  
  6. @Override
  7. public void onInitialize()
  8. {
  9. Registry.register(Registry.ITEM, new Identifier("tutorial", "fabric_item"), FABRIC_ITEM);
  10. }
  11. }

现在新物品已添加到Minecraft中,运行runClient Gradle任务以查看它的运行情况。

添加物品纹理

为物品注册纹理需要物品模型.json文件和纹理图像文件。 您将需要将它们添加到资源目录中。每个的直接路径是:

  物品模型: <根目录>/resources/assets/tutorial/models/item/fabric_item.json
  物品纹理: <根目录>/resources/assets/tutorial/textures/item/fabric_item.png

我们将使用这个示例纹理

如果您在第一步中正确注册了物品,则游戏将以类似于以下方式的方式抱怨缺少纹理文件:

  [Server-Worker-1/WARN]: Unable to load model: 'tutorial:fabric_item#inventory' referenced from: tutorial:fabric_item#inventory: java.io.FileNotFoundException: tutorial:models/item/fabric_item.json

游戏能很方便地告诉你它想要的资源路径。遇事不决,日志解决。

一个非常简单的物品模型长这个样子:

{
  "parent": "builtin/generated",
  "textures": {
    "layer0": "tutorial:item/fabric_item"
  }
}

物品模型会将所有属性继承自父模型,例如对工具、方块等物品十分有用的自定义手持模型(item/handheld)。这里的builtin/generated父模型告诉MC用给出的纹理文件生成一个模型,而textures/layer0则是纹理图像文件的位置。

最终纹理的结果:

创建物品类

要为物品添加自定义行为,则需要创建一个物品类。其默认的构造方法需要一个Item.Settings对象。

  1. public class FabricItem extends Item {
  2.  
  3. public FabricItem(Settings settings) {
  4. super(settings);
  5. }
  6. }

自定义物品类的一个实际用例是使该物品在右击时播放声音:

  1. public class FabricItem extends Item {
  2.  
  3. public FabricItem(Settings settings) {
  4. super(settings);
  5. }
  6.  
  7. @Override
  8. public TypedActionResult<ItemStack> use(World world, PlayerEntity playerEntity, Hand hand) {
  9. playerEntity.playSound(SoundEvents.BLOCK_WOOL_BREAK, 1.0F, 1.0F);
  10. return TypedActionResult.success(playerEntity.getStackInHand(hand));
  11. }
  12. }

用新物品类的实例替换旧的Item对象:

  1. public class ExampleMod implements ModInitializer {
  2. //创建新item的实例
  3. public static final FabricItem FABRIC_ITEM = new FabricItem(new FabricItemSettings().group(ItemGroup.MISC));
  4. [...]
  5. }

如果你正确执行了所有操作,则使用该物品现在应该会播放声音。

如果我想更改物品的堆叠大小怎么办?

使用FabricItemSettings内的maxCount(int size)来指定最大堆叠数。请注意,如果你的物品是有耐久的(及耐久归零后会被破坏),那么此物品无法设置最大堆叠数,否则游戏将抛出运行时错误(RuntimeException)。

  1. public class ExampleMod implements ModInitializer {
  2.  
  3. //我们新物品的实例,最大堆叠大小为16
  4. public static final FabricItem FABRIC_ITEM = new FabricItem(new FabricItemSettings().group(ItemGroup.MISC).maxCount(16));
  5. [...]
  6. }

下一步

zh_cn/tutorial/items.1629202242.txt.gz · Last modified: 2021/08/17 12:10 by solidblock