API

월드 생성

광석, 나무, 꽃, 구조물, 바이옴이 월드에 저절로 나타납니다. 무엇을 어디에 둘지 선언하면 새 청크가 이를 받습니다.

광석

content/ruby_ore.craftCraftScript
block "ruby_ore" { hardness: 3, tool: "pickaxe", tier: "iron" }

ore "ruby_ore" {
    replaces: "stone_and_deepslate"
    size: 9
    per_chunk: 8
    height: [-60, 60]
}
속성 값 기본값
block 놓을 블록: "mymod:other" 광석과 이름이 같은 블록
replaces stone, deepslate, stone_and_deepslate(오버월드), netherrack(네더) 또는 end_stone(엔드) stone_and_deepslate
size 광맥 하나당 블록 수, 1–64 8
per_chunk 청크마다 시도하는 광맥 수 8
height [min, max], 높이 범위 [-64, 64]
biomes 이 바이옴에서만, id 또는 태그로 지정 그 암석이 있는 모든 바이옴

biomes가 없으면 광석은 replaces가 속한 차원의 모든 바이옴에 나타나며, end_stone 광석은 엔드의 모든 바이옴에 나타납니다. 블록 자체는 단단함, 도구, 전리품과 함께 다른 블록처럼 선언합니다. 블록, 아이템, 조합법을 참고하세요.

content/void_ore.craftCraftScript
ore "void_ore" {
    replaces: "end_stone"
    size: 5
    per_chunk: 6
    height: [10, 80]
    biomes: ["mymod:crystal_glade"]
}

나무

나무는 곧은 줄기와 잎 덩어리로 이루어집니다. 두 블록을 먼저 선언한 다음 나무를 선언합니다.

content/ruby_tree.craftCraftScript
block "ruby_log" { hardness: 2, tool: "axe", sound: "wood" }
block "ruby_leaves" { hardness: 0.2, transparent: true, sound: "grass" }

tree "ruby_tree" {
    trunk: "ruby_log"
    leaves: "ruby_leaves"
    height: 6
    height_variation: 2
    leaves_radius: 2
    per_chunk: 2
    biomes: ["#minecraft:is_forest", "minecraft:plains"]
}
속성 값 기본값
trunk 줄기 블록(모드 또는 게임의 것): "ruby_log", "minecraft:oak_log" —
leaves 잎 블록 —
height 줄기 높이(블록 수) 5
height_variation 나무마다 높이가 달라지는 정도 2
leaves_radius 잎 덩어리의 반지름(블록 수) 2
per_chunk 청크마다 시도하는 나무 수 1
biomes 나타나는 바이옴(id 또는 태그) —

바이옴은 id(minecraft:plains) 또는 태그(#minecraft:is_forest)로 지정하며 자유롭게 섞을 수 있습니다. 줄기와 잎은 모드의 블록이든 게임의 블록이든 됩니다.

식물과 군락

식물은 꽃처럼 교차한 두 장의 이미지로 그려지는 블록입니다. 아무것도 부딪히지 않고 빛이 통과합니다. 텍스처는 textures/block/ruby_flower.png이며 배경은 투명해야 합니다.

content/ruby_flowers.craftCraftScript
block "ruby_flower" { plant: true, hardness: 0 }

patch "ruby_flowers" {
    block: "ruby_flower"
    biomes: ["#minecraft:is_overworld"]
    rarity: 4
    size: 32
    spread: 7
}

군락은 식물을 월드에 흩뿌립니다.

속성 값 기본값
block 식물 블록 —
biomes 나타나는 바이옴(id 또는 태그) —
rarity 이 청크 수마다 군락 하나 4
size 군락마다 놓으려고 시도하는 식물 수 32
spread 군락 중심에서 가장 먼 거리(블록 수) 7

식물은 오버월드의 땅(잔디, 흙, 이끼, 진흙) 위 공기 중에만 놓입니다. 다른 땅 위, 벽, 천장에 매달리는 식물은 피처를 작성하세요: 코드로 생성하기를 참고하세요.

구조물

구조물은 직접 만드는 건축물입니다.

  1. 게임에서 짓습니다.
  2. 구조 블록으로 저장합니다.
  3. .nbt 파일을 모드의 structures/ 폴더에 복사합니다. CraftScript 모드는 스크립트 옆, Kotlin이나 Java jar는 assets/<모드 id>/structures/입니다.

그런 다음 선언합니다.

content/ruby_shrine.craftCraftScript
structure "ruby_shrine" {
    file: "ruby_shrine"
    biomes: ["#minecraft:is_overworld"]
    spacing: 24
    separation: 8
    buried: false
}
속성 값 기본값
file 확장자를 뺀 .nbt 파일 이름 첫 번째 variant, 또는 구조물의 이름
biomes 나타나는 바이옴(id 또는 태그) —
spacing 이 청크 수마다 구조물 약 하나 24
separation 이 청크 수보다 가까이 생기지 않음(spacing보다 작아야 함) 8
buried true면 땅에 파묻힘(폐허용) false
offset_y 서 있는 지표에서 위로 올라가는 블록 수. 음수이면 가라앉힙니다 0
adapt_ground true이면 아래의 땅을 메우고 주변을 치웁니다. false이면 그대로 놓습니다 true
heights [min, max]: 지표가 있는 곳 어디서든 지표 위가 아니라 이 범위의 임의 높이에 놓습니다(하늘에 뜬 집) 지표 위

/locate structure <모드 id>:ruby_shrine로 찾고 /place structure <모드 id>:ruby_shrine로 배치할 수 있습니다.

변형, 교체, 풍화

하나의 구조물을 여러 파일에서 만들 수 있고, 놓이는 동안 블록이 바뀔 수 있습니다. 매번 조금씩 다른 폐허를 만들 수 있습니다:

content/old_ruins.craftCraftScript
structure "old_ruins" {
    variants: [{ file: "ruins_small", weight: 3 }, "ruins_tower"]
    biomes: ["#minecraft:is_forest"]
    spacing: 20
    separation: 6
    offset_y: -2
    skip: ["minecraft:air"]
    replace: [{ block: "minecraft:stone_bricks", with: "minecraft:cracked_stone_bricks", chance: 0.3 }]
    decay: { left: 0.8, blocks: ["minecraft:stone_bricks", "minecraft:cracked_stone_bricks"] }
}
속성 값 기본값
variants 그중 하나가 되는 파일: 이름, 또는 { file, weight }. 가중치에 따라 하나가 무작위로 뽑힙니다 file만, 가중치 1
skip 파일의 블록 중 놓지 않을 것. "minecraft:air"는 파일이 공기인 곳에서 월드의 블록을 그대로 둡니다 —
replace [{ block, with, chance }]: 파일의 블록이 그 확률(0 초과 1 이하)로 다른 블록이 됩니다 chance 1
decay { left, blocks }: blocks(id 또는 태그) 중 left(0–1) 비율만 남습니다. blocks가 없으면 모든 블록 중에서 전부 남음

이어 붙이는 조각으로 된 구조물

마을이나 던전은 이어 붙는 조각으로 이루어집니다. 길은 집으로, 복도는 방으로 이어집니다. 각 조각은 게임의 직소 블록이 들어 있는 파일이고, 각 직소 블록은 다음 조각을 가져올 풀의 이름을 <모드 id>:<풀> 형태로 적습니다. 풀을 선언하면 구조물은 첫 번째 풀에서 시작합니다.

content/hamlet.craftCraftScript
structure "hamlet" {
    biomes: ["minecraft:plains"]
    spacing: 34
    separation: 8
    depth: 6
    pools: [
        { name: "hamlet/square", pieces: [{ file: "hamlet/square" }] },
        { name: "hamlet/streets", fallback: "hamlet/street_ends",
          pieces: [{ file: "hamlet/street_straight", weight: 3, follows_ground: true },
                   { file: "hamlet/street_corner", follows_ground: true }],
          replace: [{ block: "minecraft:stone_bricks", with: "minecraft:oak_planks", where: "minecraft:water" }] },
        { name: "hamlet/street_ends", pieces: [{ file: "hamlet/street_end", follows_ground: true }] },
        { name: "hamlet/houses", none: 2,
          pieces: [{ file: "hamlet/house_small", weight: 4 }, { file: "hamlet/house_big" }] },
    ]
}
속성 값 기본값
pools 조각의 풀. 첫 번째가 시작하는 곳입니다 variants 또는 file에서 나온 조각 하나
depth 첫 조각에서 조각 몇 개 떨어진 곳까지 닿는지 1

각 풀에는 다음이 있습니다:

키 값 기본값
name 직소 블록이 쓰는 이름, 예: hamlet/streets —
pieces [{ file, weight, follows_ground }]. follows_ground: true이면 조각이 아래의 땅을 따라 휘어지며, 길과 오솔길에 맞습니다. false이면 곧게 유지되며, 집에 맞습니다 가중치 1, false
features [{ id, weight }]: 조각으로서의 피처, 여러분의 것 또는 게임의 것(minecraft:chorus_plant) —
none 조각을 아무것도 놓지 않을 가중치. 빈 터를 위한 것 0
fallback 맞는 조각이 없는 곳(길의 끝 등)에서 쓰는 풀 없음
skip, replace 단일 구조물과 같습니다. 풀에서는 교체에 where를 더할 수 있습니다: 월드에 이미 그 블록이 있는 곳에서만(물 위에 놓인 길의 벽돌이 판자가 됨) —

모든 조각은 첫 조각에서 80블록 이내에 머뭅니다.

지금은 Kotlin에만 있는 옵션이 둘 있습니다. salt는 구조물이 spacing청크 구간 안의 어디에 놓일지를 정하는 숫자입니다(spacing과 salt가 같은 두 구조물은 같은 자리에 놓이며, 없으면 구조물의 id에서 만들어집니다). aboveBottom은 조각이 월드의 바닥에서 몇 블록 위에 머물러야 하는지입니다(그보다 낮게 닿는 곳에서는 구조물이 만들어지지 않습니다).

코드로 블록 하나하나 짓는 구조물은 코드로 생성하기 페이지에 있습니다.

바이옴

나만의 바이옴은 게임 바이옴의 장소 일부를 차지합니다. 그곳에서 자라고, 살고, 파인 것은 그대로 이어받고, 기후와 색은 자기만의 것을 가집니다.

content/ruby_meadow.craftCraftScript
biome "ruby_meadow" {
    replaces: "minecraft:plains"
    share: 0.5
    temperature: 0.8
    downfall: 0.4
    precipitation: true
    grass_color: "#d05070"
    foliage_color: "#c04060"
    sky_color: "#ff9fb0"
    fog_color: "#ffd0d8"
    water_color: "#ff6080"
    water_fog_color: "#a03050"
}
속성 값 기본값
replaces 장소를 가져올 게임 바이옴: "minecraft:plains" "minecraft:plains"
share 그 장소 중 차지하는 비율, 0보다 크고 1까지 0.5
temperature 기후의 온도 0.8
downfall 강수량 0.4
precipitation 비가 오면 true, 안 오면 false true
grass_color 풀 색, #rrggbb 대체되는 바이옴의 값
foliage_color 잎 색 대체되는 바이옴의 값
sky_color 하늘 색 대체되는 바이옴의 값
fog_color 안개 색 대체되는 바이옴의 값
water_color 물 색 #3f76e4
water_fog_color 물속 안개 색 대체되는 바이옴의 값

share는 대체되는 바이옴이 있었을 장소에 고르게 나뉩니다. 0.5는 절반, 즉 둘 중 하나를 차지합니다. 새 바이옴은 그곳에서 자라고, 살고, 파인 것(식생, 광석, 동굴, 생물, 음악)과 다른 모드가 그 바이옴에 추가하는 것을 이어받습니다. 지정하지 않은 색은 대체되는 바이옴의 색 그대로입니다.

여러 바이옴이 같은 바이옴을 대체할 수 있으며, 그 장소를 나눠 가집니다. 내 바이옴은 /locate biome <모드 id>:ruby_meadow로 찾습니다.

소리, 지면, 생물

바이옴은 자신만의 음악과 공기를 가질 수 있고, 지면을 여러분의 블록으로 덮을 수 있으며, 누가 사는지도 고를 수 있습니다:

content/glow_marsh.craftCraftScript
biome "glow_marsh" {
    replaces: "minecraft:swamp"
    share: 0.4
    music: "mymod:music.marsh"
    ambient_sound: "mymod:ambient.marsh_hum"
    particle: { id: "minecraft:glow", chance: 0.005 }
    surface: "mymod:glow_moss"
    spawns: [
        { creature: "minecraft:frog", weight: 10, group: [2, 5] },
        { creature: "mymod:marsh_wisp", weight: 4, group: [1, 2] },
    ]
}
속성 값 기본값
music 바이옴의 음악으로 재생되는 소리 id 대체되는 바이옴의 것
ambient_sound 그곳에서 계속 울리는 소리(바람, 웅웅거림) 대체되는 바이옴의 것
particle { id, chance }: 공기 중에 떠다니는 입자. chance는 매 틱 플레이어 근처의 각 지점마다의 확률(0.001이면 조금) 대체되는 바이옴의 것. chance 0.01
surface 지면을 덮는 블록(각 바닥의 맨 위 블록) 차원의 평소 지면
spawns [{ creature, weight, group }]: 그곳에 사는 몹. 하나라도 지정하면 그것들만 나옵니다 대체되는 바이옴의 것. weight 10, group [1, 4]
inherits false: 이 바이옴에 주어진 것만 그곳에서 생성됩니다(features, carvers, 모드가 그곳에 놓는 것). 대체되는 바이옴에서 생성되는 것은 생성되지 않습니다 true
features [{ id, step }]: 이미 존재하는 피처, 게임의 것이나 데이터의 것을 그곳에 놓습니다. step은 lakes, surface, ores, underground, vegetation 중 하나 —
carvers 그곳의 동굴을 파내는 카버의 id, 여러분의 것이나 게임의 것. 주어진 순서대로, 대체되는 바이옴의 것보다 먼저 실행됩니다 —

inherits: false여도 바이옴은 대체되는 바이옴의 자리를 그대로 가져가며, 직접 지정하지 않으면 몹과 소리도 따라옵니다. 그곳에서 자라고 파이던 것만 따라오지 않게 됩니다. 블록 단위로 만드는 지면과 자신만의 카버는 코드로 생성하기 페이지에 있습니다.

엔드의 바이옴

엔드에서 바이옴은 기후에 따른 자리가 아니라, 너비 약 200블록의 영역 전체를 가져갑니다. minecraft:end_highlands를 대체하면 그 영역의 모든 섬 땅(하이랜드, 미드랜드, 바렌)을 가져가고, minecraft:small_end_islands를 대체하면 섬 사이의 허공을 가져갑니다. 중앙 섬은 게임의 것 그대로이며, 영역은 월드마다 다릅니다.

content/crystal_glade.craftCraftScript
biome "crystal_glade" {
    replaces: "minecraft:end_highlands"
    share: 0.3
    sky_color: "#2a1840"
    fog_color: "#3c2a5a"
    surface: "mymod:crystal_moss"
    inherits: false
    features: [{ id: "minecraft:end_gateway_return", step: "surface" }]
}

알아 두면 좋은 점

  • 새 청크만. 이미 생성된 청크는 바뀌지 않습니다. 모드를 설치한 뒤 생성된 청크에만 광석, 나무, 식물, 구조물, 바이옴이 나타납니다. 새로운 지형을 탐험해 찾아보세요.
  • 없는 이름은 제외됩니다. biomes에 적은 바이옴이나 태그가 존재하지 않으면(예: 설치되지 않은 다른 모드의 것) 오류가 아니라 건너뜁니다.
  • 땅이 없으면 구조물도 없습니다. 지표에 서는 구조물은 그 열에 땅이 전혀 없는 곳, 예를 들어 엔드 섬 사이의 허공에서는 만들어지지 않습니다.
  • 코드로 작성하는 피처, 구조물, 땅, 바이옴 지도, 카버, 지면은 코드로 생성하기 페이지에 있습니다.
  • 나만의 월드 전체는 차원 페이지에 있습니다.

Kotlin에서

content/World.ktKotlin
ore("ruby_ore") {
    replaces = OreHost.STONE_AND_DEEPSLATE
    size = 9
    perChunk = 8
    minY = -60
    maxY = 60
}

ore("void_ore") {
    replaces = OreHost.END_STONE
    biome("mymod:crystal_glade")
}

tree("ruby_tree") {
    trunk = "ruby_log"
    leaves = "ruby_leaves"
    height = 6
    perChunk = 2
    biome("#minecraft:is_forest")
}

block("ruby_flower") { plant = true }

patch("ruby_flowers") {
    block = "ruby_flower"
    rarity = 4
    biome("#minecraft:is_overworld")
}

structure("old_ruins") {
    variant("ruins_small", weight = 3)
    variant("ruins_tower")
    biome("#minecraft:is_forest")
    spacing = 20
    offsetY = -2
    skip("minecraft:air")
    replace("minecraft:stone_bricks", "minecraft:cracked_stone_bricks", chance = 0.3)
    decay(0.8, "minecraft:stone_bricks", "minecraft:cracked_stone_bricks")
    salt = 120457
}

structure("hamlet") {
    biome("minecraft:plains")
    spacing = 34
    depth = 6
    pool("hamlet/square") { piece("hamlet/square") }
    pool("hamlet/streets") {
        piece("hamlet/street_straight", weight = 3, followsGround = true)
        piece("hamlet/street_corner", followsGround = true)
        fallback = "hamlet/street_ends"
        replace("minecraft:stone_bricks", "minecraft:oak_planks", where = "minecraft:water")
    }
    pool("hamlet/street_ends") { piece("hamlet/street_end", followsGround = true) }
    pool("hamlet/houses") {
        piece("hamlet/house_small", weight = 4)
        piece("hamlet/house_big")
        none = 2
    }
}

biome("glow_marsh") {
    replaces = "minecraft:swamp"
    share = 0.4
    music = "mymod:music.marsh"
    ambientSound = "mymod:ambient.marsh_hum"
    particle("minecraft:glow", chance = 0.005)
    surface = "mymod:glow_moss"
    spawn("minecraft:frog", weight = 10, group = 2..5)
}

biome("crystal_glade") {
    replaces = "minecraft:end_highlands"
    share = 0.3
    surface = "mymod:crystal_moss"
    inherits = false
    feature("minecraft:end_gateway_return", FeatureStep.SURFACE)
}