User Tools

Site Tools


zh_cn:tutorial:items

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
zh_cn:tutorial:items [2021/01/16 06:23] – [注册物品] 更新代码 solidblockzh_cn:tutorial:items [2024/04/15 01:25] (current) – [如果我想更改物品的堆叠大小怎么办?] solidblock
Line 1: Line 1:
-====== 添加一个物品 ======+====== 添加物品 ======
  
 ==== 介绍 ==== ==== 介绍 ====
  
-添加一个基本的物品是编写模组的第一步。 你将需要创建一个''Item''对象,注册,并赋予它一个材质。要向物品添加其他行为,你将需要一个自定义的''Item''类。 在本教程以及以后的所有教程中,''tutorial''命名空间均用作模组的ID的占位符。如果你有单独的模组ID,则应当使用它。+添加一个基本的物品是编写模组的第一步。你将需要创建一个 ''Item'' 对象,注册,并提供一个纹理。要向物品添加其他行为,你将需要一个自定义的 ''Item'' 类。在本教程以及以后的所有教程中,均使用 ''tutorial'' 作为命名空间。如果你有单独的模组 ID,那就直接使用它。
 ==== 注册物品 ==== ==== 注册物品 ====
-首先,创建一个''Item''的实例。我们将其放在模组主类的顶部。''Item''的构造方法接受一个''Item.Settings''(或''FabricItemSettings'')对象,该对象用于设置物品属性,例如创造模式物品栏中的分类、耐久和堆叠数量。 +首先,创建一个 ''Item'' 的实例储为静态常量字段。''Item'' 的构造方法接受一个 ''Item.Settings''(或 ''FabricItemSettings'',除非是 1.20.5 以上版本)对象,该对象用于设置物品属性,例如耐久和堆叠数量。 
-<code java [enable_line_numbers="true"]> +<yarncode java [enable_line_numbers="true"]> 
-public class ExampleMod implements ModInitializer +public class ExampleMod implements ModInitializer {
-{+
     // 新物品的实例     // 新物品的实例
-    public static final Item FABRIC_ITEM = new Item(new FabricItemSettings().group(ItemGroup.MISC));+    public static final class_1792 CUSTOM_ITEM = new class_1792(new FabricItemSettings());
     [...]     [...]
 } }
-</code+</yarncode
-这里使用原版注册方式来注册,基本语法是''Registry#register(Registry TypeIdentifierContent)'',注册表类型存储''Registry''对象内的静态字段,标识符用来给内容“加标签”。Content则是您添加的东西的一个实例。这可以随时调用,只要发生在初始化阶段。 +这里使用原版注册方式来注册,基本语法是 ''Registry#register(注册表类型ID内容)'',注册表类型存储在 ''Registries'' 或 ''Registry'' 类中的静态字段,标识符用来给内容“加标签”。内容则是您添加的东西的一个实例。这可以随时调用,只要发生在初始化阶段。 
-<code java [enable_line_numbers="true"]> +<yarncode java [enable_line_numbers="true"]> 
-public class ExampleMod implements ModInitializer +public class ExampleMod implements ModInitializer {
-{+
     // 新物品的实例     // 新物品的实例
-    public static final Item FABRIC_ITEM = new Item(new FabricItemSettings().group(ItemGroup.MISC)); +    // 对于 1.20.4 之前版本 
-      +    public static final class_1792 CUSTOM_ITEM = new class_1792(new FabricItemSettings()); 
 +    // 对于 1.20.5 之后版本 
 +    public static final class_1792 CUSTOM_ITEM = new class_1792(new class_1792.class_1793()); 
     @Override     @Override
-    public void onInitialize() +    public void onInitialize() { 
-    +        class_2378.method_10230(class_7923.field_41178, new class_2960("tutorial", "custom_item"), CUSTOM_ITEM); 
-        Registry.register(Registry.ITEM, new Identifier("tutorial", "fabric_item"), FABRIC_ITEM); +    }
-    } +
 } }
-</code+</yarncode
-现在新物品已添加到Minecraft中,运行''runClient'' Gradle任务以查看它的运行情况。+现在新物品已添加到 Minecraft 中,运行“Minecraft Client”运行配置或者 ''runClient'' Gradle任务以查看它的运行情况,在游戏内执行命令 ''/​give @s tutorial:​custom_item''
  
 {{:tutorial:2019-02-17_16.50.44.png?400|}} {{:tutorial:2019-02-17_16.50.44.png?400|}}
  
-==== 添加物品材质 ====+为了简便,也可以像这样简化代码: 
 +<yarncode java [enable_line_numbers="true"]> 
 +public class ExampleMod implements ModInitializer {
  
-为物品注册材质需要物品模型.json文件和材质图像文件。 您将需要将它们添加到资源目录中。每个的直接路径是:+    // an instance of our new item 
 +    public static final class_1792 CUSTOM_ITEM = 
 +      class_2378.method_10230(class_7923.field_41178, new class_2960("tutorial", "custom_item"), 
 +        new class_1792(new class_1792.class_1793()));
  
-    物品模型: <根目录>/resources/assets/tutorial/models/item/fabric_item.json +    @Override 
-    物品材质: <根目录>/resources/assets/tutorial/textures/item/fabric_item.png +    public void onInitialize() { 
-我们将使用[[https://i.imgur.com/CqLSMEQ.png|这个示例材质]]。+    } 
 +
 +</yarncode> 
 + 
 +==== 添加物品纹理 ==== 
 + 
 +为物品注册纹理需要物品模型.json文件和纹理图像文件。 您将需要将它们添加到资源目录中。每个的直接路径是: 
 + 
 +    物品模型: <根目录>/resources/assets/tutorial/models/item/custom_item.json 
 +    物品纹理: <根目录>/resources/assets/tutorial/textures/item/custom_item.png 
 +我们将使用[[https://i.imgur.com/CqLSMEQ.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+    [Server-Worker-1/WARN]: Unable to load model: 'tutorial:custom#inventory' referenced from: tutorial:custom_item#inventory: java.io.FileNotFoundException: tutorial:models/item/custom_item.json
 游戏能很方便地告诉你它想要的资源路径。遇事不决,日志解决。 游戏能很方便地告诉你它想要的资源路径。遇事不决,日志解决。
  
Line 48: Line 63:
 <code JavaScript> <code JavaScript>
 { {
-  "parent": "builtin/generated",+  "parent": "item/generated",
   "textures": {   "textures": {
-    "layer0": "tutorial:item/fabric_item"+    "layer0": "tutorial:item/custom_item"
   }   }
 } }
 </code> </code>
-物品模型会将所有属性继承自父模型,例如对工具、方块等物品十分有用的自定义手持模型(''item/handheld'')。这里的''builtin/generated''父模型告诉MC用给出的材质文件生成一个模型,而''textures/layer0''材质图像文件的位置。+物品模型会将所有属性继承自父模型,例如对工具、方块等物品十分有用的自定义手持模型(''item/handheld'')。''textures/layer0''纹理图像文件的位置。
  
-最终材质的结果:+最终纹理的结果:
  
 {{:tutorial:item_texture.png?400|}} {{:tutorial:item_texture.png?400|}}
  
 ==== 创建物品类 ==== ==== 创建物品类 ====
-要为物品添加自定义行为,则需要创建一个物品类。其默认的构造方法需要一个Item.Settings对象。 +要为物品添加自定义行为,则需要创建一个物品类。其默认的构造方法需要一个 ''Item.Settings'' 对象。 
-<code java [enable_line_numbers="true"]> +<yarncode java [enable_line_numbers="true"]> 
-public class FabricItem extends Item +public class CustomItem extends class_1792 { 
-    public FabricItem(Settings settings) + 
-    {+    public CustomItem(class_1793 settings) {
         super(settings);         super(settings);
     }     }
 } }
-</code>+</yarncode>
 自定义物品类的一个实际用例是使该物品在右击时播放声音: 自定义物品类的一个实际用例是使该物品在右击时播放声音:
-<code java [enable_line_numbers="true"]> +<yarncode java [enable_line_numbers="true"]> 
-public class FabricItem extends Item +public class CustomItem extends class_1792 { 
-    public FabricItem(Settings settings) + 
-    {+    public CustomItem(class_1793 settings) {
         super(settings);         super(settings);
     }     }
-      +
     @Override     @Override
-    public TypedActionResult<ItemStackuse(World world, PlayerEntity playerEntityHand hand) { +    public class_1271<class_1799method_7836(class_1937 world, class_1657 userclass_1268 hand) { 
-        playerEntity.playSound(SoundEvents.BLOCK_WOOL_BREAK, 1.0F, 1.0F); +        playerEntity.method_5783(class_3417.field_14983, 1.0F, 1.0F); 
-        return TypedActionResult.success(playerEntity.getStackInHand(hand));+        return class_1271.method_22427(playerEntity.method_5998(hand));
     }     }
 } }
-</code>+</yarncode>
  
-用新物品类的实例替换旧的Item对象: +用新物品类的实例替换旧的 <yarn class_1792> 对象: 
-<code java [enable_line_numbers="true"]>+<yarncode java [enable_line_numbers="true"]>
 public class ExampleMod implements ModInitializer { public class ExampleMod implements ModInitializer {
-    //创建item的实例 + 
-    public static final FabricItem FABRIC_ITEM = new FabricItem(new Item.Settings().group(ItemGroup.MISC));+    // 新物品的实例 
 +    public static final CustomItem CUSTOM_ITEM = new CustomItem(new class_1792.class_1793());
     [...]     [...]
 } }
-</code>+</yarncode>
 如果你正确执行了所有操作,则使用该物品现在应该会播放声音。 如果你正确执行了所有操作,则使用该物品现在应该会播放声音。
  
 ==== 如果我想更改物品的堆叠大小怎么办? ==== ==== 如果我想更改物品的堆叠大小怎么办? ====
  
-使用'FabricItemSettings''内的''maxCount(int size)''来指定最大堆叠数。请注意,如果你的物品是有耐久的(及耐久归零后会被破坏),那么此物品无法设置最大堆叠数,否则游戏将抛出运行时错误(''RuntimeException''。 +使用 ''Item.Settings'' 内的 ''maxCount(int size)'' 来指定最大堆叠数。请注意,如果你的物品是有耐久的(及耐久归零后会被破坏),那么此物品无法设置最大堆叠数,否则游戏将抛出 RuntimeException。 
-<code java [enable_line_numbers="true"]>+<yarncode java [enable_line_numbers="true"]>
 public class ExampleMod implements ModInitializer { public class ExampleMod implements ModInitializer {
  
-    //我们新物品的实例,最大堆叠大小为16 +    // 我们新物品的实例,最大堆叠大小为16 
-    public static final FabricItem FABRIC_ITEM = new FabricItem(new Item.Settings().group(ItemGroup.MISC).maxCount(16));+    public static final CustomItem CUSTOM_ITEM = new CustomItem(new class_1792.class_1793().maxCount(16));
     [...]     [...]
 +}
 +</yarncode>
 +
 +==== 让物品能作为燃料或者可堆肥 ====
 +
 +如果需要让物品能作为燃料在熔炉中燃烧,可以使用 ''FuelRegistry'',例如:
 +<code java>
 +public class ExampleMod implements ModInitializer {
 +    [...]
 +    
 +    @Override
 +    public void onInitialize() {
 +        [...]
 +        FuelRegistry.INSTANCE.add(CUSTOM_ITEM, 300)
 +    }
 } }
 </code> </code>
 +
 +类似地,你也可以使用 ''CompostingChanceRegistry'' 来让它可以在堆肥桶中堆肥。
 ==== 下一步 ==== ==== 下一步 ====
 试着[[zh_cn:tutorial:itemgroup|将你的物品添加到一个物品组中]]。 试着[[zh_cn:tutorial:itemgroup|将你的物品添加到一个物品组中]]。
zh_cn/tutorial/items.1610778223.txt.gz · Last modified: 2021/01/16 06:23 by solidblock