minecraft-world-generation

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Minecraft World Generation Skill

Minecraft世界生成技能

Two Approaches to Custom Worldgen

自定义世界生成的两种方法

ApproachBest WhenPlatform
Datapack JSONOverriding/extending vanilla worldgenVanilla, any server
Mod + DatagenRegistering new biomes/dimensions, code-drivenNeoForge / Fabric
Biome Modifier (NeoForge)Adding features/spawns to existing biomesNeoForge
BiomeModification API (Fabric)Adding features/spawns to existing biomesFabric
方法适用场景支持平台
数据包JSON覆盖/扩展原版世界生成原版、任意服务器
模组 + 数据生成注册新生物群系/维度、代码驱动逻辑NeoForge / Fabric
生物群系修改器(NeoForge)向现有生物群系添加特性/生物生成NeoForge
BiomeModification API(Fabric)向现有生物群系添加特性/生物生成Fabric

Routing Boundaries

适用边界

  • Use when
    : the task is biome/dimension/feature/structure worldgen design or registration.
  • Do not use when
    : the task is general non-worldgen datapack work (recipes, advancements, predicates, function orchestration) (
    minecraft-datapack
    ).
  • Do not use when
    : the task is non-worldgen mod systems (items, entities, GUI, gameplay logic) (
    minecraft-modding
    ).

  • 适用场景
    :任务为生物群系/维度/特性/结构的世界生成设计或注册时使用。
  • 不适用场景
    :任务为非世界生成相关的通用数据包工作(配方、进度、谓词、函数编排)时请勿使用(请使用
    minecraft-datapack
    技能)。
  • 不适用场景
    :任务为非世界生成相关的模组系统(物品、实体、GUI、游戏逻辑)时请勿使用(请使用
    minecraft-modding
    技能)。

Directory Layout (Datapack / Mod Resources)

目录结构(数据包/模组资源)

data/<namespace>/
├── worldgen/
│   ├── biome/
│   │   └── my_biome.json
│   ├── configured_feature/
│   │   └── my_ore.json
│   ├── placed_feature/
│   │   └── my_ore_placed.json
│   ├── noise_settings/
│   │   └── my_dimension_noise.json
│   ├── density_function/
│   │   └── my_density.json    (advanced)
│   ├── structure/
│   │   └── my_structure.json
│   ├── structure_set/
│   │   └── my_structures.json
│   ├── processor_list/
│   │   └── my_processors.json
│   ├── template_pool/
│   │   └── my_pool.json
│   └── carver/
│       └── my_carver.json
├── dimension/
│   └── my_dimension.json
├── dimension_type/
│   └── my_type.json
├── tags/
│   └── worldgen/
│       └── biome/
│           └── is_forest.json
└── neoforge/
    └── biome_modifier/      (NeoForge mod only)
        └── add_ores.json

data/<namespace>/
├── worldgen/
│   ├── biome/
│   │   └── my_biome.json
│   ├── configured_feature/
│   │   └── my_ore.json
│   ├── placed_feature/
│   │   └── my_ore_placed.json
│   ├── noise_settings/
│   │   └── my_dimension_noise.json
│   ├── density_function/
│   │   └── my_density.json    (高级功能)
│   ├── structure/
│   │   └── my_structure.json
│   ├── structure_set/
│   │   └── my_structures.json
│   ├── processor_list/
│   │   └── my_processors.json
│   ├── template_pool/
│   │   └── my_pool.json
│   └── carver/
│       └── my_carver.json
├── dimension/
│   └── my_dimension.json
├── dimension_type/
│   └── my_type.json
├── tags/
│   └── worldgen/
│       └── biome/
│           └── is_forest.json
└── neoforge/
    └── biome_modifier/      (仅NeoForge模组可用)
        └── add_ores.json

Custom Biome JSON

自定义生物群系JSON

data/<namespace>/worldgen/biome/my_biome.json

data/<namespace>/worldgen/biome/my_biome.json

json
{
  "has_precipitation": true,
  "temperature": 0.7,
  "temperature_modifier": "none",
  "downfall": 0.8,
  "effects": {
    "sky_color": 7907327,
    "fog_color": 12638463,
    "water_color": 4159204,
    "water_fog_color": 329011,
    "grass_color_modifier": "none",
    "ambient_sound": "minecraft:ambient.cave",
    "mood_sound": {
      "sound": "minecraft:ambient.cave",
      "tick_delay": 6000,
      "block_search_extent": 8,
      "offset": 2.0
    }
  },
  "spawners": {
    "monster": [
      { "type": "minecraft:zombie", "weight": 95, "minCount": 4, "maxCount": 4 },
      { "type": "minecraft:skeleton", "weight": 100, "minCount": 4, "maxCount": 4 }
    ],
    "creature": [
      { "type": "minecraft:sheep", "weight": 12, "minCount": 4, "maxCount": 4 }
    ],
    "ambient": [],
    "axolotls": [],
    "underground_water_creature": [],
    "water_creature": [],
    "water_ambient": [],
    "misc": []
  },
  "spawn_costs": {},
  "carvers": {
    "air": ["minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon"]
  },
  "features": [
    [],
    [],
    ["minecraft:lake_lava_underground", "minecraft:lake_lava_surface"],
    ["minecraft:amethyst_geode", "minecraft:monster_room"],
    [],
    [],
    [
      "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper",
      "minecraft:ore_coal_upper", "minecraft:ore_coal_lower",
      "<namespace>:my_ore_placed"
    ],
    [],
    ["minecraft:spring_lava"],
    [],
    ["minecraft:freeze_top_layer"]
  ]
}
The
features
array has exactly 11 slots (indices 0–10), one per
GenerationStep.Decoration
:
IndexStepPut here
0
RAW_GENERATION
(rarely used)
1
LAKES
Surface water/lava lakes
2
LOCAL_MODIFICATIONS
Underground lava lakes, geodes
3
UNDERGROUND_STRUCTURES
Amethyst geodes, dungeons
4
SURFACE_STRUCTURES
Glaciers, blue ice patches
5
STRONGHOLDS
(unused in biome JSON)
6
UNDERGROUND_ORES
All ores go here
7
UNDERGROUND_DECORATION
Fossils, infested stone
8
FLUID_SPRINGS
spring_water
,
spring_lava
9
VEGETAL_DECORATION
Trees, grass, flowers
10
TOP_LAYER_MODIFICATION
freeze_top_layer
Custom ores added via placed features must be placed at index 6.

json
{
  "has_precipitation": true,
  "temperature": 0.7,
  "temperature_modifier": "none",
  "downfall": 0.8,
  "effects": {
    "sky_color": 7907327,
    "fog_color": 12638463,
    "water_color": 4159204,
    "water_fog_color": 329011,
    "grass_color_modifier": "none",
    "ambient_sound": "minecraft:ambient.cave",
    "mood_sound": {
      "sound": "minecraft:ambient.cave",
      "tick_delay": 6000,
      "block_search_extent": 8,
      "offset": 2.0
    }
  },
  "spawners": {
    "monster": [
      { "type": "minecraft:zombie", "weight": 95, "minCount": 4, "maxCount": 4 },
      { "type": "minecraft:skeleton", "weight": 100, "minCount": 4, "maxCount": 4 }
    ],
    "creature": [
      { "type": "minecraft:sheep", "weight": 12, "minCount": 4, "maxCount": 4 }
    ],
    "ambient": [],
    "axolotls": [],
    "underground_water_creature": [],
    "water_creature": [],
    "water_ambient": [],
    "misc": []
  },
  "spawn_costs": {},
  "carvers": {
    "air": ["minecraft:cave", "minecraft:cave_extra_underground", "minecraft:canyon"]
  },
  "features": [
    [],
    [],
    ["minecraft:lake_lava_underground", "minecraft:lake_lava_surface"],
    ["minecraft:amethyst_geode", "minecraft:monster_room"],
    [],
    [],
    [
      "minecraft:ore_dirt", "minecraft:ore_gravel", "minecraft:ore_granite_upper",
      "minecraft:ore_coal_upper", "minecraft:ore_coal_lower",
      "<namespace>:my_ore_placed"
    ],
    [],
    ["minecraft:spring_lava"],
    [],
    ["minecraft:freeze_top_layer"]
  ]
}
features
数组恰好有11个插槽(索引0–10),每个对应一个
GenerationStep.Decoration
索引步骤放置内容
0
RAW_GENERATION
(很少使用)
1
LAKES
地表水/熔岩湖
2
LOCAL_MODIFICATIONS
地下熔岩湖、晶洞
3
UNDERGROUND_STRUCTURES
紫水晶晶洞、地牢
4
SURFACE_STRUCTURES
冰川、蓝冰块
5
STRONGHOLDS
(生物群系JSON中未使用)
6
UNDERGROUND_ORES
所有矿石都放在这里
7
UNDERGROUND_DECORATION
化石、被虫蚀的石头
8
FLUID_SPRINGS
spring_water
spring_lava
9
VEGETAL_DECORATION
树木、草、花
10
TOP_LAYER_MODIFICATION
freeze_top_layer
通过已放置特性添加的自定义矿石必须放在索引6的位置。

Configured Feature

已配置特性(Configured Feature)

data/<namespace>/worldgen/configured_feature/my_ore.json

data/<namespace>/worldgen/configured_feature/my_ore.json

json
{
  "type": "minecraft:ore",
  "config": {
    "targets": [
      {
        "target": {
          "predicate_type": "minecraft:tag_match",
          "tag": "minecraft:stone_ore_replaceables"
        },
        "state": {
          "Name": "minecraft:emerald_ore"
        }
      }
    ],
    "size": 4,
    "discard_chance_on_air_exposure": 0.0
  }
}
json
{
  "type": "minecraft:ore",
  "config": {
    "targets": [
      {
        "target": {
          "predicate_type": "minecraft:tag_match",
          "tag": "minecraft:stone_ore_replaceables"
        },
        "state": {
          "Name": "minecraft:emerald_ore"
        }
      }
    ],
    "size": 4,
    "discard_chance_on_air_exposure": 0.0
  }
}

Other feature types

其他特性类型

TypeUse
minecraft:ore
Ore veins
minecraft:tree
Tree placement
minecraft:random_patch
Grass, flowers, mushrooms
minecraft:block_pile
Hay bales, pumpkins
minecraft:lake
Water/lava lakes
minecraft:disk
Sand/gravel/clay disks
minecraft:no_bonemeal_flower
Wither roses, etc.
minecraft:simple_block
Single block placement
minecraft:fill_layer
Fill an entire layer
minecraft:geode
Amethyst geodes
minecraft:decorated
Wraps another feature with placement

类型用途
minecraft:ore
矿脉
minecraft:tree
树木放置
minecraft:random_patch
草、花、蘑菇
minecraft:block_pile
干草捆、南瓜
minecraft:lake
水/熔岩湖
minecraft:disk
沙子/沙砾/黏土盘
minecraft:no_bonemeal_flower
凋零玫瑰等
minecraft:simple_block
单方块放置
minecraft:fill_layer
填充整层
minecraft:geode
紫水晶晶洞
minecraft:decorated
用放置规则包裹另一个特性

Placed Feature

已放置特性(Placed Feature)

data/<namespace>/worldgen/placed_feature/my_ore_placed.json

data/<namespace>/worldgen/placed_feature/my_ore_placed.json

json
{
  "feature": "<namespace>:my_ore",
  "placement": [
    {
      "type": "minecraft:count",
      "count": 8
    },
    {
      "type": "minecraft:in_square"
    },
    {
      "type": "minecraft:height_range",
      "height": {
        "type": "minecraft:trapezoid",
        "min_inclusive": { "above_bottom": 0 },
        "max_inclusive": { "absolute": 64 }
      }
    },
    {
      "type": "minecraft:biome"
    }
  ]
}
json
{
  "feature": "<namespace>:my_ore",
  "placement": [
    {
      "type": "minecraft:count",
      "count": 8
    },
    {
      "type": "minecraft:in_square"
    },
    {
      "type": "minecraft:height_range",
      "height": {
        "type": "minecraft:trapezoid",
        "min_inclusive": { "above_bottom": 0 },
        "max_inclusive": { "absolute": 64 }
      }
    },
    {
      "type": "minecraft:biome"
    }
  ]
}

Common placement modifiers

常用放置修饰符

TypeEffect
minecraft:count
Number of attempts
minecraft:count_on_every_layer
Per layer
minecraft:in_square
Randomize X/Z within chunk
minecraft:biome
Only place if biome has this feature
minecraft:height_range
Y-level range
minecraft:surface_relative_threshold_filter
Filter by surface depth
minecraft:noise_based_count
Count varies with noise
minecraft:rarity_filter
1-in-N chance
minecraft:environment_scan
Scans up/down for a condition

类型效果
minecraft:count
尝试次数
minecraft:count_on_every_layer
每层尝试次数
minecraft:in_square
在区块内随机X/Z坐标
minecraft:biome
仅在生物群系包含该特性时放置
minecraft:height_range
Y轴高度范围
minecraft:surface_relative_threshold_filter
按地表深度过滤
minecraft:noise_based_count
数量随噪声变化
minecraft:rarity_filter
N分之一概率
minecraft:environment_scan
上下扫描满足条件的位置

Dimension Type

维度类型(Dimension Type)

data/<namespace>/dimension_type/my_type.json

data/<namespace>/dimension_type/my_type.json

json
{
  "ultrawarm": false,
  "natural": true,
  "coordinate_scale": 1.0,
  "has_skylight": true,
  "has_ceiling": false,
  "ambient_light": 0.0,
  "fixed_time": false,
  "monster_spawn_light_level": {
    "type": "minecraft:uniform",
    "min_inclusive": 0,
    "max_inclusive": 7
  },
  "monster_spawn_block_light_limit": 0,
  "piglin_safe": false,
  "bed_works": true,
  "respawn_anchor_works": false,
  "has_raids": true,
  "logical_height": 384,
  "height": 384,
  "min_y": -64,
  "infiniburn": "#minecraft:infiniburn_overworld",
  "effects": "minecraft:overworld"
}

json
{
  "ultrawarm": false,
  "natural": true,
  "coordinate_scale": 1.0,
  "has_skylight": true,
  "has_ceiling": false,
  "ambient_light": 0.0,
  "fixed_time": false,
  "monster_spawn_light_level": {
    "type": "minecraft:uniform",
    "min_inclusive": 0,
    "max_inclusive": 7
  },
  "monster_spawn_block_light_limit": 0,
  "piglin_safe": false,
  "bed_works": true,
  "respawn_anchor_works": false,
  "has_raids": true,
  "logical_height": 384,
  "height": 384,
  "min_y": -64,
  "infiniburn": "#minecraft:infiniburn_overworld",
  "effects": "minecraft:overworld"
}

Custom Dimension

自定义维度

data/<namespace>/dimension/my_dimension.json

data/<namespace>/dimension/my_dimension.json

json
{
  "type": "<namespace>:my_type",
  "generator": {
    "type": "minecraft:noise",
    "biome_source": {
      "type": "minecraft:fixed",
      "biome": "<namespace>:my_biome"
    },
    "settings": "minecraft:overworld"
  }
}
json
{
  "type": "<namespace>:my_type",
  "generator": {
    "type": "minecraft:noise",
    "biome_source": {
      "type": "minecraft:fixed",
      "biome": "<namespace>:my_biome"
    },
    "settings": "minecraft:overworld"
  }
}

Multi-biome dimension with
minecraft:multi_noise
source

使用
minecraft:multi_noise
源的多生物群系维度

json
{
  "type": "<namespace>:my_type",
  "generator": {
    "type": "minecraft:noise",
    "biome_source": {
      "type": "minecraft:multi_noise",
      "biomes": [
        {
          "parameters": {
            "temperature": [ -1.0, -0.45 ],
            "humidity":    [ -1.0, -0.35 ],
            "continentalness": [ -1.2, -1.05 ],
            "erosion":     [ -0.78, 0.0 ],
            "weirdness":   [ 0.0, 0.0 ],
            "depth":       [ 0.0, 0.0 ],
            "offset":      0.0
          },
          "biome": "<namespace>:my_biome"
        }
      ]
    },
    "settings": "minecraft:overworld"
  }
}

json
{
  "type": "<namespace>:my_type",
  "generator": {
    "type": "minecraft:noise",
    "biome_source": {
      "type": "minecraft:multi_noise",
      "biomes": [
        {
          "parameters": {
            "temperature": [ -1.0, -0.45 ],
            "humidity":    [ -1.0, -0.35 ],
            "continentalness": [ -1.2, -1.05 ],
            "erosion":     [ -0.78, 0.0 ],
            "weirdness":   [ 0.0, 0.0 ],
            "depth":       [ 0.0, 0.0 ],
            "offset":      0.0
          },
          "biome": "<namespace>:my_biome"
        }
      ]
    },
    "settings": "minecraft:overworld"
  }
}

NeoForge: Biome Modifier

NeoForge:生物群系修改器

Biome Modifiers let you add features, spawns, or carvers to existing biomes without replacing the biome JSON.
生物群系修改器允许你向现有生物群系添加特性、生物生成或雕刻器,无需替换生物群系JSON。

JSON biome modifier (
data/<namespace>/neoforge/biome_modifier/add_ores.json
)

JSON生物群系修改器(
data/<namespace>/neoforge/biome_modifier/add_ores.json

json
{
  "type": "neoforge:add_features",
  "biomes": "#minecraft:is_overworld",
  "features": "<namespace>:my_ore_placed",
  "step": "underground_ores"
}
json
{
  "type": "neoforge:add_features",
  "biomes": "#minecraft:is_overworld",
  "features": "<namespace>:my_ore_placed",
  "step": "underground_ores"
}

Other NeoForge biome modifier types

其他NeoForge生物群系修改器类型

json
{ "type": "neoforge:add_spawns", "biomes": "#minecraft:is_forest",
  "spawners": [{ "type": "minecraft:wolf", "weight": 5, "minCount": 2, "maxCount": 4 }] }

{ "type": "neoforge:remove_features", "biomes": "#minecraft:is_plains",
  "features": "minecraft:ore_coal_upper", "steps": ["underground_ores"] }

{ "type": "neoforge:remove_spawns", "biomes": "#minecraft:is_ocean",
  "entity_types": "#minecraft:skeletons" }

json
{ "type": "neoforge:add_spawns", "biomes": "#minecraft:is_forest",
  "spawners": [{ "type": "minecraft:wolf", "weight": 5, "minCount": 2, "maxCount": 4 }] }

{ "type": "neoforge:remove_features", "biomes": "#minecraft:is_plains",
  "features": "minecraft:ore_coal_upper", "steps": ["underground_ores"] }

{ "type": "neoforge:remove_spawns", "biomes": "#minecraft:is_ocean",
  "entity_types": "#minecraft:skeletons" }

Fabric: BiomeModification API (Code)

Fabric:BiomeModification API(代码)

java
import net.fabricmc.fabric.api.biome.v1.BiomeModifications;
import net.fabricmc.fabric.api.biome.v1.BiomeSelectors;
import net.minecraft.world.level.levelgen.GenerationStep;

public class MyModWorldgen {
    public static void init() {
        // Add a placed feature to all overworld biomes
        BiomeModifications.addFeature(
            BiomeSelectors.foundInOverworld(),
            GenerationStep.Decoration.UNDERGROUND_ORES,
            ResourceKey.create(
                Registries.PLACED_FEATURE,
                ResourceLocation.fromNamespaceAndPath(MyMod.MOD_ID, "my_ore_placed")
            )
        );

        // Add mob spawns
        BiomeModifications.addSpawn(
            BiomeSelectors.tag(BiomeTags.IS_FOREST),
            MobCategory.CREATURE,
            EntityType.WOLF,
            5, 2, 4
        );
    }
}

java
import net.fabricmc.fabric.api.biome.v1.BiomeModifications;
import net.fabricmc.fabric.api.biome.v1.BiomeSelectors;
import net.minecraft.world.level.levelgen.GenerationStep;

public class MyModWorldgen {
    public static void init() {
        // 向所有主世界生物群系添加已放置特性
        BiomeModifications.addFeature(
            BiomeSelectors.foundInOverworld(),
            GenerationStep.Decoration.UNDERGROUND_ORES,
            ResourceKey.create(
                Registries.PLACED_FEATURE,
                ResourceLocation.fromNamespaceAndPath(MyMod.MOD_ID, "my_ore_placed")
            )
        );

        // 添加生物生成规则
        BiomeModifications.addSpawn(
            BiomeSelectors.tag(BiomeTags.IS_FOREST),
            MobCategory.CREATURE,
            EntityType.WOLF,
            5, 2, 4
        );
    }
}

Mod-Registered Worldgen (NeoForge + Fabric via Datagen)

模组注册的世界生成(NeoForge + Fabric 数据生成实现)

Register worldgen keys in code

在代码中注册世界生成键

java
// In a dedicated worldgen registry class
public class ModWorldgen {
    public static final ResourceKey<Biome> MY_BIOME = ResourceKey.create(
        Registries.BIOME,
        ResourceLocation.fromNamespaceAndPath(MyMod.MOD_ID, "my_biome")
    );

    public static final ResourceKey<PlacedFeature> MY_ORE_PLACED = ResourceKey.create(
        Registries.PLACED_FEATURE,
        ResourceLocation.fromNamespaceAndPath(MyMod.MOD_ID, "my_ore_placed")
    );
}
java
// 放在专用的世界生成注册类中
public class ModWorldgen {
    public static final ResourceKey<Biome> MY_BIOME = ResourceKey.create(
        Registries.BIOME,
        ResourceLocation.fromNamespaceAndPath(MyMod.MOD_ID, "my_biome")
    );

    public static final ResourceKey<PlacedFeature> MY_ORE_PLACED = ResourceKey.create(
        Registries.PLACED_FEATURE,
        ResourceLocation.fromNamespaceAndPath(MyMod.MOD_ID, "my_ore_placed")
    );
}

Datagen: NeoForge (
DatapackBuiltinEntriesProvider
)

数据生成:NeoForge(
DatapackBuiltinEntriesProvider

java
public class ModWorldgenProvider extends DatapackBuiltinEntriesProvider {

    private static final RegistrySetBuilder BUILDER = new RegistrySetBuilder()
        .add(Registries.CONFIGURED_FEATURE, ModWorldgenProvider::bootstrapConfigured)
        .add(Registries.PLACED_FEATURE, ModWorldgenProvider::bootstrapPlaced);

    public ModWorldgenProvider(PackOutput output, CompletableFuture<HolderLookup.Provider> registries) {
        super(output, registries, BUILDER, Set.of(MyMod.MOD_ID));
    }

    private static void bootstrapConfigured(BootstrapContext<ConfiguredFeature<?, ?>> ctx) {
        ctx.register(
            ModWorldgen.MY_ORE_CONFIGURED,
            new ConfiguredFeature<>(Feature.ORE, new OreConfiguration(
                OreConfiguration.target(
                    new TagMatchTest(BlockTags.STONE_ORE_REPLACEABLES),
                    ModBlocks.MY_ORE.get().defaultBlockState()
                ),
                9  // vein size
            ))
        );
    }

    private static void bootstrapPlaced(BootstrapContext<PlacedFeature> ctx) {
        HolderGetter<ConfiguredFeature<?, ?>> configured =
            ctx.lookup(Registries.CONFIGURED_FEATURE);
        ctx.register(
            ModWorldgen.MY_ORE_PLACED,
            new PlacedFeature(
                configured.getOrThrow(ModWorldgen.MY_ORE_CONFIGURED),
                List.of(
                    HeightRangePlacement.triangle(
                        VerticalAnchor.absolute(-64),
                        VerticalAnchor.absolute(32)
                    ),
                    CountPlacement.of(8),
                    InSquarePlacement.spread(),
                    BiomeFilter.biome()
                )
            )
        );
    }
}
Register in your
GatherDataEvent
handler:
java
@SubscribeEvent
public static void onGatherData(GatherDataEvent event) {
    DataGenerator gen = event.getGenerator();
    PackOutput output = gen.getPackOutput();
    gen.addProvider(event.includeServer(),
        new ModWorldgenProvider(output, event.getLookupProvider()));
}
java
public class ModWorldgenProvider extends DatapackBuiltinEntriesProvider {

    private static final RegistrySetBuilder BUILDER = new RegistrySetBuilder()
        .add(Registries.CONFIGURED_FEATURE, ModWorldgenProvider::bootstrapConfigured)
        .add(Registries.PLACED_FEATURE, ModWorldgenProvider::bootstrapPlaced);

    public ModWorldgenProvider(PackOutput output, CompletableFuture<HolderLookup.Provider> registries) {
        super(output, registries, BUILDER, Set.of(MyMod.MOD_ID));
    }

    private static void bootstrapConfigured(BootstrapContext<ConfiguredFeature<?, ?>> ctx) {
        ctx.register(
            ModWorldgen.MY_ORE_CONFIGURED,
            new ConfiguredFeature<>(Feature.ORE, new OreConfiguration(
                OreConfiguration.target(
                    new TagMatchTest(BlockTags.STONE_ORE_REPLACEABLES),
                    ModBlocks.MY_ORE.get().defaultBlockState()
                ),
                9  // 矿脉大小
            ))
        );
    }

    private static void bootstrapPlaced(BootstrapContext<PlacedFeature> ctx) {
        HolderGetter<ConfiguredFeature<?, ?>> configured =
            ctx.lookup(Registries.CONFIGURED_FEATURE);
        ctx.register(
            ModWorldgen.MY_ORE_PLACED,
            new PlacedFeature(
                configured.getOrThrow(ModWorldgen.MY_ORE_CONFIGURED),
                List.of(
                    HeightRangePlacement.triangle(
                        VerticalAnchor.absolute(-64),
                        VerticalAnchor.absolute(32)
                    ),
                    CountPlacement.of(8),
                    InSquarePlacement.spread(),
                    BiomeFilter.biome()
                )
            )
        );
    }
}
在你的
GatherDataEvent
处理器中注册:
java
@SubscribeEvent
public static void onGatherData(GatherDataEvent event) {
    DataGenerator gen = event.getGenerator();
    PackOutput output = gen.getPackOutput();
    gen.addProvider(event.includeServer(),
        new ModWorldgenProvider(output, event.getLookupProvider()));
}

Datagen: Fabric (
FabricDynamicRegistryProvider
)

数据生成:Fabric(
FabricDynamicRegistryProvider

java
public class ModWorldgenProvider extends FabricDynamicRegistryProvider {

    public ModWorldgenProvider(FabricDataOutput output, CompletableFuture<HolderLookup.Provider> registries) {
        super(output, registries);
    }

    @Override
    protected void configure(HolderLookup.Provider registries, Entries entries) {
        entries.addAll(registries.lookupOrThrow(Registries.CONFIGURED_FEATURE));
        entries.addAll(registries.lookupOrThrow(Registries.PLACED_FEATURE));
    }

    @Override
    public String getName() {
        return "Worldgen";
    }
}

java
public class ModWorldgenProvider extends FabricDynamicRegistryProvider {

    public ModWorldgenProvider(FabricDataOutput output, CompletableFuture<HolderLookup.Provider> registries) {
        super(output, registries);
    }

    @Override
    protected void configure(HolderLookup.Provider registries, Entries entries) {
        entries.addAll(registries.lookupOrThrow(Registries.CONFIGURED_FEATURE));
        entries.addAll(registries.lookupOrThrow(Registries.PLACED_FEATURE));
    }

    @Override
    public String getName() {
        return "Worldgen";
    }
}

Custom Structure

自定义结构

data/<namespace>/worldgen/structure/my_structure.json

data/<namespace>/worldgen/structure/my_structure.json

json
{
  "type": "minecraft:jigsaw",
  "biomes": "#<namespace>:my_biome_tag",
  "step": "surface_structures",
  "terrain_adaptation": "beard_thin",
  "start_pool": "<namespace>:my_pool/start",
  "size": 6,
  "max_distance_from_center": 80,
  "use_expansion_hack": false,
  "spawn_overrides": {}
}
json
{
  "type": "minecraft:jigsaw",
  "biomes": "#<namespace>:my_biome_tag",
  "step": "surface_structures",
  "terrain_adaptation": "beard_thin",
  "start_pool": "<namespace>:my_pool/start",
  "size": 6,
  "max_distance_from_center": 80,
  "use_expansion_hack": false,
  "spawn_overrides": {}
}

Template pool for jigsaw structures

拼图结构的模板池

json
{
  "fallback": "minecraft:empty",
  "elements": [
    {
      "weight": 1,
      "element": {
        "element_type": "minecraft:single_pool_element",
        "location": "<namespace>:my_structure/start",
        "projection": "rigid",
        "processors": "minecraft:empty"
      }
    }
  ]
}

json
{
  "fallback": "minecraft:empty",
  "elements": [
    {
      "weight": 1,
      "element": {
        "element_type": "minecraft:single_pool_element",
        "location": "<namespace>:my_structure/start",
        "projection": "rigid",
        "processors": "minecraft:empty"
      }
    }
  ]
}

Structure Set

结构集

data/<namespace>/worldgen/structure_set/my_structures.json

data/<namespace>/worldgen/structure_set/my_structures.json

json
{
  "structures": [
    {
      "structure": "<namespace>:my_structure",
      "weight": 1
    }
  ],
  "placement": {
    "type": "minecraft:random_spread",
    "spacing": 32,
    "separation": 8,
    "salt": 12345678
  }
}

json
{
  "structures": [
    {
      "structure": "<namespace>:my_structure",
      "weight": 1
    }
  ],
  "placement": {
    "type": "minecraft:random_spread",
    "spacing": 32,
    "separation": 8,
    "salt": 12345678
  }
}

Testing Worldgen

测试世界生成

bash
undefined
bash
undefined

Create a new world with datapack loaded

加载数据包创建新世界

In-game with a mod:

在装了模组的游戏内执行:

/locate structure <namespace>:my_structure /locate biome <namespace>:my_biome /placefeature <namespace>:my_ore_placed
/locate structure <namespace>:my_structure /locate biome <namespace>:my_biome /placefeature <namespace>:my_ore_placed

Reload worldgen data (does not affect already-generated chunks)

重载世界生成数据(不会影响已经生成的区块)

/reload
/reload

For dimension testing — must use /execute in <namespace>:my_dimension

测试维度时必须使用 /execute in <namespace>:my_dimension

execute in <namespace>:my_dimension run tp @s 0 100 0
undefined
execute in <namespace>:my_dimension run tp @s 0 100 0
undefined

Validator Script

验证脚本

Use the bundled validator before shipping worldgen JSON changes:
bash
undefined
发布世界生成JSON改动前请使用附带的验证工具:
bash
undefined

Run from the installed skill directory:

从已安装的skill目录运行:

./scripts/validate-worldgen-json.sh --root /path/to/datapack-or-mod-resources
./scripts/validate-worldgen-json.sh --root /path/to/datapack-or-mod-resources

Strict mode treats warnings as failures:

严格模式将警告视为失败:

./scripts/validate-worldgen-json.sh --root /path/to/datapack-or-mod-resources --strict

What it checks:
- JSON validity for `worldgen/**` and `neoforge/biome_modifier/**`
- Cross-reference integrity for `placed_feature -> configured_feature`
- Cross-reference integrity for `structure_set -> structure` and biome/biome_modifier feature targets

---
./scripts/validate-worldgen-json.sh --root /path/to/datapack-or-mod-resources --strict

检查内容:
- `worldgen/**` 和 `neoforge/biome_modifier/**` 下的JSON有效性
- `placed_feature -> configured_feature` 的交叉引用完整性
- `structure_set -> structure` 和生物群系/生物群系修改器特性目标的交叉引用完整性

---

References

参考资料