User Tools

Site Tools


zh_cn:tutorial:blocks

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
Next revisionBoth sides next revision
zh_cn:tutorial:blocks [2022/12/16 01:08] – [添加一个方块] solidblockzh_cn:tutorial:blocks [2023/08/23 00:23] – [创建一个方块] wjz_p
Line 5: Line 5:
 ===== 创建一个方块 ===== ===== 创建一个方块 =====
  
-首先创建''Block''的实例。该实例可以存储在任何地方,但是我们会在''ModInitializer''的顶部开始。''Block''构造器函数需要一个''AbstractBlock.Settings''实例,也就是用于配置方块属性的构造器。Fabric提供一个''FabricBlockSettings''构造器类以及更多可用的选项。+首先创建 ''Block'' 的实例。该实例可以存储在任何地方,但是我们会在 ''ModInitializer'' 的顶部开始。''Block'' 构造器函数需要一个 ''AbstractBlock.Settings'' 实例,也就是用于配置方块属性的构造器。Fabric 提供一个 ''FabricBlockSettings'' 构造器类以及更多可用的选项。
  
 <code java [enable_line_numbers="true"]> <code java [enable_line_numbers="true"]>
Line 11: Line 11:
  
     /* 声明和初始化我们的自定义方块实例。     /* 声明和初始化我们的自定义方块实例。
-       我们将方块材质(material)设置为METAL(金属),需要镐来高效挖掘+       我们将方块材质(material)设置为 METAL(金属)。
                
-       `strength`会将方块的硬度和抗性设为同一个值。+       `strength` 会将方块的硬度和抗性设为同一个值。
        硬度决定了方块需要多久挖掘,抗性决定了方块抵御爆破伤害(如爆炸)的能力。        硬度决定了方块需要多久挖掘,抗性决定了方块抵御爆破伤害(如爆炸)的能力。
-       石头的硬度为1.5f,抗性为6.0f,黑曜石的硬度为50.0f,抗性为1200.0f。+       石头的硬度为 1.5f,抗性为 6.0f,黑曜石的硬度为 50.0f,抗性为 1200.0f。
                
-       可以在`Blocks`类中查找所有原版方块的统计+       可以在`Blocks`类中查找所有原版方块,你可以以此作为参考
     */     */
-    public static final Block EXAMPLE_BLOCK = new Block(FabricBlockSettings.of(Material.METAL).hardness(4.0f)); +    //public static final Block EXAMPLE_BLOCK = new Block(FabricBlockSettings.of(Material.METAL).hardness(4.0f));fabric api 版本 <= 0.77.0 
-    +    public static final Block EXAMPLE_BLOCK  = new Block(FabricBlockSettings.create().strength(4.0f));
     @Override     @Override
     public void onInitialize() {     public void onInitialize() {
Line 29: Line 29:
 ==== 注册方块 ==== ==== 注册方块 ====
  
-方块应该注册在''Block.REGISTRY''注册表。调用//Registry.register//并传递适当的参数。+方块应该注册在 ''Registries.BLOCK'' 注册表。调用 ''Registry.//register//'' 并传递适当的参数。你可以直接在 ''onInitialize'' 方法中注册方块,也可以在静态部分创建方块实例时将其注册,因为 ''register'' 方法会返回这个方块实例自身
  
-<code java [enable_line_numbers="true"]>+如果你使用的是 1.19.2 以下的版本,请将 ''Registries.BLOCK'' 替换为 ''Registry.BLOCK''。 
 + 
 +<code java [enable_line_numbers="true",highlight_lines_extra="11"]>
 public class ExampleMod implements ModInitializer { public class ExampleMod implements ModInitializer {
  
-    public static final Block EXAMPLE_BLOCK = new Block(FabricBlockSettings.of(Material.METAL).hardness(4.0f));+    public static final Block EXAMPLE_BLOCK = new Block(FabricBlockSettings.of(Material.METAL).strength(4.0f));
          
     @Override     @Override
-    public void onInitialize() +    public void onInitialize() { 
-    +        Registry.register(Registries.BLOCK, new Identifier("tutorial", "example_block"), EXAMPLE_BLOCK);
-        Registry.register(Registry.BLOCK, new Identifier("tutorial", "example_block"), EXAMPLE_BLOCK);+
     }     }
 } }
 </code> </code>
  
-您的方块不能作为物品存入背包,但可以通过使用''/setblock tutorial:example_block''在游戏中看到。+您的方块不能作为物品存入背包,但可以通过使用 ''/setblock tutorial:example_block'' 在游戏中看到。
  
 ==== 为方块注册物品 ==== ==== 为方块注册物品 ====
  
-在大多数情况下,您希望能够拿着物品放置方块。为此,您需要在物品注册表中注册一个相应的BlockItem。您可以通过在Registry.ITEM下注册BlockItem的实例来执行此操作。该物品的注册表名称通常应与该方块的注册表名称相同。+在大多数情况下,您希望能够拿着物品放置方块。为此,您需要在物品注册表中注册一个相应的物品。您可以通过在 ''Registries.ITEM'' 下注册 ''BlockItem'' 的实例来执行此操作。该物品的注册表名称通常应与该方块的注册表名称相同。
  
 <code java [enable_line_numbers="true",highlight_lines_extra="12"]> <code java [enable_line_numbers="true",highlight_lines_extra="12"]>
 public class ExampleMod implements ModInitializer { public class ExampleMod implements ModInitializer {
  
-    /* Declare and initialize our custom block instance. +    public static final Block EXAMPLE_BLOCK = new Block(FabricBlockSettings.of(Material.METAL).strength(4.0f));
-       We set out block material to METAL, which requires a pickaxe to efficiently break. +
-       Hardness represents how long the break takes to break. Stone has a hardness of 1.5f, while Obsidian has a hardness of 50.0f. +
-    */ +
-    public static final Block EXAMPLE_BLOCK = new Block(FabricBlockSettings.of(Material.METAL));+
          
     @Override     @Override
     public void onInitialize() {     public void onInitialize() {
-        Registry.register(Registry.BLOCK, new Identifier("tutorial", "example_block"), EXAMPLE_BLOCK); +        Registry.register(Registries.BLOCK, new Identifier("tutorial", "example_block"), EXAMPLE_BLOCK); 
-        Registry.register(Registry.ITEM, new Identifier("tutorial", "example_block"), new BlockItem(EXAMPLE_BLOCK, new Item.Settings().group(ItemGroup.MISC)));+        Registry.register(Registries.ITEM, new Identifier("tutorial", "example_block"), new BlockItem(EXAMPLE_BLOCK, new FabricItemSettings()));
     }     }
 } }
Line 171: Line 168:
 ===== 创建自定义方块类 ===== ===== 创建自定义方块类 =====
  
-当创建一个简单的方块时,上述方法效果很好,但是有时您想要一个具有//独一无二//机制的方块。我们将创建一个//单独//的扩展''Block''的类来执行此操作。该类需要一个带有''AbstractBlock.Settings''参数的构造器:+当创建一个简单的方块时,上述方法效果很好,但是有时您想要一个具有//独一无二//机制的方块。我们将创建一个//单独//的扩展 ''Block'' 的类来执行此操作。该类需要一个带有 ''AbstractBlock.Settings'' 参数的构造器:
  
 <code java [enable_line_numbers="true"]> <code java [enable_line_numbers="true"]>
Line 182: Line 179:
 </code> </code>
  
-你可以在方块类中覆盖方法以实现特殊功能。这里是''onUse''方法的实现,右键单击方块时会调用此方法。我们检查交互是否在服务器进行,并向玩家发送消息,//"Hello, world!"//+你可以在方块类中覆盖方法以实现特殊功能。这里是 ''onUse'' 方法的实现,右键单击方块时会调用此方法。我们检查交互是否在服务器进行,并向玩家发送消息,//"Hello, world!"//
  
 <code java [enable_line_numbers="true",highlight_lines_extra="8,9,10,11,12,13,14,15"]> <code java [enable_line_numbers="true",highlight_lines_extra="8,9,10,11,12,13,14,15"]>
Line 202: Line 199:
 </code> </code>
  
-要使用自定义方块类,请在注册时将//new Block//替换为//new ExampleBlock//+要使用自定义方块类,请在注册时将 ''new Block'' 替换为 ''new ExampleBlock''
  
 <code java [enable_line_numbers="true",highlight_lines_extra="3"]> <code java [enable_line_numbers="true",highlight_lines_extra="3"]>
 public class ExampleMod implements ModInitializer { public class ExampleMod implements ModInitializer {
  
-    public static final ExampleBlock EXAMPLE_BLOCK = new ExampleBlock(Block.Settings.of(Material.STONE).hardness(4.0f));+    public static final ExampleBlock EXAMPLE_BLOCK = new ExampleBlock(FabricBlockSettings.of(Material.STONE).hardness(4.0f));
          
     @Override     @Override
     public void onInitialize() {     public void onInitialize() {
-        Registry.register(Registry.BLOCK, new Identifier("tutorial", "example_block"), EXAMPLE_BLOCK); +        Registry.register(Registries.BLOCK, new Identifier("tutorial", "example_block"), EXAMPLE_BLOCK); 
-        Registry.register(Registry.ITEM, new Identifier("tutorial", "example_block"), new BlockItem(EXAMPLE_BLOCK, new Item.Settings().group(ItemGroup.MISC)));+        Registry.register(Registries.ITEM, new Identifier("tutorial", "example_block"), new BlockItem(EXAMPLE_BLOCK, new FabricItemSettings()));
     }     }
 } }
 </code> </code>
  
-==== 自定义VoxelShape ====+==== 自定义形状 ====
  
-当使用不能''完整''填充一个方块的方块模型(例如铁砧、台阶、楼梯)时,邻近的方块隐藏面:+当使用不能完整填充一个方块的方块模型(例如铁砧、台阶、楼梯)而其形状却仍是完整的时,邻近的方块隐藏面就会暴露
  
 {{:tutorial:voxelshape_wrong.png?200|}} {{:tutorial:voxelshape_wrong.png?200|}}
  
-要解决这个问题,我们需要定义方块的''VoxelShape''+要解决这个问题,我们需要定义方块的 ''VoxelShape''
  
-<code> +<code java
- @Override +public class ExambleBlock extends Block { 
- public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext context) { +    [...] 
-     return VoxelShapes.cuboid(0f, 0f, 0f, 1f, 1.0f, 0.5f); +    @Override 
- }+    public VoxelShape getOutlineShape(BlockState state, BlockView view, BlockPos pos, ShapeContext context) { 
 +        return VoxelShapes.cuboid(0f, 0f, 0f, 1f, 1.0f, 0.5f); 
 +    } 
 +}
 </code> </code>
  
-注意方块的//collision shape//默认为其描边形状,如果未被指定。+注意方块的//碰撞形状//默认为其描边形状,如果未被指定。
  
 {{:tutorial:voxelshape_fixed.png?200|}} {{:tutorial:voxelshape_fixed.png?200|}}
zh_cn/tutorial/blocks.txt · Last modified: 2024/04/15 01:52 by solidblock