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
Next revision
Previous revision
zh_cn:tutorial:structures [2021/07/24 16:27] – [创建特征] solidblockzh_cn:tutorial:structures [2022/09/29 05:27] (current) – 已过时 solidblock
Line 1: Line 1:
-====== 添加结构特征 [1.16.3] ====== 
-现在,往世界中注册并放置一些结构。 
  
-入药查看原版结构的实例,可以从简单的''IglooFeature''和''IglooGenerator''开始。然而,制作新结构的上升的标准是使用拼图结构,这样更易于使用并可以让你少打一些代码。[[zh_cn:tutorial:jigsaw|这里有关于拼图结构和制作方法的教程。]] 
- 
-对于大多数基本的结构,你需要地物(feature)和生成器(generator)。地物处理注册结构并在生成世界时加载的过程。生成器处理方块的放置,或者在结构文件中加载(如果选择这样做)。 
- 
-注意本教程依赖标记为实验性的[[https://github.com/FabricMC/fabric/pull/1097|Fabric API中的生物群系修改API]]。如果API不起作用,考虑使用[[?rev=1599808070|mixin版本]]。 
- 
-===== 创建地物 ===== 
-要创建基本的结构,我们推荐创建扩展''StructureFeature<DefaultFeatureConfig>''的类。大多数原版结构,如沉船、雪屋、神殿都是以''StructureFeature<DefaultFeatureConfig>''为基础, 
- 
-你需要覆写''getStructureStartFactory''方法。对于''getStructureStartFactory'',大多数原版的结构在其地物类中创建扩展''StructureStart''的类。 
- 
-<code java> 
-public class MyFeature extends StructureFeature<DefaultFeatureConfig> { 
-  public MyFeature(Codec<DefaultFeatureConfig> codec) { 
-    super(codec); 
-  } 
- 
-  @Override 
-  public StructureFeature.StructureStartFactory<DefaultFeatureConfig> getStructureStartFactory() { 
-    return Start::new; 
-  } 
- 
-  public static class Start extends StructureStart<DefaultFeatureConfig> { 
-    public Start(StructureFeature<DefaultFeatureConfig> feature, int chunkX, int chunkZ, BlockBox box, int references, 
-        long seed) { 
-      super(feature, chunkX, chunkZ, box, references, seed); 
-    } 
- 
-    // 世界尝试在新的结构中生成时调用,同时也是地物和结构之间的“空隙(gap)”。 
-    public void init(DynamicRegistryManager registryManager, ChunkGenerator chunkGenerator, StructureManager manager, int chunkX, 
-        int chunkZ, Biome biome, DefaultFeatureConfig config) { 
-      int x = chunkX * 16; 
-      int z = chunkZ * 16; 
-      int y = chunkGenerator.getHeight(x, z, Heightmap.Type.WORLD_SURFACE_WG); 
-      BlockPos pos = new BlockPos(x, y, z); 
-      BlockRotation rotation = BlockRotation.random(this.random); 
-      MyGenerator.addPieces(manager, pos, rotation, this.children); 
-      this.setBoundingBoxFromChildren(); 
-    } 
-  } 
-} 
-</code> 
- 
-==== 创建一个生成器 ==== 
- 
-您可能已经注意到,我们需要创建一个生成器。 我们将其命名为MyGenerator,并在StructureStart类的initialize方法中对其进行引用。 它不需要覆盖任何内容,但需要满足以下条件: 
- 
-*指向您的结构文件的标识符; 如果需要示例,请使用''igloo / top'' 
-   *某种安装方法-addParts是一个好名字: 
- 
-<code java> 
-public static void addParts(StructureManager structureManager_1, BlockPos blockPos_1, Rotation rotation_1,  
-    List<StructurePiece> list_1, Random random_1, DefaultFeatureConfig featureConfig) 
-     
-} 
-</code> 
- 
-在addParts方法中,您可以选择将哪些结构件添加到生成过程中。 您可以添加如下内容: 
- 
-<code java> 
-list_1.add(new MyGenerator.Piece(structureManager_1, identifier, blockPos, rotation_1)); 
-</code> 
- 
-标识符是我们最近创建的路径。 
- 
-现在,我们将创建我们刚刚引用的作品; 创建一个名为Piece的类,该类扩展了SimpleStructurePiece//在您的生成器类中//. 
- 
-覆盖必需的方法,并添加一个接受StructureManager,Identifier,BlockPos和Rotation的构造函数。 ** toNbt不是必需的,但在需要时可用**。 我们还将使用不同的参数实现自己的setStructureData,因此它不是替代。 我们还有2个构造函数:1个构造函数,一个构造函数。 一个基本的模板是: 
-<code java [enable_line_numbers="true"]> 
-public static class Piece extends SimpleStructurePiece { 
-    private Rotation rotation; 
-    private Identifier template; 
-     
-    public Piece(StructureManager structureManager_1, Identifier identifier_1, BlockPos blockPos_1, Rotation rotation_1) { 
-        super(MyModClass.myStructurePieceType, 0); 
-         
-        this.pos = blockPos_1; 
-        this.rotation = rotation_1; 
-        this.template = identifier_1; 
-         
-        this.setStructureData(structureManager_1); 
-    } 
-     
-    public Piece(StructureManager structureManager_1, CompoundTag compoundTag_1) { 
-        super(MyModClass.myStructurePieceType, compoundTag_1); 
-        this.identifier = new Identifier(compoundTag_1.getString("Template")); 
-        this.rotation = Rotation.valueOf(compoundTag_1.getString("Rot")); 
-        this.setStructureData(structureManager_1); 
-    } 
-     
-    @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_1, IWorld iWorld_1, Random random_1, MutableIntBoundingBox mutableIntBoundingBox_1) { 
-         
-    } 
-     
-    @Override 
-    public boolean generate(IWorld iWorld_1, Random random_1, MutableIntBoundingBox mutableIntBoundingBox_1, ChunkPos chunkPos_1) { 
-       
-    } 
-} 
-</code> 
-     
-handleMetadata是查看结构中的数据块并根据发现的内容执行任务的地方。 在原版结构中,数据块放置在箱子上方,因此可以用这种方法将它们填满战利品。 
- 
-我们将StructurePieceType设置为MyModClass.myStructurePiece类型; 这是保存您注册的结构件的变量。 在完成generate函数之后,我们将对其进行处理,该函数将设置结构的位置并生成它: 
- 
-<code java [enable_line_numbers="true"]> 
-@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位置,并从该位置生成结构。 
- 
-==== 注册功能 ==== 
- 
-最后一步是注册我们的功能。 我们需要注册: 
- 
-  * StructurePieceType 
-  * StructureFeature<DefaultFeatureConfig> 
-  * StructureFeature<?> 
- 
-我们还需要将结构添加到“结构”列表中,并将其添加到每个生物群系中,作为功能部件和生成步骤。 
- 
-注册件类型: 
-<code java> 
-public static final StructurePieceType myStructurePieceType = Registry.register(Registry.STRUCTURE_PIECE, "my_piece", MyGenerator.Piece::new); 
-</code> 
-   
-注册功能: 
-<code java> 
-public static final StructureFeature<DefaultFeatureConfig> myFeature = Registry.register(Registry.FEATURE, "my_feature", new MyFeature()); 
-</code> 
-   
-注册结构: 
-<code java> 
-public static final StructureFeature<?> myStructure = Registry.register(Registry.STRUCTURE_FEATURE, "my_structure", myFeature); 
-</code> 
-   
-要将功能放入功能列表,可以使用: 
-<code java> 
-Feature.STRUCTURES.put("My Awesome Feature", myFeature); 
-</code> 
-   
-对于测试,将功能注册到每个生物群系并将生成率设置为100%是个好主意,这样您就可以确保其生成并正常工作。 您可能不希望您的结构漂浮在水中,因此我们也将其过滤掉。 通过遍历生物群系列表并将其添加为特征和生成步骤,将其添加到每个生物群系: 
- 
-<code java [enable_line_numbers="true"]> 
-for(Biome biome : Registry.BIOME) { 
-    if(biome.getCategory() != Biome.Category.OCEAN && biome.getCategory() != Biome.Category.RIVER) { 
-        biome.addStructureFeature(myFeature, new DefaultFeatureConfig()); 
-        biome.addFeature(GenerationStep.Feature.SURFACE_STRUCTURES, Biome.configureFeature(myFeature, new DefaultFeatureConfig(), Decorator.CHANCE_PASSTHROUGH, new ChanceDecoratorConfig(0))); 
-    } 
-} 
-</code> 
- 
-ChanceDecoratorConfig的参数基本上是在生成之前将跳过多少个块。 0是每个块,1是彼此,并且100是每100。 
- 
-您需要将结构添加为特征,以便您的生物群系知道其存在,然后作为生成步骤,以使其实际生成。 
- 
-加载到您的世界中,如果一切顺利,应该会遇到//很多//的雪屋。 
zh_cn/tutorial/structures.1627144024.txt.gz · Last modified: 2021/07/24 16:27 by solidblock