User Tools

Site Tools


zh_cn:tutorial:structures

Differences

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

Link to this comparison view

Both sides previous revisionPrevious revision
Last revisionBoth sides next revision
zh_cn:tutorial:structures [2021/07/24 16:27] – [创建地物] solidblockzh_cn:tutorial:structures [2021/07/24 16:34] – [创建一个生成器] not done solidblock
Line 45: Line 45:
 </code> </code>
  
-==== 创建一个生成器 ====+===== 创建生成器 ====
 +你可能已经注意到,我们需要创建生成器。
  
-您可能已经注意到,我们需要创建一个生成器。 我们将其命名为MyGenerator,并在StructureStart类的initialize法中对其进行引用。 它不需要覆盖任何内容,但需要满足以下条件+This is where structure files and generating straight from a ''generate'' method part ways. 有两种式实现这样做
  
-*指向您的结构文件的标识符; 如果需要示例请使用''igloo / top''。 +  * If you want, you can simply override ''generate'' in your piece class and use ''addBlock'' to place blocks directly in the world. This is a valid option and was popular pre-1.13. 
-   *某种安装方法-addParts是一个好名字:+  * Use structure files. These are rather powerful at this point and are highly recommended. 
 + 
 +本教程中,使用结构文件,不需要override任何内容,但确实需要: 
 +  * 指向结构文件的标识符(identifier例如''"igloo/top"''。 
 +  一些安装方法——例如''addPieces''就很不错。
  
 <code java> <code java>
-public static void addParts(StructureManager structureManager_1, BlockPos blockPos_1Rotation rotation_1 +public class MyGenerator { 
-    List<StructurePiece> list_1Random random_1DefaultFeatureConfig featureConfig+  private static final Identifier IGLOO_TOP = new Identifier("igloo/top"); 
-    + 
 +  public static void addPieces(StructureManager manager, BlockPos posBlockRotation rotation, List<StructurePiece> pieces) { 
 +    pieces.add(new MyPiece(managerposIGLOO_TOP, rotation)); 
 +  }
 } }
 </code> </code>
  
-addParts方法中,可以选择哪些结构件添加到生成过程中。 您可以添加如下内容:+''addPieces''方法中,可以选择往你的生成过程中添加哪些结构。 
 + 
 +我们现在//生成器类//创建我们刚刚提到的结构,创建名为''MyPiece''的类,继承''SimpleStructurePiece'' 
 + 
 +Override required methods, and add a constructor that takes in a ''StructureManager'', ''BlockPos'', ''Identifier'' and ''Rotation''
 +**toNbt isn't required but is available if you need it**. 
 +We're also implementing ''initializeStructureData'', which is not an override. 
 +We also have 2 constructors: 1 for our own pieces, and one for registry. 
 +A basic template would be:
  
 <code java> <code java>
-list_1.add(new MyGenerator.Piece(structureManager_1, identifier, blockPos, rotation_1))+public static class MyPiece extends SimpleStructurePiece { 
-</code>+  private final BlockRotation rotation
 +  private final Identifier template;
  
-标识符是我们最近创建的路径。+  public MyPiece(StructureManager structureManager, CompoundTag compoundTag) { 
 +    super(ExampleMod.MY_PIECE, compoundTag); 
 +    this.template = new Identifier(compoundTag.getString("Template")); 
 +    this.rotation = BlockRotation.valueOf(compoundTag.getString("Rot")); 
 +    this.initializeStructureData(structureManager); 
 +  }
  
-现在,我们将创建我们刚刚引用的作品; 创建一个名为Piece的类,该类扩展了SimpleStructurePiece//在您的生成器类中//.+  public MyPiece(StructureManager structureManager, BlockPos pos, Identifier template, BlockRotation rotation) { 
 +    super(ExampleMod.MY_PIECE, 0); 
 +    this.pos = pos; 
 +    this.rotation = rotation; 
 +    this.template = template;
  
-覆盖必需的方法,并添加一个接受StructureManager,Identifier,BlockPos和Rotation的构造函数。 ** toNbt不是必需的,但在需要时可用**。 我们还将使用不同的参数实现自己的setStructureData,因此它不是替代。 我们还有2个构造函数:1个构造函数,一个构造函数。 一个基本的模板是: +    this.initializeStructureData(structureManager); 
-<code java [enable_line_numbers="true"]> +  } 
-public static class Piece extends SimpleStructurePiece { + 
-    private Rotation rotation; +  private void initializeStructureData(StructureManager structureManager) { 
-    private Identifier template; +    Structure structure structureManager.getStructureOrBlank(this.template); 
-     +    StructurePlacementData placementData = (new StructurePlacementData()
-    public Piece(StructureManager structureManager_1, Identifier identifier_1, BlockPos blockPos_1, Rotation rotation_1) { +      .setRotation(this.rotation
-        super(MyModClass.myStructurePieceType, 0); +      .setMirror(BlockMirror.NONE
-         +      .addProcessor(BlockIgnoreStructureProcessor.IGNORE_STRUCTURE_BLOCKS); 
-        this.pos blockPos_1; +    this.setStructureData(structure, this.pos, placementData); 
-        this.rotation = rotation_1; +  
-        this.template = identifier_1; + 
-         +  protected void toNbt(CompoundTag tag) { 
-        this.setStructureData(structureManager_1); +    super.toNbt(tag); 
-    +    tag.putString("Template", this.template.toString()); 
-     +    tag.putString("Rot", this.rotation.name()); 
-    public Piece(StructureManager structureManager_1, CompoundTag compoundTag_1{ +  
-        super(MyModClass.myStructurePieceType, compoundTag_1); + 
-        this.identifier = new Identifier(compoundTag_1.getString("Template")); +  @Override 
-        this.rotation = Rotation.valueOf(compoundTag_1.getString("Rot")); +  protected void handleMetadata(String metadata, BlockPos posServerWorldAccess serverWorldAccess, Random random
-        this.setStructureData(structureManager_1); +      BlockBox boundingBox) { 
-    +  }
-     +
-    @Override +
-    protected void toNbt(CompoundTag compoundTag_1) { +
-        super.toNbt(compoundTag_1); +
-        compoundTag_1.putString("Template", this.template.toString()); +
-        compoundTag_1.putString("Rot", this.rotation.name()); +
-    +
-     +
-    public void setStructureData(StructureManager structureManager) { +
-        Structure structure_1 = structureManager.getStructureOrBlank(this.identifier); +
-        StructurePlacementData structurePlacementData_1 = (new StructurePlacementData()).setRotation(this.rotation).setMirrored(Mirror.NONE).setPosition(pos).addProcessor(BlockIgnoreStructureProcessor.IGNORE_STRUCTURE_BLOCKS); +
-        this.setStructureData(structure_1, this.pos, structurePlacementData_1); +
-    } +
-     +
-    @Override +
-    protected void handleMetadata(String string_1, BlockPos blockPos_1IWorld iWorld_1, Random random_1MutableIntBoundingBox mutableIntBoundingBox_1) { +
-         +
-    } +
-     +
-    @Override +
-    public boolean generate(IWorld iWorld_1, Random random_1, MutableIntBoundingBox mutableIntBoundingBox_1, ChunkPos chunkPos_1) { +
-       +
-    }+
 } }
 </code> </code>
          
-handleMetadata是查看结构中的数据块并根据发现的内容执行任务的地方。 在原版结构中,数据块放置在箱子上方,因此可以用这种方法将它们填满战利品。+''handleMetadata'' is where you look at data blocks within your structure and can do tasks based on what you find. 
 +This can be good for dynamic stuff such as placing certain mobs based on what mod is on and so on.
  
-我们将StructurePieceType设置为MyModClass.myStructurePiece类型; 这是保存您注册的结构件的变量。 在完成generate函数之后,我们将对其进行处理,该函数将设置结构的位置并生成它:+In vanilla structures, data blocks are placed above chests so they can be filled with loot in this method 
 +HOWEVER, you do not need to use datablocks to place chests with loot. Instead, use this command to set a north facing chest with a loottable.  
 +Save this chest into your structure's nbt file and it will generate loot when opened for the first time. (Don't open the chest before saving to the nbt file!) 
 +<code>/setblock ~ ~ ~ minecraft:chest[facing=north]{LootTable:"modid:loottable"}</code>
  
-<code java [enable_line_numbers="true"]> +We set the ''StructurePieceType'' to ''ExampleMod.MY_PIECE''; this is the variable that holds your registered structure piece
-@Override +
-public boolean generate(IWorld iWorld_1, Random random_1, MutableIntBoundingBox mutableIntBoundingBox_1, ChunkPos chunkPos_1) { +
-    int yHeight = iWorld_1.getTop(Heightmap.Type.WORLD_SURFACE_WG, this.pos.getX() + 8, this.pos.getZ() + 8); +
-    this.pos = this.pos.add(0, yHeight - 1, 0); +
-    return super.generate(iWorld_1, random_1, mutableIntBoundingBox_1, chunkPos_1); +
-+
-</code> +
-     +
-在这种情况下,我们仅获取块中间最高块的y位置,并从该位置生成结构。+
  
 ==== 注册功能 ==== ==== 注册功能 ====