User Tools

Site Tools


zh_cn:tutorial:blocks

添加一个方块

介绍

要将一个块添加到您的mod,您将需要注册一个新的Block类实例。 为了更好地控制您的块,可以创建一个自定义方块类。 我们还将研究添加方块模型。

创建一个方块

首先,在您的主要mod类中创建Block的实例。 块的构造函数使用FabricBlockSettings构造器来设置方块的基本属性,例如硬度和抗炸性:

  1. public class ExampleMod implements ModInitializer
  2. {
  3. // an instance of our new block
  4. public static final Block EXAMPLE_BLOCK = new Block(FabricBlockSettings.of(Material.METAL).build());
  5. [...]
  6. }

注册块一个方块

注册块与注册项目相同。 调用Registry.register并传递适当的参数。

  1. public class ExampleMod implements ModInitializer
  2. {
  3. // block creation
  4. [...]
  5.  
  6. @Override
  7. public void onInitialize()
  8. {
  9. Registry.register(Registry.BLOCK, new Identifier("tutorial", "example_block"), EXAMPLE_BLOCK);
  10. }
  11. }

您的方块不能作为物品存入背包,但可以通过使用/setblock tutorial:example_block在游戏中看到。

注册一个BlockItem

在大多数情况下,您希望能够使用某项放置方块。 为此,您需要在项目注册表中注册一个相应的BlockItem。 您可以通过在Registry.ITEM下注册BlockItem的实例来执行此操作。 该项目的注册表名称通常应与该块的注册表名称相同。

  1. public class ExampleMod implements ModInitializer
  2. {
  3. // block creation
  4. []
  5.  
  6. @Override
  7. public void onInitialize()
  8. {
  9. // block registration
  10. [...]
  11.  
  12. Registry.register(Registry.ITEM, new Identifier("tutorial", "example_block"), new BlockItem(EXAMPLE_BLOCK, new Item.Settings().group(ItemGroup.MISC)));
  13. }
  14. }

给您的方块一个模型

您可能已经注意到,该区块只是游戏中紫色和黑色棋盘格图案。 这是Minecraft向您显示该模块没有模型的方式。 与对项目建模相比,对模块进行建模要困难一些。 您将需要三个文件:块状态文件,块模型文件和项目模型文件(如果块具有BlockItem)。 如果您不使用原版纹理,则还需要纹理。 文件应位于此处:

Blockstate: src/main/resources/assets/tutorial/blockstates/example_block.json
Block Model: src/main/resources/assets/tutorial/models/block/example_block.json
Item Model: src/main/resources/assets/tutorial/models/item/example_block.json
Block Texture: src/main/resources/assets/tutorial/textures/block/example_block.png

块状态文件根据其块状态确定该块应使用的模型。 由于我们的块只有一个状态,因此文件很简单:

src/main/resources/assets/tutorial/blockstates/example_block.json
{
  "variants": {
    "": { "model": "tutorial:block/example_block" }
  }
}

方块模型文件定义了块的形状和纹理。 我们将使用block/cube_all,这将使我们能够轻松地在块的所有面上设置相同的纹理。

src/main/resources/assets/tutorial/models/block/example_block.json
{
  "parent": "block/cube_all",
  "textures": {
    "all": "tutorial:block/example_block"
  }
}

在大多数情况下,您希望该块在手中看起来相同。 为此,您可以制作一个从方块模型文件继承的项目文件:

src/main/resources/assets/tutorial/models/item/example_block.json
{
  "parent": "tutorial:block/example_block"
}

加载Minecraft,您的方块最终应该具有纹理!

添加块战凋落物表

该方块必须有一张凋落物表,以便在该块损坏时掉落任何物品。 假设您已经为方块创建了一个项目并使用与该块相同的名称进行注册,则以下文件将产生常规的块放置“src/main/resources/data/wikitut/loot_tables/blocks/example_block.json”。

src/main/resources/data/tutorial/loot_tables/blocks/example_block.json
{
  "type": "minecraft:block",
  "pools": [
    {
      "rolls": 1,
      "entries": [
        {
          "type": "minecraft:item",
          "name": "tutorial:example_block"
        }
      ],
      "conditions": [
        {
          "condition": "minecraft:survives_explosion"
        }
      ]
    }
  ]
}

在生存模式下被破坏时,该方块现在会掉落物品。

创建一个方块类

当创建一个简单的块时,上述方法效果很好,但是有时您想要一个具有特殊机制的special方块。 我们将创建一个单独的类来扩展Block来执行此操作。 该类需要一个带有BlockSettings参数的构造函数。

  1. public class ExampleBlock extends Block
  2. {
  3. public ExampleBlock(Settings settings)
  4. {
  5. super(settings);
  6. }
  7. }

就像我们在项目教程中所做的一样,您可以覆盖block类中的方法以实现自定义功能。 假设您希望您的代码块是透明的:

    @Environment(EnvType.CLIENT)
    public BlockRenderLayer getRenderLayer() {
        return BlockRenderLayer.TRANSLUCENT;
    }

要将这个块添加到游戏中,请在注册时将new Block替换为new ExampleBlock

  1. public class ExampleMod implements ModInitializer
  2. {
  3. // an instance of our new item
  4. public static final ExampleBlock EXAMPLE_BLOCK = new ExampleBlock(Block.Settings.of(Material.STONE));
  5. [...]
  6. }

您的自定义块现在应该是透明的!

下一步

zh_cn/tutorial/blocks.txt · Last modified: 2019/12/19 02:27 by lightcolour