본문으로 건너뛰기
버전: Minecraft 26.2

월드 생성

데이터 팩 레지스트리​

모드 jar의 data/에 넣은 레지스트리 데이터는 바닐라 26.2 형식 그대로 동작합니다.

  • 대상 레지스트리는 worldgen/configured_feature, worldgen/placed_feature, dimension, dimension_type, damage_type, enchantment 등입니다.
  • 모드 팩은 알려진 팩(KnownPack, poly:<mod id>)으로 표시되므로, 이 항목들 때문에 월드가 "실험적 설정"으로 분류되지 않습니다.
  • 같은 모드를 가진 클라이언트는 서버에서 받지 않고 자기 jar에서 읽습니다.
  • Minecraft 26.2은 바닐라가 아닌 차원을 모두 실험적으로 판정합니다. Poly 모드 로더는 로드된 모드의 이름공간에 있는 차원만 안정적인 것으로 취급합니다(poly:mod_dimension_stability).
  • 구조물도 데이터 팩으로 정의할 수 있습니다. 코드로 정의하려면 코드 구조물을 참고하세요.

기존 바이옴에 기능 추가​

mod.worldgen().addFeature(BiomeSelector.tag(ResourceId.minecraft("is_overworld")),
GenerationStepName.UNDERGROUND_ORES, ResourceId.of("my_mod", "glow_ore")); // data/의 배치 기능
  • 바이옴은 BiomeSelector.ids(...)(ID 목록) 또는 BiomeSelector.tag(...)(바이옴 태그)로 선택합니다.
  • 생성 단계(GenerationStepName)는 다음과 같습니다. RAW_GENERATION, LAKES, LOCAL_MODIFICATIONS, UNDERGROUND_STRUCTURES, SURFACE_STRUCTURES, STRONGHOLDS, UNDERGROUND_ORES, UNDERGROUND_DECORATION, FLUID_SPRINGS, VEGETAL_DECORATION, TOP_LAYER_MODIFICATION
  • 서버가 월드를 만들 때마다 적용되며, 그 뒤에 생성되는 청크에 반영됩니다.
  • 존재하지 않는 배치 기능을 지정하면 POLY-WORLDGEN-001과 함께 시작이 중단됩니다.

코드 바이옴​

mod.worldgen().biome("glow_meadow", BiomeDefinition.builder()
.climate(0.7f, 0.6f, true) // 기온, 강수량, 강수 여부
.skyColor(0x9ad0ff).grassColor(0x7fd16b)
.feature(GenerationStepName.VEGETAL_DECORATION, ResourceId.minecraft("flower_plains"))
.spawn(MobCategory.CREATURE, ResourceId.minecraft("sheep"), 8, 2, 4)
.build());
  • 색은 skyColor, fogColor, waterColor, grassColor, foliageColor로 지정합니다.
  • Poly 모드 로더는 이 정의를 게임의 바이옴 파일 형식으로 변환해 생성 팩(.poly/generated-pack)에 씁니다.
  • 데이터 팩 바이옴과 똑같이 차원, 바이옴 태그, /locate biome, /fillbiome에서 쓸 수 있습니다.
  • 생성 팩은 알려진 팩이며 버전은 생성된 파일의 내용으로 정해집니다. 그래서 같은 모드를 가진 클라이언트는 서버에서 바이옴을 받지 않습니다.

코드 지형 생성기​

mod.worldgen().chunkGenerator("terraces", (x, z, column) -> { // 열 하나씩 채움
column.fill(column.minY(), 63, ResourceId.minecraft("stone"));
column.set(64, ResourceId.minecraft("grass_block"));
});

TerrainGenerator.fillColumn(x, z, column)은 새 청크의 블록 열을 하나씩 채웁니다. ColumnBuilder는 minY(), maxY(), seed(), set(y, block), fill(fromY, toY, block)을 제공하며, seaLevel()은 재정의할 수 있습니다.

  • 생성기는 <mod>:<path> 형식의 생성기 종류로 등록되며, 데이터 팩 차원에서 biome_source와 함께 사용합니다.
  • 바이옴 기능(광석, 나무), 구조물, 처음 스폰되는 몹은 게임이 다른 생성기와 똑같이 붙여 줍니다.
스레드 안전과 결정성

월드 생성 스레드에서 여러 열이 동시에 호출됩니다. 생성기는 스레드 안전해야 하고, 같은 입력에는 항상 같은 결과를 내야 합니다.

코드 배치 기능​

바위, 식물 무더기, 특수한 모양의 광맥 같은 배치 기능을 코드로 작성할 수 있습니다. Poly 모드 로더는 이것을 게임의 배치 기능 형식 <mod id>:<path>로 등록하고, 생성 팩에는 같은 ID의 configured feature와 placed feature를 만들어 둡니다.

ResourceId boulder = mod.worldgen().feature("boulder", FeaturePlacement.onSurface(1).rarity(4), context -> {
BlockPos origin = context.origin();
int radius = 1 + context.random().nextInt(2);
for (int dx = -radius; dx <= radius; dx++)
for (int dy = -radius; dy <= radius; dy++)
for (int dz = -radius; dz <= radius; dz++)
if (dx * dx + dy * dy + dz * dz <= radius * radius + 1)
context.setBlock(origin.offset(dx, dy, dz), ResourceId.minecraft("mossy_cobblestone"));
return true;
});
mod.worldgen().addFeature(BiomeSelector.ids(ResourceId.minecraft("plains")), GenerationStepName.VEGETAL_DECORATION, boulder);
FeaturePlacement뜻
onSurface(count)청크마다 count번, 지표면에 배치
atHeight(count, minY, maxY)청크마다 count번, minY..maxY 사이의 무작위 높이에 배치
.rarity(n)n개 청크 중 1개에서만 배치
  • FeatureContext로 블록을 읽고 쓸 수 있습니다: origin(), random(), blockAt, isAir, setBlock, surfaceY(x, z), minY, maxY.
  • 월드 생성 스레드에서 여러 청크에 대해 동시에 호출됩니다. 상태는 지역 변수에만 두고, 무작위 값은 random()으로만 얻으세요. 블록은 원점에서 가로 16칸 안에만 쓸 수 있습니다.
  • /place feature <mod id>:<path>로 바로 놓아 볼 수 있습니다.
  • 코드가 예외를 던지면 POLY-WORLDGEN-005를 한 번만 기록하고 그 자리를 건너뜁니다.

노이즈 지형에 코드 단계 넣기​

게임의 노이즈 지형 생성기를 그대로 쓰면서 지형의 모양만 코드로 바꿀 수 있습니다. 동굴, 대수층, 광맥, 지표 규칙, 바이옴은 게임이 계속 처리합니다. 코드로 만든 함수는 게임의 density function 형식 <mod id>:<path>로 등록되며, 데이터 팩의 노이즈 설정에서 사용합니다.

// 64 + 6·sin(x / 6) 아래는 단단한 땅 (양수는 블록, 음수는 공기)
mod.worldgen().densityFunction("waves", -1, 1,
(x, y, z) -> Math.max(-1, Math.min(1, (64 + 6 * Math.sin(x / 6.0) - y) / 4.0)));
data/my_mod/worldgen/noise_settings/waves.json (일부)
"noise_router": {
"final_density": { "type": "my_mod:waves" },
"barrier": 0.0, "continents": 0.0, "depth": 0.0, "erosion": 0.0, "...": 0.0
}

기존 지형에 더하려면 {"type": "minecraft:add", "argument1": <원래 값>, "argument2": {"type": "my_mod:waves"}}처럼 감싸세요. 차원 파일에서는 "generator": {"type": "minecraft:noise", "settings": "my_mod:waves", ...}로 지정합니다.

  • minValue와 maxValue는 함수가 내는 값의 범위입니다. 게임이 이 범위를 보고 계산을 건너뛰므로 정확하게 지정하세요. 범위가 거꾸로면 POLY-WORLDGEN-004 오류가 납니다.
  • 함수는 여러 스레드에서 동시에, 매우 자주 호출됩니다. 빠르게 동작하고, 상태를 두지 않으며, 같은 위치에는 늘 같은 값을 내야 합니다.
  • 게임은 지형을 칸(cell) 단위로 계산합니다. 칸 크기는 가로 size_horizontal × 4블록, 세로 size_vertical × 4블록이며, 칸 안에서는 값을 보간합니다. 그래서 칸보다 작은 모양은 부드러워지고 표면이 한 블록쯤 어긋날 수 있습니다.

코드 구조물​

선택된 청크의 가운데, 지표면에 상자 하나를 놓고 그 안을 코드로 채웁니다. Poly 모드 로더가 구조물과 구조물 세트를 생성 팩에 써 주므로 /locate structure와 /place structure로 찾고 놓을 수 있습니다.

mod.worldgen().structure("shrine", StructureDefinition.builder(7, 4, 7, shrine -> {
shrine.fill(0, 0, 0, 6, 0, 6, ResourceId.minecraft("stone_bricks")); // 바닥
for (int x : new int[] {0, 6})
for (int z : new int[] {0, 6})
shrine.fill(x, 1, z, x, 3, z, ResourceId.minecraft("stone_bricks")); // 기둥
shrine.setBlock(3, 1, 3, GLOW_BLOCK);
})
.biomes(BiomeSelector.tag(ResourceId.minecraft("is_overworld")))
.spacing(40, 12) // 평균 40청크, 최소 12청크 간격
.build());
빌더뜻
builder(sizeX, sizeY, sizeZ, builder)상자 크기(가로와 세로는 최대 128, 높이는 최대 256)와 상자를 채우는 코드
yOffset(n)바닥 높이를 지표면에서 올립니다(음수면 땅속에 묻음)
biomes(selector)구조물이 생기는 바이옴. 기본값은 #minecraft:is_overworld
spacing(spacing, separation)구조물 사이의 평균 거리와 최소 거리(청크 단위). 기본값은 32와 8
step(step)생성 단계. 기본값은 SURFACE_STRUCTURES
adaptTerrain()마을처럼 주변 지형을 평평하게 맞춤
  • 좌표는 상자의 가장 낮은 모서리를 기준으로 합니다. 상자 밖의 좌표는 무시합니다.
  • 한 청크보다 큰 구조물은 청크별로 나누어 지어집니다. 코드는 상자가 걸친 청크마다 한 번씩, 같은 random() 순서로 호출되고 그 청크 안의 블록만 기록됩니다. 따라서 호출될 때마다 같은 구조물을 지어야 합니다. 이 방식은 게임의 구조물 조각과 같습니다.
  • 그 청크 밖의 blockAt은 공기로 읽힙니다.

모드 차원​

data/my_mod/dimension/terraces.json
{
"type": "minecraft:overworld",
"generator": {
"type": "my_mod:terraces",
"biome_source": {"type": "minecraft:fixed", "biome": "my_mod:glow_meadow"}
}
}
world.otherDimension(ResourceId.of("my_mod", "terraces")); // 다른 차원의 WorldView
entity.changeDimension(ResourceId.minecraft("the_nether"), x, y, z); // 차원 이동
게임 테스트 서버의 제약

게임 테스트 서버는 평지 프리셋으로만 차원을 만들기 때문에 데이터 차원이 없습니다. 모드 차원은 일반 월드(싱글 플레이 또는 서버)에서 확인하세요.

오류 코드​

코드뜻
POLY-WORLDGEN-001알 수 없는 배치 기능
POLY-WORLDGEN-002등록이 닫힌 뒤에 선언함
POLY-WORLDGEN-003바이옴 기능 또는 스폰 목록에 접근할 수 없음
POLY-WORLDGEN-004잘못되었거나 중복된 생성기·바이옴·배치 기능·density function·구조물 ID, 또는 density function 범위가 거꾸로
POLY-WORLDGEN-005코드 배치 기능, density function, 구조물이 예외를 던짐(한 번만 기록하고 해당 자리는 건너뜀)
Buy me a coffee