API

ワールド生成

鉱石、木、花、構造物、バイオームがワールドに自動で現れます。何をどこに出すかを宣言すれば、新しいチャンクに反映されます。

鉱石

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]
}
プロパティ 値 デフォルト
block 配置するブロック:"mymod:other" 鉱石と同じ名前のブロック
replaces stone、deepslate、stone_and_deepslate(オーバーワールド)、netherrack(ネザー)または end_stone(エンド) stone_and_deepslate
size 鉱脈 1 つあたりのブロック数、1〜64 8
per_chunk チャンクごとに試す鉱脈の数 8
height [min, max]、高さの範囲 [-64, 64]
biomes これらのバイオームだけ(ID またはタグ) その岩があるすべてのバイオーム

biomes がなければ、鉱石は replaces が属するディメンションのすべてのバイオームに現れます。end_stone の鉱石なら、エンドのすべてのバイオームです。ブロック自体は、硬さ、ツール、ドロップとともに他のブロックと同じように宣言します。ブロック、アイテム、レシピを参照してください。

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

木

木は、まっすぐな幹と葉の球でできています。2 つのブロックを宣言してから、木を宣言します。

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"]
}
プロパティ 値 デフォルト
trunk 幹のブロック(Mod またはゲームのもの):"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)で指定し、自由に混ぜられます。幹と葉には、Mod のブロックもゲームのブロックも使えます。

植物とパッチ

植物は、花のように 2 枚の交差した画像で描かれるブロックです。何も衝突せず、光も通ります。テクスチャは textures/block/ruby_flower.png で、背景は透明にします。

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
}

パッチは、植物をワールドに散らします。

プロパティ 値 デフォルト
block 植物のブロック —
biomes 出現するバイオーム(ID またはタグ) —
rarity このチャンク数ごとに 1 つのパッチ 4
size 各パッチが置こうとする植物の数 32
spread パッチの中心からの最大距離(ブロック数) 7

植物は、オーバーワールドの地面(草、土、苔、泥)の上の空気中にだけ置かれます。他の地面の上、壁、天井から垂れ下がる植物には、フィーチャーを書きます。コードによる生成を参照してください。

構造物

構造物は、自分で作る建物です。

  1. ゲーム内で建てます。
  2. ストラクチャーブロックで保存します。
  3. .nbt ファイルを Mod の structures/ フォルダーにコピーします。CraftScript の Mod ではスクリプトの隣、Kotlin や Java の jar では assets/<Mod ID>/structures/ です。

そのうえで宣言します。

content/ruby_shrine.craftCraftScript
structure "ruby_shrine" {
    file: "ruby_shrine"
    biomes: ["#minecraft:is_overworld"]
    spacing: 24
    separation: 8
    buried: false
}
プロパティ 値 デフォルト
file 拡張子を除いた .nbt ファイルの名前 最初のバリアント、または構造物の名前
biomes 出現するバイオーム(ID またはタグ) —
spacing このチャンク数ごとに約 1 つの構造物 24
separation これより近くには出ないチャンク数(spacing より小さい値) 8
buried true で地面に沈めます(廃墟向け) false
offset_y 立っている地表から上へのブロック数。負の値で沈めます 0
adapt_ground true なら、下の地面を埋め、周囲を片付けます。false ならそのまま置きます true
heights [min, max]:地表のある場所で、地表の上ではなくこの範囲のランダムな高さに置きます(空に浮かぶ家) 地表の上

/locate structure <Mod ID>:ruby_shrine で探し、/place structure <Mod ID>:ruby_shrine で配置できます。

バリアント、置き換え、風化

1 つの構造物を複数のファイルから作り、置かれるときにブロックを変えられます。これにより、毎回少しずつ違う廃墟ができます:

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"] }
}
プロパティ 値 デフォルト
variants そのうちの 1 つになるファイル:名前、または { file, weight }。重みに従って 1 つがランダムに選ばれます file だけ、重み 1
skip ファイルのブロックのうち置かないもの。"minecraft:air" は、ファイルが空気のところでワールドのブロックをそのまま残します —
replace [{ block, with, chance }]:ファイルのブロックが、その確率(0 より大きく 1 まで)で別のブロックになります chance 1
decay { left, blocks }:blocks(ID またはタグ)のうち left(0〜1)の割合だけが残ります。blocks がなければ、どのブロックでも すべて残る

つながるパーツでできた構造物

村やダンジョンは、つながるパーツでできています。通りは家へ、廊下は部屋へとつながります。各パーツは、ゲームのジグソーブロックを含むファイルで、各ジグソーブロックは、次のパーツを選ぶプールを <Mod ID>:<プール> の形で指定します。プールを宣言すると、構造物は最初のプールから始まります。

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" }] },
    ]
}
プロパティ 値 デフォルト
pools パーツのプール。最初のものが開始地点です variants または file からの 1 つのパーツ
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 だけにあるオプションが 2 つあります:salt、構造物が spacing チャンクの区画のどこに来るかを決める数値(spacing と salt が同じ 2 つの構造物は同じ場所に来ます。指定しなければ、構造物の ID から作られます)と、aboveBottom、パーツがワールドの底から何ブロック上にとどまらなければならないか(それより低く届くところでは、構造物は作られません)です。

コードでブロックごとに組み立てる構造物は、コードによる生成のページにあります。

バイオーム

独自のバイオームは、ゲームのバイオームの場所の一部を引き継ぎます。そこに生える植物、住むモブ、掘られた地形はそのまま残り、気候と色は独自のものになります。

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"
}
プロパティ 値 デフォルト
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 なら半分、つまり 2 か所に 1 か所です。新しいバイオームは、そこに生えるもの、住むもの、掘られるもの(植生、鉱石、洞窟、モブ、音楽)と、他の Mod がそのバイオームに追加するものを引き継ぎます。指定しなかった色は、置き換えるバイオームのままです。

複数のバイオームが同じバイオームを置き換えることもでき、その場合は場所を分け合います。自分のバイオームは /locate biome <Mod ID>:ruby_meadow で探せます。

サウンド、地面、モブ

バイオームには、独自の音楽と空気感を持たせ、地面を自分のブロックで覆い、そこに住むものを選ばせることもできます:

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] },
    ]
}
プロパティ 値 デフォルト
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、Mod がそこに置くもの)。置き換えるバイオームで生成されるものは生成されません true
features [{ id, step }]:すでにあるフィーチャー(ゲームのもの、またはデータのもの)を、そこに置きます。step は lakes、surface、ores、underground、vegetation のいずれか —
carvers その洞窟をくり抜くカーバーの ID(自分のもの、またはゲームのもの)。指定した順に、置き換えるバイオームのものより先に実行されます —

inherits: false でも、バイオームは置き換えるバイオームの場所を引き継ぎ、独自に指定しない限りモブとサウンドも引き継ぎます。そこに生えるものと掘られるものだけが、付いてこなくなります。ブロックごとに作る地面と独自のカーバーは、コードによる生成のページにあります。

エンドのバイオーム

エンドでは、バイオームは気候の場所ではなく、幅約 200 ブロックの領域まるごとを引き継ぎます。minecraft:end_highlands を置き換えると、その領域のすべての島の陸(ハイランド、ミッドランド、バレン)を引き継ぎます。minecraft:small_end_islands を置き換えると、島々の間の虚空を引き継ぎます。中央の島はゲームのままで、領域はワールドごとに異なります。

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

知っておくと良いこと

  • 新しいチャンクだけ。 すでに生成されたチャンクは変わりません。Mod を導入した後に生成されたチャンクだけに、鉱石、木、植物、構造物、バイオームが現れます。新しい地形を探索して見つけてください。
  • 見つからない名前は省かれます。 biomes に指定したバイオームやタグが存在しない場合(たとえば、インストールされていない他の Mod のもの)は、エラーにならずスキップされます。
  • 地面がなければ構造物もなし。 地表に立つ構造物は、その列にまったく地面がない場所、たとえばエンドの島の間の虚空では作られません。
  • コードで書くフィーチャー、構造物、地形、バイオームマップ、カーバー、地面は、コードによる生成のページにあります。
  • 独自のワールドまるごとについては、ディメンションのページを参照してください。

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