zh_cn:tutorial:features
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| zh_cn:tutorial:features [2021/07/12 00:52] – [在您的世界中生成Feature] solidblock | zh_cn:tutorial:features [2022/08/18 03:37] (current) – solidblock | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ===== 添加特征地形 [1.17] ===== | + | FIXME 本页有一段时间没有更新了,可能在未来版本不可用。请参考[[tutorial: |
| - | 岩石,树木,矿石和池塘都是Feature的示例。 它们是对世界的简单补充,它们的生成取决于它们的配置方式。 | + | |
| - | 岩石、树木、矿石、池塘都是特征地形的例子,是对世界的简单补充生成,并根据配置的方式生成。本教程中,我们将研究如何随机生成简单的石头螺旋地形。 | + | ===== 添加地物 [1.17] ===== |
| - | 往生物群系中添加特征地形需要3个步骤。 | + | 岩石、树木、矿石、池塘都是地物的例子,是对世界的简单补充生成,并根据配置的方式生成。本教程中,我们将研究如何随机生成简单的石头螺旋地物。 |
| - | * 创建特征地形 | + | |
| - | * 配置特征地形 | + | |
| - | * 使用[[https:// | + | |
| - | 注意生物群系修改API标记为实验性。如果API不起作用,考虑使用[[? | + | 往生物群系中地物特征需要3个步骤。 |
| + | * 创建地物 | ||
| + | * 配置地物 | ||
| + | * 使用 [[https:// | ||
| - | ==== 创建Feature类 ==== | + | 注意 Biome Modification API 标记为实验性。如果 API 不起作用,考虑使用[[?rev=1599388928|mixin版本]]。 |
| - | 一个简单的Feature如下所示: | + | |
| - | <code java [enable_line_numbers=" | + | |
| - | public class StoneSpiralFeature extends Feature< | + | |
| - | | + | ==== 创建地物 ==== |
| - | super(config); | + | 一个简单的地物如下所示: |
| + | <code java> | ||
| + | public | ||
| + | public StoneSpiralFeature(Codec< | ||
| + | super(configCodec); | ||
| + | } | ||
| + | |||
| + | @Override | ||
| + | public boolean generate(FeatureContext< | ||
| + | BlockPos topPos = context.getWorld().getTopPosition(Heightmap.Type.OCEAN_FLOOR_WG, | ||
| + | Direction offset = Direction.NORTH; | ||
| + | |||
| + | for (int y = 0; y < 15; y++) { | ||
| + | offset = offset.rotateYClockwise(); | ||
| + | context.getWorld().setBlockState(topPos.up(y).offset(offset), | ||
| } | } | ||
| + | |||
| + | return true; | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| - | @Override | ||
| - | public boolean generate(IWorld world, ChunkGenerator<? | ||
| - | BlockPos topPos = world.getTopPosition(Heightmap.Type.WORLD_SURFACE, | ||
| - | Direction offset = Direction.NORTH; | ||
| - | for (int y = 1; y < 16; y++) { | + | 在我们的实现中,我们从世界最高位置的方块构建一个简单的15个方块高的岩石螺旋。 |
| - | offset = offset.rotateYClockwise(); | + | |
| - | world.setBlockState(topPos.up(y).offset(offset), | + | |
| - | } | + | |
| - | return true; | + | '' |
| - | } | + | |
| - | } | + | |
| - | </code> | + | |
| - | 构造函数采用'' | + | 区块决定生成地物时会调用 '' |
| - | 当块决定生成Feature时,将调用``generate``。 如果将功能配置为产生每个块,则也会为正在生成的每个块调用此功能。 在将功能配置为以每个生物群落以一定速率生成的情况下,仅在世界想要生成结构的情况下才调用``generate``。 | + | 我们的地物目前使用 '' |
| - | 在我们的实现中,我们将从世界的最高位置开始构建一个简单的16块高的石头螺旋: | + | <code java> |
| + | public record SpiralFeatureConfig(IntProvider height, BlockStateProvider block) implements FeatureConfig { | ||
| + | public static final Codec< | ||
| + | IntProvider.VALUE_CODEC.fieldOf(" | ||
| + | BlockStateProvider.TYPE_CODEC.fieldOf(" | ||
| + | ).apply(instance, | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | 注意我们为高度使用了 '' | ||
| + | 现在,让我们的地物使用 '' | ||
| <code java> | <code java> | ||
| - | @Override | + | public class SpiralFeature extends Feature< |
| - | public boolean generate(IWorld world, ChunkGenerator<? extends ChunkGeneratorConfig> chunkGenerator, | + | public SpiralFeature(Codec< |
| - | BlockPos | + | super(configCodec); |
| + | } | ||
| + | |||
| + | | ||
| + | public boolean generate(FeatureContext<SpiralFeatureConfig> context) { | ||
| + | BlockPos | ||
| + | SpiralFeatureConfig config = context.getConfig(); | ||
| + | |||
| Direction offset = Direction.NORTH; | Direction offset = Direction.NORTH; | ||
| - | + | int height = config.height().get(context.getRandom()); | |
| - | for (int y = 1; y < 16; y++) { | + | |
| - | offset = offset.rotateYClockwise(); | + | for (int y = 0; y < height; y++) { |
| - | | + | offset = offset.rotateYClockwise(); |
| + | | ||
| + | |||
| + | context.getWorld().setBlockState(blockPos, config.block().getBlockState(context.getRandom(), | ||
| } | } | ||
| + | |||
| return true; | return true; | ||
| + | } | ||
| } | } | ||
| </ | </ | ||
| - | + | 和游戏内的许多其他内容一样,地物也可以注册,并且也没有你需要担心的特别地构建器或机制。 | |
| - | ==== 注册一个Feature ==== | + | |
| - | 可以像注册游戏中的其他大多数内容一样注册Feature,而且您不必担心任何特殊的构建器或机制。 | + | |
| <code java> | <code java> | ||
| - | private static final Feature<DefaultFeatureConfig> LAVA_HOLE | + | public class ExampleMod implements ModInitializer { |
| - | Registry.FEATURE, | + | |
| - | new Identifier(" | + | |
| - | new StoneSpiralFeature(DefaultFeatureConfig:: | + | @Override |
| - | ); | + | public void onInitialize() { |
| + | | ||
| + | } | ||
| + | } | ||
| </ | </ | ||
| - | ==== 向生物群落添加Feature ==== | ||
| - | 生物群系有一种称为'' | ||
| - | 我们可以遍历'' | + | ==== 配置地物 ==== |
| + | 在将地物添加到生物群系之前,我们需要为地物提供配置。确保已配置的地物像地物一样都已经注册。 | ||
| <code java> | <code java> | ||
| - | Registry.BIOME.forEach(biome -> biome.addFeature( | + | public class ExampleMod implements ModInitializer { |
| - | | + | public static final ConfiguredFeature<?, |
| - | Biome.configureFeature( | + | .decorate(Decorator.HEIGHTMAP.configure(new HeightmapDecoratorConfig(Heightmap.Type.OCEAN_FLOOR_WG))) |
| - | LAVA_HOLE, | + | .spreadHorizontally() |
| - | new DefaultFeatureConfig(), | + | |
| - | Decorator.CHANCE_HEIGHTMAP, | + | |
| - | new ChanceDecoratorConfig(100) | + | @Override |
| - | ) | + | public void onInitialize() { |
| - | )); | + | |
| + | |||
| + | RegistryKey< | ||
| + | new Identifier(" | ||
| + | | ||
| + | } | ||
| + | } | ||
| </ | </ | ||
| - | '' | + | 注意,螺旋的高度(15 |
| + | |||
| + | 装饰器(由 | ||
| + | |||
| + | ==== 将地物添加到生物群系 ==== | ||
| + | 我们使用 Biome Modification API。 | ||
| + | |||
| + | <code java> | ||
| + | public class ExampleMod implements ModInitializer { | ||
| + | [...] | ||
| + | |||
| + | @Override | ||
| + | public void onInitialize() { | ||
| + | [...] | ||
| + | BiomeModifications.addFeature(BiomeSelectors.all(), | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| - | '' | + | '' |
| - | 装饰器代表世界如何选择放置要素。 '' | + | 第二个参数帮助你确定结构何时生成。对于地上的房子,可以用 |
| === 结果 === | === 结果 === | ||
| {{https:// | {{https:// | ||
zh_cn/tutorial/features.1626051123.txt.gz · Last modified: 2021/07/12 00:52 by solidblock