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 revisionBoth sides next revision
zh_cn:tutorial:structures [2021/07/24 16:23] solidblockzh_cn:tutorial:structures [2021/07/24 16:27] – [创建特征] solidblock
Line 8: Line 8:
 注意本教程依赖标记为实验性的[[https://github.com/FabricMC/fabric/pull/1097|Fabric API中的生物群系修改API]]。如果API不起作用,考虑使用[[?rev=1599808070|mixin版本]]。 注意本教程依赖标记为实验性的[[https://github.com/FabricMC/fabric/pull/1097|Fabric API中的生物群系修改API]]。如果API不起作用,考虑使用[[?rev=1599808070|mixin版本]]。
  
-==== 创建特征 ====+===== 创建地物 ====
 +要创建基本的结构,我们推荐创建扩展''StructureFeature<DefaultFeatureConfig>''的类。大多数原版结构,如沉船、雪屋、神殿都是以''StructureFeature<DefaultFeatureConfig>''为基础,
  
-创建基本功能我们建议创建一个扩展AbstractTempleFeature <DefaultFeatureConfig>的类。 海难,雪屋和神殿等各种原版结构都使用AbstractTempleFeature作为基础。 您将必须重写以下方法:+你需覆写''getStructureStartFactory''方法。对于''getStructureStartFactory''大多数原版的结构在其地物类中创建扩展''StructureStart''的类。
  
-   * shouldStartAt:出于测试目的,返回true。 +<code java> 
-   * getName:您的结构的名称 +public class MyFeature extends StructureFeature<DefaultFeatureConfig> { 
-   * getRadius:结构的半径,用于放置 +  public MyFeature(Codec<DefaultFeatureConfig> codec) { 
-   * getSeeedModifier+    super(codec); 
 +  }
  
-您可以将DefaultFeatureConfig :: deserialize传递给构造函数进行测试。+  @Override 
 +  public StructureFeature.StructureStartFactory<DefaultFeatureConfig> getStructureStartFactory() { 
 +    return Start::new; 
 +  }
  
-对于getStructureStartFactory,大多数原始结构会创建一个在其Feature类中扩展StructureStart的类:+  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); 
 +    }
  
-<code java [enable_line_numbers="true"]> +    // 世界尝试在新的结构中生成时调用,同时也是地物和结构之间的“空隙(gap)”。 
-public static class MyStructureStart extends StructureStart { +    public void init(DynamicRegistryManager registryManager, ChunkGenerator chunkGenerator, StructureManager manager, int chunkX, 
-    public MyStructureStart (StructureFeature<?> structureFeature_1int int_1, int int_2, Biome biome_1, MutableIntBoundingBox mutableIntBoundingBox_1, int int_3, long long_1) { +        int chunkZ, Biome biome, DefaultFeatureConfig config) { 
-        super(structureFeature_1, int_1, int_2, biome_1, mutableIntBoundingBox_1, int_3, long_1); +      int x = chunkX * 16; 
-    } +      int z = chunkZ * 16; 
-    @Override +      int y = chunkGenerator.getHeight(x, z, Heightmap.Type.WORLD_SURFACE_WG); 
-    public void initialize(ChunkGenerator<?> chunkGenerator, StructureManager structureManager, int chunkX, int chunkZ, Biome biome) { +      BlockPos pos = new BlockPos(x, y, z); 
-        DefaultFeatureConfig defaultFeatureConfig = chunkGenerator.getStructureConfig(biome, MyMainclass.myFeature); +      BlockRotation rotation = BlockRotation.random(this.random); 
-        int x = chunkX * 16; +      MyGenerator.addPieces(managerpos, rotation, this.children); 
-        int z = chunkZ * 16; +      this.setBoundingBoxFromChildren();
-        BlockPos startingPos = new BlockPos(x, 0, z); +
-        Rotation rotation = Rotation.values()[this.random.nextInt(Rotation.values().length)]+
-        MyGenerator.addParts(structureManagerstartingPos, rotation, this.children, this.random, defaultFeatureConfig); +
-        this.setBoundingBoxFromChildren();+
     }     }
 +  }
 } }
 </code> </code>
-     
-当世界尝试以新结构生成时,这称为“要素”和“生成器”之间的差距。 在您的主类中对该变量的引用尚不存在,但我们将在最后创建它。 您也可以将配置设置为等于新的DefaultFeatureConfig。 您可以在getStructureStartFactory中使用返回MyStructureStart :: new返回此函数。 
-这是结构文件和直接从generate方法生成的部分方式。 有两种解决方法: 
- 
-   *如果需要,您可以简单地在Feature类中重写generate,并使用setBlockState将块直接放置在世界上。 这是一个有效的选项,在1.13之前很流行。 
-   *使用结构文件和生成器。 在这一点上,这些功能非常强大,因此强烈建议使用。 
  
 ==== 创建一个生成器 ==== ==== 创建一个生成器 ====