zh_cn:tutorial:features
Differences
This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
zh_cn:tutorial:features [2020/01/08 12:18] – created lightcolour | zh_cn:tutorial:features [2022/08/18 03:37] (current) – solidblock | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ===== 在您的世界中生成Feature ===== | + | FIXME 本页有一段时间没有更新了,可能在未来版本不可用。请参考[[tutorial: |
- | 岩石,树木,矿石和池塘都是Feature的示例。 它们是对世界的简单补充,它们的生成取决于它们的配置方式。 | + | |
- | ==== 创建Feature类 ==== | + | |
- | 一个简单的Feature如下所示: | + | |
- | <code java [enable_line_numbers=" | + | |
- | public class StoneSpiralFeature extends Feature< | + | |
- | public StoneSpiralFeature(Function< | + | ===== 添加地物 [1.17] ===== |
- | super(config); | + | |
- | } | + | |
- | @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++) { | + | 往生物群系中地物特征需要3个步骤。 |
- | | + | * 创建地物 |
- | world.setBlockState(topPos.up(y).offset(offset), | + | * 配置地物 |
- | } | + | * 使用 [[https:// |
- | return true; | + | 注意 Biome Modification API 标记为实验性。如果 API 不起作用,考虑使用[[? |
+ | |||
+ | ==== 创建地物 ==== | ||
+ | 一个简单的地物如下所示: | ||
+ | <code java> | ||
+ | public class StoneSpiralFeature extends Feature< | ||
+ | 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; | ||
+ | } | ||
} | } | ||
</ | </ | ||
- | 构造函数采用'' | ||
- | 当块决定生成Feature时,将调用``generate``。 如果将功能配置为产生每个块,则也会为正在生成的每个块调用此功能。 在将功能配置为以每个生物群落以一定速率生成的情况下,仅在世界想要生成结构的情况下才调用``generate``。 | + | 在我们的实现中,我们从世界最高位置的方块构建一个简单的15个方块高的岩石螺旋。 |
- | 在我们的实现中,我们将从世界的最高位置开始构建一个简单的16块高的石头螺旋: | + | '' |
+ | |||
+ | 区块决定生成地物时会调用 '' | ||
+ | |||
+ | 我们的地物目前使用 '' | ||
<code java> | <code java> | ||
- | @Override | + | public |
- | public | + | |
- | | + | IntProvider.VALUE_CODEC.fieldOf(" |
- | | + | |
+ | ).apply(instance, | ||
+ | } | ||
+ | </ | ||
- | for (int y = 1; y < 16; y++) { | + | 注意我们为高度使用了 '' |
- | offset = offset.rotateYClockwise(); | + | |
- | world.setBlockState(topPos.up(y).offset(offset), | + | |
- | } | + | |
+ | 现在,让我们的地物使用 '' | ||
+ | <code java> | ||
+ | public class SpiralFeature extends Feature< | ||
+ | public SpiralFeature(Codec< | ||
+ | super(configCodec); | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public boolean generate(FeatureContext< | ||
+ | BlockPos pos = context.getOrigin(); | ||
+ | SpiralFeatureConfig config = context.getConfig(); | ||
+ | |||
+ | Direction offset = Direction.NORTH; | ||
+ | int height = config.height().get(context.getRandom()); | ||
+ | |||
+ | for (int y = 0; y < height; y++) { | ||
+ | offset = offset.rotateYClockwise(); | ||
+ | BlockPos blockPos = pos.up(y).offset(offset); | ||
+ | |||
+ | context.getWorld().setBlockState(blockPos, | ||
+ | } | ||
+ | |||
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.txt · Last modified: 2022/08/18 03:37 by solidblock