API
Génération du monde
Des minerais, des arbres, des fleurs et des structures qui apparaissent d’eux-mêmes dans le monde. Tu déclares quoi et où, et les nouveaux chunks les reçoivent.
Minerais
block "ruby_ore" { hardness: 3, tool: "pickaxe", tier: "iron" }
ore "ruby_ore" {
replaces: "stone_and_deepslate"
size: 9
per_chunk: 8
height: [-60, 60]
}| Propriété | Valeurs | Par défaut |
|---|---|---|
block |
le bloc à placer : "mymod:other" |
le bloc qui porte le nom du minerai |
replaces |
stone, deepslate, stone_and_deepslate (Surface), netherrack (Nether) ou end_stone (End) |
stone_and_deepslate |
size |
blocs par filon, 1–64 | 8 |
per_chunk |
filons tentés par chunk | 8 |
height |
[min, max], plage de hauteur |
[-64, 64] |
biomes |
seulement dans ces biomes, par id ou par tag | tous les biomes où se trouve sa roche |
Sans biomes, le minerai apparaît dans tous les biomes de la dimension à laquelle appartient replaces ; un minerai end_stone, dans tous les biomes de l’End. Le bloc lui-même se déclare comme n’importe quel autre, avec sa dureté, son outil et son butin ; voir Blocs, objets et recettes.
ore "void_ore" {
replaces: "end_stone"
size: 5
per_chunk: 6
height: [10, 80]
biomes: ["mymod:crystal_glade"]
}Arbres
Un arbre est un tronc droit surmonté d’une boule de feuilles. Déclare les deux blocs, puis l’arbre.
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"]
}| Propriété | Valeurs | Par défaut |
|---|---|---|
trunk |
le bloc du tronc, du mod ou du jeu : "ruby_log", "minecraft:oak_log" |
— |
leaves |
le bloc des feuilles | — |
height |
hauteur du tronc, en blocs | 5 |
height_variation |
de combien la hauteur varie d’un arbre à l’autre | 2 |
leaves_radius |
rayon de la boule de feuilles, en blocs | 2 |
per_chunk |
arbres tentés par chunk | 1 |
biomes |
biomes où il apparaît, par id ou par tag | — |
Les biomes s’écrivent par id (minecraft:plains) ou par tag (#minecraft:is_forest), mélangés à volonté. Le tronc et les feuilles peuvent être des blocs du mod ou du jeu.
Plantes et parterres
Une plante est un bloc dessiné comme deux images croisées, comme une fleur : rien n’entre en collision avec elle et la lumière la traverse. Sa texture est textures/block/ruby_flower.png, avec un fond transparent.
block "ruby_flower" { plant: true, hardness: 0 }
patch "ruby_flowers" {
block: "ruby_flower"
biomes: ["#minecraft:is_overworld"]
rarity: 4
size: 32
spread: 7
}Un parterre sème des plantes dans le monde :
| Propriété | Valeurs | Par défaut |
|---|---|---|
block |
le bloc de la plante | — |
biomes |
biomes où il apparaît, par id ou par tag | — |
rarity |
un parterre tous les tant de chunks | 4 |
size |
plantes que chaque parterre essaie de poser | 32 |
spread |
distance maximale au centre du parterre, en blocs | 7 |
Les plantes ne se posent que dans l’air, sur le sol de la surface (herbe, terre, mousse et boue). Pour des plantes sur un autre sol, sur des murs ou suspendues aux plafonds, écris une feature : voir Génération par code.
Structures
Une structure est une construction que tu fais toi-même :
- Construis-la dans le jeu.
- Enregistre-la avec un bloc de structure.
- Copie le fichier
.nbtdans le dossierstructures/du mod : à côté des scripts pour un mod CraftScript, ou dansassets/<id du mod>/structures/pour un jar Kotlin ou Java.
Déclare-la ensuite :
structure "ruby_shrine" {
file: "ruby_shrine"
biomes: ["#minecraft:is_overworld"]
spacing: 24
separation: 8
buried: false
}| Propriété | Valeurs | Par défaut |
|---|---|---|
file |
nom du fichier .nbt, sans extension | la première variante, ou le nom de la structure |
biomes |
biomes où il apparaît, par id ou par tag | — |
spacing |
environ une structure tous les tant de chunks | 24 |
separation |
jamais plus proche que ce nombre de chunks ; inférieur à spacing | 8 |
buried |
true l’enfonce dans le sol, pour des ruines | false |
offset_y |
blocs au-dessus de la surface où elle se tient ; une valeur négative l’enfonce | 0 |
adapt_ground |
true remplit le sol dessous et le dégage autour ; false la pose telle quelle | true |
heights |
[min, max] : à une hauteur aléatoire dans cette plage, où que soit la surface, au lieu de sur la surface (une maison dans le ciel) |
sur la surface |
Trouve-la avec /locate structure <id du mod>:ruby_shrine et place-la avec /place structure <id du mod>:ruby_shrine.
Variantes, remplacements et érosion
Une même structure peut venir de plusieurs fichiers, et ses blocs peuvent changer au moment où elle est posée. Cela donne des ruines jamais tout à fait identiques :
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"] }
}| Propriété | Valeurs | Par défaut |
|---|---|---|
variants |
les fichiers dont elle est l’un : des noms, ou { file, weight } ; l’un est tiré au hasard, selon le poids |
juste file, poids 1 |
skip |
blocs de ses fichiers qui ne sont pas posés. "minecraft:air" garde les blocs du monde là où le fichier a de l’air |
— |
replace |
[{ block, with, chance }] : un bloc de ses fichiers devient un autre avec cette probabilité (plus de 0, jusqu’à 1) |
probabilité 1 |
decay |
{ left, blocks } : seule la part left (0–1) de blocks (ids ou tags) est conservée ; sans blocks, de n’importe quel bloc |
tout est conservé |
Structures de pièces qui s’assemblent
Un village ou un donjon est fait de pièces qui s’assemblent : une rue mène à une maison, un couloir à une salle. Chaque pièce est un fichier contenant des blocs de jigsaw du jeu, et chaque bloc de jigsaw nomme le pool d’où vient la pièce suivante, sous la forme <id du mod>:<pool>. Déclare les pools ; la structure part du premier.
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" }] },
]
}| Propriété | Valeurs | Par défaut |
|---|---|---|
pools |
les pools de pièces ; le premier est celui où elle commence | une pièce, issue de variants ou de file |
depth |
à combien de pièces de la première elle s’étend | 1 |
Chaque pool a :
| Clé | Valeurs | Par défaut |
|---|---|---|
name |
le nom qu’utilisent ses blocs de jigsaw, comme hamlet/streets |
— |
pieces |
[{ file, weight, follows_ground }]. follows_ground: true plie la pièce au sol dessous, pour les rues et les chemins ; false la garde droite, pour les maisons |
poids 1, false |
features |
[{ id, weight }] : une feature en guise de pièce, la tienne ou celle du jeu (minecraft:chorus_plant) |
— |
none |
poids de l’absence de pièce, pour une parcelle vide | 0 |
fallback |
le pool utilisé là où aucune pièce ne convient, comme au bout d’une rue | rien |
skip, replace |
comme pour une structure simple. Dans un pool, un remplacement peut ajouter where : seulement là où le monde a déjà ce bloc (les briques d’une rue sur l’eau deviennent des planches) |
— |
Toutes les pièces restent à moins de 80 blocs de la première.
Deux options n’existent qu’en Kotlin pour l’instant : salt, un nombre qui choisit où, dans sa plage de spacing chunks, tombe la structure (deux structures de même espacement et de même sel tombent aux mêmes endroits ; sans lui, il est tiré de l’id de la structure), et aboveBottom, combien de blocs au-dessus du fond du monde ses pièces doivent rester (là où l’une descendrait plus bas, la structure n’est pas créée).
Les structures que ton code construit bloc par bloc sont sur la page Génération par code.
Biomes
Un biome personnalisé prend une part des emplacements d’un biome du jeu. Il garde ce qui y pousse, y vit et y est creusé, et apporte son propre climat et ses propres couleurs.
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"
}| Propriété | Valeurs | Par défaut |
|---|---|---|
replaces |
le biome du jeu dont il prend la place : "minecraft:plains" |
"minecraft:plains" |
share |
fraction de ces emplacements qu’il prend, supérieure à 0 et jusqu’à 1 | 0.5 |
temperature |
température du climat | 0.8 |
downfall |
quantité de précipitations | 0.4 |
precipitation |
true pour la pluie, false sans |
true |
grass_color |
couleur de l’herbe, #rrggbb |
celles du biome remplacé |
foliage_color |
couleur des feuilles | celles du biome remplacé |
sky_color |
couleur du ciel | celles du biome remplacé |
fog_color |
couleur du brouillard | celles du biome remplacé |
water_color |
couleur de l’eau | #3f76e4 |
water_fog_color |
couleur du brouillard sous l’eau | celles du biome remplacé |
share se répartit uniformément sur les emplacements où serait le biome remplacé : 0.5 en prend la moitié, un sur deux. Le nouveau biome hérite de ce qui y pousse, y vit et y est creusé (végétation, minerais, grottes, créatures, musique) et de tout ce que d’autres mods ajoutent à ce biome. Les couleurs omises restent celles du biome remplacé.
Plusieurs biomes peuvent remplacer le même : ils se partagent ses emplacements. Trouve le tien avec /locate biome <id du mod>:ruby_meadow.
Son, sol et créatures
Un biome peut aussi avoir sa propre musique et son propre air, recouvrir son sol d’un bloc à toi, et choisir qui y vit :
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] },
]
}| Propriété | Valeurs | Par défaut |
|---|---|---|
music |
un id de son, joué comme musique du biome | celle du biome remplacé |
ambient_sound |
un son qui joue en continu (du vent, un bourdonnement) | celui du biome remplacé |
particle |
{ id, chance } : une particule qui flotte dans son air ; chance par endroit près du joueur à chaque tick (0.001, c’est quelques-unes) |
celle du biome remplacé ; chance 0.01 |
surface |
le bloc dont son sol est recouvert (le bloc du dessus de chaque étage) | le sol habituel de la dimension |
spawns |
[{ creature, weight, group }] : les créatures qui y vivent ; quand il en nomme, ce sont celles-là et aucune autre |
celles du biome remplacé ; poids 10, groupe [1, 4] |
inherits |
false : seul ce qui est donné à ce biome y est généré (ses features, ses carvers, ce que des mods y placent), pas ce qui est généré dans le biome remplacé |
true |
features |
[{ id, step }] : des features qui existent déjà, celles du jeu ou des données, placées dans ce biome. step vaut lakes, surface, ores, underground ou vegetation |
— |
carvers |
ids de carvers qui creusent ses grottes, les tiens ou ceux du jeu ; ils s’exécutent dans l’ordre donné, avant ceux du biome remplacé | — |
Avec inherits: false, le biome prend toujours les emplacements du biome remplacé, ainsi que ses créatures et ses sons sauf si tu donnes les tiens ; seul ce qui y pousse et y est creusé cesse de suivre. Un sol fait bloc par bloc et des carvers à toi sont sur la page Génération par code.
Biomes de l’End
Dans l’End, un biome prend des régions entières, d’environ 200 blocs de large, au lieu d’emplacements de climat. En remplaçant minecraft:end_highlands, il prend toute la terre des îles de ses régions (hautes terres, terres moyennes et terres stériles) ; en remplaçant minecraft:small_end_islands, le vide entre les îles. L’île centrale reste celle du jeu, et les régions sont différentes dans chaque monde.
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" }]
}Bon à savoir
- Seulement les nouveaux chunks. Les chunks déjà générés ne changent pas ; seuls ceux générés après l’installation du mod reçoivent minerais, arbres, plantes, structures et biomes. Explore du terrain neuf pour les trouver.
- Les noms manquants sont ignorés. Un biome ou un tag de
biomesqui n’existe pas (par exemple celui d’un autre mod non installé) est sauté, ce n’est pas une erreur. - Pas de sol, pas de structure. Une structure qui se tient sur la surface n’est pas créée là où sa colonne n’a aucun sol, comme le vide entre les îles de l’End.
- Les features, structures, reliefs, cartes de biomes, carvers et sols écrits en code sont sur la page Génération par code.
- Les mondes entiers à toi sont sur la page Dimensions.
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)
}