API
Генерація світу
Руди, дерева, квіти, структури й біоми, що з’являються у світі самі. Ти оголошуєш, що й де, а нові чанки це отримують.
Руди
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 — в усіх біомах Енду. Сам блок оголошується як будь-який інший, зі своєю міцністю, інструментом і здобиччю; дивись Блоки, предмети й рецепти.
ore "void_ore" {
replaces: "end_stone"
size: 5
per_chunk: 6
height: [10, 80]
biomes: ["mymod:crystal_glade"]
}Дерева
Дерево — це прямий стовбур із кулею з листя. Оголоси два блоки, потім дерево.
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, з прозорим тлом.
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 |
Рослини ставляться лише в повітрі, на поверхні землі звичайного світу (трава, земля, мох і бруд). Для рослин на іншій землі, на стінах чи тих, що звисають зі стель, напиши фічу: див. Генерація кодом.
Структури
Структура — це споруда, яку ти робиш сам:
- Збудуй її в грі.
- Збережи її блоком структури.
- Скопіюй файл
.nbtу текуstructures/мода: поруч зі скриптами в моді CraftScript або вassets/<id мода>/structures/у jar-файлі на Kotlin чи Java.
Потім оголоси її:
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.
Варіанти, заміни та руйнування
Одна структура може складатися з кількох файлів, а її блоки можуть змінюватися під час встановлення. Так виходять руїни, що ніколи не бувають цілком однаковими:
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 мода>:<пул>. Оголоси пули; структура починається з першого.
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, на скільки блоків вище за низ світу мають лишатися її частини (де якась опустилася б нижче, структура не створюється).
Структури, які твій код будує блок за блоком, описано на сторінці Генерація кодом.
Біоми
Власний біом займає частину місць ігрового біома. Він зберігає те, що там росте, живе й прорито, і приносить свій клімат та свої кольори.
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.
Звук, земля та істоти
Біом може мати й власну музику та повітря, його земля може вкриватися твоїм блоком, і ти можеш обрати, хто там живе:
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 — порожнечу між островами. Центральний острів лишається ігровим, а області в кожному світі різні.
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
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)
}