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 або в assets/<id мода>/structures/ у jar-файлі на Kotlin чи Java.

Потім оголоси її:

content/ruby_shrine.craftCraftScript
structure "ruby_shrine" {
    file: "ruby_shrine"
    biomes: ["#minecraft:is_overworld"]
    spacing: 24
    separation: 8
    buried: false
}
Властивість Значення За замовчуванням
file назва файла .nbt без розширення перший варіант або назва структури
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) ймовірність 1
decay { left, blocks }: зберігається лише left (0–1) від blocks (id або теги); без blocks — від будь-яких блоків зберігається все

Структури зі з’єднаних частин

Село чи підземелля складається з частин, що з’єднуються: вулиця веде до будинку, коридор — до кімнати. Кожна частина — це файл з ігровими блоками з’єднання (jigsaw), і кожен такий блок називає пул, з якого береться наступна частина, у вигляді <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)
}