User Tools

Site Tools


zh_cn:tutorial:features

This is an old revision of the document!


添加地形特征 [1.17]

岩石、树木、矿石、池塘都是地形特征的例子,是对世界的简单补充生成,并根据配置的方式生成。本教程中,我们将研究如何随机生成简单的石头螺旋地形。

往生物群系中添加地形特征需要3个步骤。

注意生物群系修改API标记为实验性。如果API不起作用,考虑使用mixin版本

创建地形特征

一个简单的地形特征如下所示:

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;
  }
}

Feature<DefaultFeatureConfig>构造器采用Codec<DefaultFeatureConfig>。你可以直接在构造器的超级调用中或者实例化特性时为默认的配置特性传入DefaultFeatureConfig.CODEC

区块决定生成地形特征时调用generate。如果地形特征配置为在每个区块生成,则每个区块被生成时都会调用一次。在特征被配置为以每个生物群系特定的概率生成的情况下,generate只会在世界想要生成结构的实例中调用。

在我们的实现中,我们从世界最高位置的方块构建一个简单的15个方块高的岩石螺旋。

地形特征可以像游戏其他内容一样被注册,且你不需要担心没有特定的构建器(builder)和机制(mechanic)。

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);
  }
}

配置地形特征

我们需要为地形特征提供配置。确保注册配置的地形特征和地形特征。

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);
  }
}

Decorator表示世界如何选择放置该特征。要选择正确的Decorator,检查原版的地形特征,你自己的应该要类似。装饰器配置是从这个分支出来的,在CHANCE的情况下,你应该传入ChanceDecoratorConfig的实例。

向生物群落添加Feature

生物群系有一种称为addFeature的方法,用于将Feature添加到生物群落的生成过程中。 您可以在每个生物群落类(例如ForestBiomeSavannaBiome)中查看此方法的更详细用法。

我们可以遍历Registry.BIOME以将我们的Feature添加到每个生物群系中。

Registry.BIOME.forEach(biome -> biome.addFeature(
        GenerationStep.Feature.RAW_GENERATION,
	Biome.configureFeature(
		LAVA_HOLE,
		new DefaultFeatureConfig(),
		Decorator.CHANCE_HEIGHTMAP,
		new ChanceDecoratorConfig(100)
	)
));

addFeature的第一个参数有助于确定何时生成结构。 对于地上的房屋,您可以使用SURFACE_STRUCTURES,对于洞穴,您可以使用 RAW_GENERATION

addFeature的第二个参数是ConfiguredFeature,可以通过Biome.configureFeature创建。 后者接收功能的实例,功能的config类,装饰器和装饰器配置的实例。

装饰器代表世界如何选择放置要素。 CHANCE_HEIGHTMAP可通过查看高度图来工作,而NOISE_HEIGHTMAP_32可使用噪声来工作。 要选择正确的装饰器,请签出与您自己风格相似的香草功能。 装饰器配置将分支此分支; 对于CHANCE_HEIGHTMAP,您将传入''ChanceHeightmapDecorator的实例。

结果

zh_cn/tutorial/features.1626052364.txt.gz · Last modified: 2021/07/12 01:12 by solidblock