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
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.
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.
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.
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ú:
- Constrúyela en el juego.
- Guárdala con un bloque de estructura.
- Copia el archivo
.nbta la carpetastructures/del mod: junto a los scripts en un mod de CraftScript, o enassets/<id del mod>/structures/en un jar de Kotlin o Java.
Luego decláralo:
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:
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.
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.
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:
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.
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
biomesque 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
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)
}