zh_cn:tutorial:structures
Differences
This shows you the differences between two versions of the page.
Next revision | Previous revisionNext revisionBoth sides next revision | ||
zh_cn:tutorial:structures [2020/02/04 10:41] – created lightcolour | zh_cn:tutorial:structures [2021/07/24 16:27] – [创建地物] solidblock | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== | + | ====== |
+ | 现在,往世界中注册并放置一些结构。 | ||
- | ===== 特征 ===== | + | 入药查看原版结构的实例,可以从简单的'' |
- | All code used in this tutorial is available here: [[https:// | + | 对于大多数基本的结构,你需要地物(feature)和生成器(generator)。地物处理注册结构并在生成世界时加载的过程。生成器处理方块的放置,或者在结构文件中加载(如果选择这样做)。 |
- | ==== Introduction ==== | + | 注意本教程依赖标记为实验性的[[https:// |
- | We’re going to look at registering and placing structures in your world. | + | ===== 创建地物 ===== |
+ | 要创建基本的地物(feature),我们推荐创建扩展'' | ||
- | To view examples of 1.14 vanilla structures in action, IglooGenerator & IglooFeature are a good place to start. | + | 你需要覆写'' |
- | You are going to need a Feature and Generator for the most basic structure. The feature handles the process of registering the structure and loading it in when the world is generating-- it answers questions such as ‘should I spawn here?’ and ‘what is my name?’ The generator handles the placement of blocks or loading in a structure file if you choose to do so. | + | <code java> |
+ | public class MyFeature extends StructureFeature< | ||
+ | public MyFeature(Codec< | ||
+ | super(codec); | ||
+ | } | ||
- | ==== Creating a Feature ==== | + | @Override |
+ | public StructureFeature.StructureStartFactory< | ||
+ | return Start:: | ||
+ | } | ||
- | To create a basic feature, we recommend creating a class that extends | + | public static |
+ | public Start(StructureFeature< | ||
+ | long seed) { | ||
+ | super(feature, | ||
+ | } | ||
- | * shouldStartAt: | + | // 世界尝试在新的结构中生成时调用,同时也是地物和结构之间的“空隙(gap)”。 |
- | * getName: name of your structure | + | public |
- | * getRadius: radius of your structure, used for placement | + | |
- | * getSeeedModifier | + | int x = chunkX * 16; |
- | + | int z = chunkZ * 16; | |
- | You can pass DefaultFeatureConfig:: | + | int y = chunkGenerator.getHeight(x, |
- | + | | |
- | For getStructureStartFactory, | + | |
- | + | MyGenerator.addPieces(manager, pos, rotation, this.children); | |
- | <code java [enable_line_numbers=" | + | this.setBoundingBoxFromChildren(); |
- | public static class MyStructureStart extends StructureStart { | + | |
- | public | + | |
- | super(structureFeature_1, | + | |
- | } | + | |
- | @Override | + | |
- | public void initialize(ChunkGenerator<?> | + | |
- | | + | |
- | | + | |
- | int z = chunkZ * 16; | + | |
- | BlockPos | + | |
- | | + | |
- | MyGenerator.addParts(structureManager, startingPos, rotation, this.children, this.random, | + | |
- | this.setBoundingBoxFromChildren(); | + | |
} | } | ||
+ | } | ||
} | } | ||
</ | </ | ||
- | | ||
- | This is called when the world attempts to spawn in a new structure, and is the gap between your Feature and Generator. The reference to the variable in your main class doesn' | ||
- | This is where structure files and generating straight from a generate method part ways. There are two ways to go about this: | + | ==== 创建一个生成器 ==== |
- | * If you want, you can simply override generate in your Feature class and use setBlockState to place blocks directly in the world. This is a valid option and was popular pre-1.13. | + | 您可能已经注意到,我们需要创建一个生成器。 我们将其命名为MyGenerator,并在StructureStart类的initialize方法中对其进行引用。 它不需要覆盖任何内容,但需要满足以下条件: |
- | * Use structure files and a Generator. These are rather powerful at this point and are highly recommended. | + | |
- | ==== Creating a Generator ==== | + | *指向您的结构文件的标识符; 如果需要示例,请使用'' |
- | + | | |
- | As you have probably noticed, we need to create a generator. We'll name it MyGenerator, | + | |
- | + | ||
- | * An Identifier that points to your structure file; use "igloo/top" if you need an example. | + | |
- | * Some sort of setup method | + | |
<code java> | <code java> | ||
Line 64: | Line 58: | ||
} | } | ||
</ | </ | ||
- | | + | |
- | In your addParts | + | 在addParts方法中,您可以选择将哪些结构件添加到生成过程中。 您可以添加如下内容: |
<code java> | <code java> | ||
list_1.add(new MyGenerator.Piece(structureManager_1, | list_1.add(new MyGenerator.Piece(structureManager_1, | ||
</ | </ | ||
- | | ||
- | where the identifier is the path we created recently. | ||
- | We're now going to create the Piece we just referenced; make a class called Piece that extends SimpleStructurePiece //within your generator class//. | + | 标识符是我们最近创建的路径。 |
- | Override required methods, and add a constructor that takes in a StructureManager, | + | 现在,我们将创建我们刚刚引用的作品; 创建一个名为Piece的类,该类扩展了SimpleStructurePiece// |
+ | 覆盖必需的方法,并添加一个接受StructureManager,Identifier,BlockPos和Rotation的构造函数。 ** toNbt不是必需的,但在需要时可用**。 我们还将使用不同的参数实现自己的setStructureData,因此它不是替代。 我们还有2个构造函数:1个构造函数,一个构造函数。 一个基本的模板是: | ||
<code java [enable_line_numbers=" | <code java [enable_line_numbers=" | ||
public static class Piece extends SimpleStructurePiece { | public static class Piece extends SimpleStructurePiece { | ||
Line 124: | Line 117: | ||
</ | </ | ||
| | ||
- | handleMetadata | + | handleMetadata是查看结构中的数据块并根据发现的内容执行任务的地方。 在原版结构中,数据块放置在箱子上方,因此可以用这种方法将它们填满战利品。 |
- | We set the StructurePieceType | + | 我们将StructurePieceType设置为MyModClass.myStructurePiece类型; 这是保存您注册的结构件的变量。 在完成generate函数之后,我们将对其进行处理,该函数将设置结构的位置并生成它: |
<code java [enable_line_numbers=" | <code java [enable_line_numbers=" | ||
Line 137: | Line 130: | ||
</ | </ | ||
| | ||
- | In this case, we simply get the y position of the highest block in the middle of our chunk and generate the structure off that position. | + | 在这种情况下,我们仅获取块中间最高块的y位置,并从该位置生成结构。 |
- | ==== Registering Features | + | ==== 注册功能 |
- | The last step is to register our features. We're going to need to register: | + | 最后一步是注册我们的功能。 我们需要注册: |
* StructurePieceType | * StructurePieceType | ||
Line 147: | Line 140: | ||
* StructureFeature<?> | * StructureFeature<?> | ||
- | We're also going to need to add the structure to the STRUCTURES list and add it to each biome as a feature and generation step. | + | 我们还需要将结构添加到“结构”列表中,并将其添加到每个生物群系中,作为功能部件和生成步骤。 |
- | Registering piece type: | + | 注册件类型: |
<code java> | <code java> | ||
public static final StructurePieceType myStructurePieceType = Registry.register(Registry.STRUCTURE_PIECE, | public static final StructurePieceType myStructurePieceType = Registry.register(Registry.STRUCTURE_PIECE, | ||
</ | </ | ||
| | ||
- | Registering feature: | + | 注册功能: |
<code java> | <code java> | ||
public static final StructureFeature< | public static final StructureFeature< | ||
</ | </ | ||
| | ||
- | Registering structure: | + | 注册结构: |
<code java> | <code java> | ||
public static final StructureFeature<?> | public static final StructureFeature<?> | ||
</ | </ | ||
| | ||
- | To put your feature in the features list, you can use: | + | 要将功能放入功能列表,可以使用: |
<code java> | <code java> | ||
Feature.STRUCTURES.put(" | Feature.STRUCTURES.put(" | ||
</ | </ | ||
| | ||
- | For testing, it's a good idea to register your feature to every biome and set the spawn rate to 100% so you can be sure it's spawning and working. You probably don't want your structure floating in the water, so we'll also filter that out. Add it to every biome by iterating over the biome list and adding it as a feature and generation step: | + | 对于测试,将功能注册到每个生物群系并将生成率设置为100%是个好主意,这样您就可以确保其生成并正常工作。 您可能不希望您的结构漂浮在水中,因此我们也将其过滤掉。 通过遍历生物群系列表并将其添加为特征和生成步骤,将其添加到每个生物群系: |
<code java [enable_line_numbers=" | <code java [enable_line_numbers=" | ||
Line 180: | Line 173: | ||
</ | </ | ||
- | ChanceDecoratorConfig's argument is basically how many chunks it will skip over before generating. | + | ChanceDecoratorConfig的参数基本上是在生成之前将跳过多少个块。 |
- | You need to add your structure as a feature so your biome knows it exists, and then as a generation step so it's actually generated. | + | 您需要将结构添加为特征,以便您的生物群系知道其存在,然后作为生成步骤,以使其实际生成。 |
- | Load into your world, and if all went well, you should be met with a //lot// of Igloos. | + | 加载到您的世界中,如果一切顺利,应该会遇到//很多//的雪屋。 |