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
Last revisionBoth sides next revision
zh_cn:tutorial:items [2022/12/15 23:56] – [介绍] solidblockzh_cn:tutorial:items [2024/04/15 01:23] solidblock
Line 5: Line 5:
 添加一个基本的物品是编写模组的第一步。你将需要创建一个 ''Item'' 对象,注册,并提供一个纹理。要向物品添加其他行为,你将需要一个自定义的 ''Item'' 类。在本教程以及以后的所有教程中,均使用 ''tutorial'' 作为命名空间。如果你有单独的模组 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''对象中的静态字段,标识符用来给内容“加标签”。内容则是您添加的东西的一个实例。这可以随时调用,只要发生在初始化阶段。 +这里使用原版注册方式来注册,基本语法是 ''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 {
 +
 +    // 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()));
 +
 +    @Override
 +    public void onInitialize() {
 +    }
 +}
 +</yarncode>
  
 ==== 添加物品纹理 ==== ==== 添加物品纹理 ====
Line 34: Line 51:
 为物品注册纹理需要物品模型.json文件和纹理图像文件。 您将需要将它们添加到资源目录中。每个的直接路径是: 为物品注册纹理需要物品模型.json文件和纹理图像文件。 您将需要将它们添加到资源目录中。每个的直接路径是:
  
-    物品模型: <根目录>/resources/assets/tutorial/models/item/fabric_item.json +    物品模型: <根目录>/resources/assets/tutorial/models/item/custom_item.json 
-    物品纹理: <根目录>/resources/assets/tutorial/textures/item/fabric_item.png+    物品纹理: <根目录>/resources/assets/tutorial/textures/item/custom_item.png
 我们将使用[[https://i.imgur.com/CqLSMEQ.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 46: 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'' 是纹理图像文件的位置。
  
 最终纹理的结果: 最终纹理的结果:
Line 59: Line 76:
  
 ==== 创建物品类 ==== ==== 创建物品类 ====
-要为物品添加自定义行为,则需要创建一个物品类。其默认的构造方法需要一个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 FabricItemSettings().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"]> <code 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 FabricItemSettings().group(ItemGroup.MISC).maxCount(16));+    public static final CustomItem CUSTOM_ITEM = new CustomItem(new class_1792.class_1793().maxCount(16));
     [...]     [...]
 } }
 </code> </code>
 +
 +==== 让物品能作为燃料或者可堆肥 ====
 +
 +如果需要让物品能作为燃料在熔炉中燃烧,可以使用 ''FuelRegistry'',例如:
 +<code java>
 +public class ExampleMod implements ModInitializer {
 +    [...]
 +    
 +    @Override
 +    public void onInitialize() {
 +        [...]
 +        FuelRegistry.INSTANCE.add(CUSTOM_ITEM, 300)
 +    }
 +}
 +</code>
 +
 +类似地,你也可以使用 ''CompostingChanceRegistry'' 来让它可以在堆肥桶中堆肥。
 ==== 下一步 ==== ==== 下一步 ====
 试着[[zh_cn:tutorial:itemgroup|将你的物品添加到一个物品组中]]。 试着[[zh_cn:tutorial:itemgroup|将你的物品添加到一个物品组中]]。
zh_cn/tutorial/items.txt · Last modified: 2024/04/15 01:25 by solidblock