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

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

content/void_ore.craftCraftScript
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.

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

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 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 :

  1. Construis-la dans le jeu.
  2. Enregistre-la avec un bloc de structure.
  3. Copie le fichier .nbt dans le dossier structures/ du mod : à côté des scripts pour un mod CraftScript, ou dans assets/<id du mod>/structures/ pour un jar Kotlin ou Java.

Déclare-la ensuite :

content/ruby_shrine.craftCraftScript
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 :

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

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

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

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] },
    ]
}
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.

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

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 biomes qui 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

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