User Tools

Site Tools


zh_cn:tutorial:features
no way to compare when less than two revisions

Differences

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


Previous revision
Last revision
zh_cn:tutorial:features [2021/07/12 01:17] – [向生物群落添加Feature] solidblock
Line 1: Line 1:
 +===== 添加地形特征 [1.17] =====
  
 +岩石、树木、矿石、池塘都是地形特征的例子,是对世界的简单补充生成,并根据配置的方式生成。本教程中,我们将研究如何随机生成简单的石头螺旋地形。
 +
 +往生物群系中添加地形特征需要3个步骤。
 +  * 创建地形特征
 +  * 配置地形特征
 +  * 使用[[https://github.com/FabricMC/fabric/pull/1097|Fabric API中的生物群系修改API]]以往生物群系中添加地形特征。
 +
 +注意生物群系修改API标记为实验性。如果API不起作用,考虑使用[[?rev=1599388928|mixin版本]]。
 +
 +==== 创建地形特征 ====
 +一个简单的地形特征如下所示:
 +<code java>
 +public class StoneSpiralFeature extends Feature<DefaultFeatureConfig> {
 +  public StoneSpiralFeature(Codec<DefaultFeatureConfig> config) {
 +    super(config);
 +  }
 +
 +  @Override
 +  public boolean generate(StructureWorldAccess world, ChunkGenerator generator, Random random, BlockPos pos,
 +      DefaultFeatureConfig config) {
 +    BlockPos topPos = world.getTopPosition(Heightmap.Type.WORLD_SURFACE, pos);
 +    Direction offset = Direction.NORTH;
 +
 +    for (int y = 1; y <= 15; y++) {
 +      offset = offset.rotateYClockwise();
 +      world.setBlockState(topPos.up(y).offset(offset), Blocks.STONE.getDefaultState(), 3);
 +    }
 +
 +    return true;
 +  }
 +}
 +</code>
 +
 +''Feature<DefaultFeatureConfig>''构造器采用''Codec<DefaultFeatureConfig>''。你可以直接在构造器的超级调用中或者实例化特性时为默认的配置特性传入''DefaultFeatureConfig.CODEC''
 +
 +区块决定生成地形特征时调用''generate''。如果地形特征配置为在每个区块生成,则每个区块被生成时都会调用一次。在特征被配置为以每个生物群系特定的概率生成的情况下,''generate''只会在世界想要生成结构的实例中调用。
 +
 +在我们的实现中,我们从世界最高位置的方块构建一个简单的15个方块高的岩石螺旋。
 +
 +地形特征可以像游戏其他内容一样被注册,且你不需要担心没有特定的构建器(builder)和机制(mechanic)。
 +
 +<code java>
 +public class ExampleMod implements ModInitializer {
 +  private static final Feature<DefaultFeatureConfig> STONE_SPIRAL = new StoneSpiralFeature(DefaultFeatureConfig.CODEC);
 +
 +  @Override
 +  public void onInitialize() {
 +    Registry.register(Registry.FEATURE, new Identifier("tutorial", "stone_spiral"), STONE_SPIRAL);
 +  }
 +}
 +</code>
 +
 +==== 配置地形特征 ====
 +我们需要为地形特征提供配置。确保注册配置的地形特征和地形特征。
 +
 +<code java>
 +public class ExampleMod implements ModInitializer {
 +  public static final ConfiguredFeature<?, ?> STONE_SPIRAL_CONFIGURED = STONE_SPIRAL.configure(FeatureConfig.DEFAULT)
 +      .decorate(Decorator.CHANCE.configure(new ChanceDecoratorConfig(5)));
 +
 +  @Override
 +  public void onInitialize() {
 +    [...]
 +    
 +    RegistryKey<ConfiguredFeature<?, ?>> stoneSpiral = RegistryKey.of(Registry.CONFIGURED_FEATURE_KEY,
 +        new Identifier("tutorial", "stone_spiral"));
 +    Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, stoneSpiral.getValue(), STONE_SPIRAL_CONFIGURED);
 +  }
 +}
 +</code>
 +
 +Decorator表示世界如何选择放置该特征。要选择正确的Decorator,检查原版的地形特征,你自己的应该要类似。装饰器配置是从这个分支出来的,在''CHANCE''的情况下,你应该传入''ChanceDecoratorConfig''的实例。 
 +
 +==== 向生物群系添加特征地形 ====
 +我们使用生物群系修改API。
 +
 +<code java>
 +public class ExampleMod implements ModInitializer {
 +  [...]
 +
 +  @Override
 +  public void onInitialize() {
 +    [...]
 +    BiomeModifications.addFeature(BiomeSelectors.all(), GenerationStep.Feature.UNDERGROUND_ORES, stoneSpiral);
 +  }
 +}
 +</code>
 +
 +''addFeature''的第一个参数确定结构生成在什么生物群系中。
 +
 +第二个参数帮助你确定结构何时生成。对于地上的房子,可以用''SURFACE_STRUCTURES'',对于洞穴,可以用''RAW_GENERATION''
 +
 +=== 结果 ===
 +{{https://i.imgur.com/Kr59o0B.png}}
zh_cn/tutorial/features.txt · Last modified: 2022/08/18 03:37 by solidblock