API

Generación de mundo

Menas, árboles, flores, estructuras y biomas que aparecen solos en el mundo. Declaras qué y dónde, y los chunks nuevos lo reciben.

Menas

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]
}
Propiedad Valores Por defecto
block el bloque que se coloca: "mymod:other" el bloque con el nombre de la mena
replaces stone, deepslate, stone_and_deepslate (superficie), netherrack (Nether) o end_stone (End) stone_and_deepslate
size bloques por veta, 1–64 8
per_chunk vetas que se intentan por chunk 8
height [min, max], rango de altura [-64, 64]
biomes solo en estos biomas, por id o por etiqueta todos los biomas donde está su roca

Sin biomes, la mena aparece en todos los biomas de la dimensión a la que pertenece replaces; una mena de end_stone, en todos los biomas del End. El bloque en sí se declara como cualquier otro, con su dureza, herramienta y botín; ver Bloques, ítems y recetas.

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

Árboles

Un árbol es un tronco recto con una bola de hojas. Declara los dos bloques y luego el árbol.

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"]
}
Propiedad Valores Por defecto
trunk el bloque del tronco, del mod o del juego: "ruby_log", "minecraft:oak_log" —
leaves el bloque de las hojas —
height altura del tronco, en bloques 5
height_variation cuánto varía la altura de un árbol a otro 2
leaves_radius radio de la bola de hojas, en bloques 2
per_chunk árboles que se intentan por chunk 1
biomes biomas donde aparece, por id o por etiqueta —

Los biomas se escriben por id (minecraft:plains) o por etiqueta (#minecraft:is_forest), mezclados como quieras. El tronco y las hojas pueden ser bloques del mod o del juego.

Plantas y parches

Una planta es un bloque dibujado como dos imágenes cruzadas, como una flor: nada choca con ella y la luz la atraviesa. Su textura es textures/block/ruby_flower.png, con fondo transparente.

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
}

Un parche reparte plantas por el mundo:

Propiedad Valores Por defecto
block el bloque de la planta —
biomes biomas donde aparece, por id o por etiqueta —
rarity un parche cada tantos chunks 4
size plantas que intenta colocar cada parche 32
spread distancia máxima al centro del parche, en bloques 7

Las plantas solo se colocan en el aire, sobre el suelo de la superficie (hierba, tierra, musgo y barro). Para plantas sobre otro suelo, en paredes o colgando de los techos, escribe una feature: ver Generación por código.

Estructuras

Una estructura es una construcción que haces tú:

  1. Constrúyela en el juego.
  2. Guárdala con un bloque de estructura.
  3. Copia el archivo .nbt a la carpeta structures/ del mod: junto a los scripts en un mod de CraftScript, o en assets/<id del mod>/structures/ en un jar de Kotlin o Java.

Luego decláralo:

content/ruby_shrine.craftCraftScript
structure "ruby_shrine" {
    file: "ruby_shrine"
    biomes: ["#minecraft:is_overworld"]
    spacing: 24
    separation: 8
    buried: false
}
Propiedad Valores Por defecto
file nombre del archivo .nbt, sin extensión la primera variante, o el nombre de la estructura
biomes biomas donde aparece, por id o por etiqueta —
spacing aproximadamente una estructura cada tantos chunks 24
separation nunca más cerca que estos chunks; menor que spacing 8
buried true la hunde en el suelo, para ruinas false
offset_y bloques hacia arriba desde la superficie sobre la que se asienta; un valor negativo la hunde 0
adapt_ground true rellena el suelo bajo ella y lo despeja alrededor; false la coloca tal cual true
heights [min, max]: a una altura al azar dentro de este rango, esté donde esté la superficie, en lugar de sobre la superficie (una casa en el cielo) sobre la superficie

Encuéntrala con /locate structure <id del mod>:ruby_shrine y colócala con /place structure <id del mod>:ruby_shrine.

Variantes, reemplazos y desgaste

Una estructura puede venir de varios archivos, y sus bloques pueden cambiar al colocarla. Así se hacen ruinas que nunca son del todo iguales:

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"] }
}
Propiedad Valores Por defecto
variants archivos de los que es una: nombres, o { file, weight }; se elige una al azar, según el peso solo file, peso 1
skip bloques de sus archivos que no se colocan. "minecraft:air" conserva los bloques del mundo donde el archivo tiene aire —
replace [{ block, with, chance }]: un bloque de sus archivos se convierte en otro con esa probabilidad (más de 0, hasta 1) probabilidad 1
decay { left, blocks }: solo se conserva left (0–1) de blocks (ids o etiquetas); sin blocks, de cualquier bloque se conserva todo

Estructuras de piezas que encajan

Un pueblo o una mazmorra se hace con piezas que encajan: una calle lleva a una casa, un pasillo a una sala. Cada pieza es un archivo con bloques de rompecabezas (jigsaw) del juego, y cada bloque jigsaw nombra el pool del que sale la siguiente pieza, como <id del mod>:<pool>. Declara los pools; la estructura empieza por el primero.

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" }] },
    ]
}
Propiedad Valores Por defecto
pools los pools de piezas; el primero es donde empieza una pieza, de variants o file
depth a cuántas piezas de distancia de la primera llega 1

Cada pool tiene:

Clave Valores Por defecto
name el nombre que usan sus bloques jigsaw, como hamlet/streets —
pieces [{ file, weight, follows_ground }]. follows_ground: true curva la pieza según el suelo que tiene debajo, para calles y caminos; false la mantiene recta, para casas peso 1, false
features [{ id, weight }]: una feature como pieza, tuya o del juego (minecraft:chorus_plant) —
none peso de ninguna pieza, para una parcela vacía 0
fallback el pool que se usa donde no cabe ninguna pieza, como el final de una calle nada
skip, replace como en una estructura simple. En un pool, un reemplazo puede añadir where: solo donde el mundo ya tiene ese bloque (los ladrillos de una calle sobre el agua pasan a ser tablones) —

Todas las piezas quedan a menos de 80 bloques de la primera.

Dos opciones solo están en Kotlin por ahora: salt, un número que elige en qué punto de su tramo de spacing chunks cae la estructura (dos estructuras con el mismo spacing y salt caen en los mismos lugares; sin él, se calcula uno a partir del id de la estructura), y aboveBottom, cuántos bloques por encima del fondo del mundo deben quedar sus piezas (donde una llegaría más abajo, la estructura no se crea).

Las estructuras que tu código construye bloque a bloque están en la página Generación por código.

Biomas

Un bioma propio se queda con una parte de los lugares de un bioma del juego. Conserva lo que crece, vive y se excava allí, y trae su propio clima y colores.

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"
}
Propiedad Valores Por defecto
replaces el bioma del juego de cuyos lugares toma: "minecraft:plains" "minecraft:plains"
share fracción de esos lugares que ocupa, mayor que 0 y hasta 1 0.5
temperature temperatura del clima 0.8
downfall cuánto llueve 0.4
precipitation true si llueve, false si no true
grass_color color de la hierba, #rrggbb los del bioma reemplazado
foliage_color color de las hojas los del bioma reemplazado
sky_color color del cielo los del bioma reemplazado
fog_color color de la niebla los del bioma reemplazado
water_color color del agua #3f76e4
water_fog_color color de la niebla bajo el agua los del bioma reemplazado

share se reparte de forma pareja entre los lugares donde estaría el bioma reemplazado: 0.5 toma la mitad, uno de cada dos. El bioma nuevo hereda lo que crece, vive y se excava allí (vegetación, menas, cuevas, criaturas, música) y lo que otros mods añadan a ese bioma. Los colores que no indiques siguen siendo los del bioma reemplazado.

Varios biomas pueden reemplazar al mismo: se reparten sus lugares. Encuentra el tuyo con /locate biome <id del mod>:ruby_meadow.

Sonido, suelo y criaturas

Un bioma también puede tener su propia música y su propio ambiente, cubrir su suelo con un bloque tuyo y elegir quién vive en él:

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] },
    ]
}
Propiedad Valores Por defecto
music un id de sonido, que suena como la música del bioma la del bioma reemplazado
ambient_sound un sonido que suena sin parar allí (viento, un zumbido) el del bioma reemplazado
particle { id, chance }: una partícula que flota en su aire; chance por cada punto cercano al jugador en cada tick (0.001 son unas pocas) la del bioma reemplazado; chance 0.01
surface el bloque con que se cubre su suelo (el bloque superior de cada suelo) el suelo habitual de la dimensión
spawns [{ creature, weight, group }]: las criaturas que viven allí; si nombra alguna, estas y ninguna más las del bioma reemplazado; weight 10, group [1, 4]
inherits false: solo se genera allí lo que se da a este bioma (sus features, sus carvers, lo que los mods colocan en él), no lo que se genera en el bioma reemplazado true
features [{ id, step }]: features que ya existen, del juego o de datos, colocadas en él. step es lakes, surface, ores, underground o vegetation —
carvers ids de carvers que excavan sus cuevas, tuyos o del juego; se ejecutan en el orden dado, antes que los del bioma reemplazado —

Con inherits: false el bioma sigue tomando los lugares del bioma reemplazado, y sus criaturas y sonidos salvo que des los tuyos; solo deja de venir lo que crece y se excava allí. Un suelo hecho bloque a bloque y carvers propios están en la página Generación por código.

Biomas del End

En el End, un bioma toma regiones enteras, de unos 200 bloques de ancho, en lugar de lugares de clima. Si reemplaza a minecraft:end_highlands, toma toda la tierra de isla de sus regiones (tierras altas, medias y estériles); si reemplaza a minecraft:small_end_islands, el vacío entre las islas. La isla central sigue siendo la del juego, y las regiones son distintas en cada mundo.

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" }]
}

Lo que conviene saber

  • Solo chunks nuevos. Los chunks que ya estaban generados no cambian; solo los generados después de instalar el mod reciben menas, árboles, plantas, estructuras y biomas. Explora terreno nuevo para encontrarlos.
  • Los nombres que faltan se omiten. Un bioma o etiqueta de biomes que no existe (por ejemplo, de otro mod que no está instalado) se omite, no es un error.
  • Sin suelo, sin estructura. Una estructura que se asienta en la superficie no se crea donde su columna no tiene suelo alguno, como el vacío entre las islas del End.
  • Las features, estructuras, terreno, mapas de biomas, carvers y suelos escritos en código están en la página Generación por código.
  • Los mundos enteros propios están en la página Dimensiones.

En 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)
}