API

Generowanie świata

Rudy, drzewa, kwiaty, struktury i biomy, które pojawiają się w świecie same. Deklarujesz co i gdzie, a nowe chunki to dostają.

Rudy

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]
}
Właściwość Wartości Domyślnie
block blok do postawienia: "mymod:other" blok o takiej samej nazwie jak ruda
replaces stone, deepslate, stone_and_deepslate (Overworld), netherrack (Nether) lub end_stone (End) stone_and_deepslate
size bloków w żyle, 1–64 8
per_chunk prób żył na chunk 8
height [min, max], zakres wysokości [-64, 64]
biomes tylko w tych biomach, przez identyfikator lub tag każdy biom, w którym jest jej skała

Bez biomes ruda pojawia się w każdym biomie wymiaru, do którego należy replaces; ruda z end_stone w każdym biomie Endu. Sam blok deklaruje się jak każdy inny, z jego twardością, narzędziem i łupem; zobacz Bloki, przedmioty i receptury.

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

Drzewa

Drzewo to prosty pień z kulą liści. Zadeklaruj dwa bloki, a potem drzewo.

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"]
}
Właściwość Wartości Domyślnie
trunk blok pnia, z moda lub z gry: "ruby_log", "minecraft:oak_log" —
leaves blok liści —
height wysokość pnia w blokach 5
height_variation o ile wysokość różni się między drzewami 2
leaves_radius promień kuli liści w blokach 2
per_chunk drzewa próbowane na chunk 1
biomes biomy, w których występuje, przez identyfikator lub tag —

Biomy podajesz przez identyfikator (minecraft:plains) albo tag (#minecraft:is_forest), w dowolnej mieszance. Pień i liście mogą być blokami moda lub gry.

Rośliny i skupiska

Roślina to blok rysowany jako dwa skrzyżowane obrazki, jak kwiat: nic z nią nie koliduje, a światło przez nią przechodzi. Jej tekstura to textures/block/ruby_flower.png, z przezroczystym tłem.

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
}

Skupisko rozsiewa rośliny po świecie:

Właściwość Wartości Domyślnie
block blok rośliny —
biomes biomy, w których występuje, przez identyfikator lub tag —
rarity jedno skupisko na tyle chunków 4
size rośliny, które każde skupisko próbuje postawić 32
spread największa odległość od środka skupiska w blokach 7

Rośliny stawiane są tylko w powietrzu, na gruncie powierzchni (trawa, ziemia, mech i błoto). Żeby rośliny rosły na innym gruncie, na ścianach albo zwisały z sufitów, napisz feature: zobacz Generowanie kodem.

Struktury

Struktura to budowla, którą tworzysz sam:

  1. Zbuduj ją w grze.
  2. Zapisz ją blokiem strukturalnym.
  3. Skopiuj plik .nbt do folderu structures/ moda: obok skryptów w modzie CraftScript albo do assets/<id moda>/structures/ w jarze Kotlina lub Javy.

Potem ją zadeklaruj:

content/ruby_shrine.craftCraftScript
structure "ruby_shrine" {
    file: "ruby_shrine"
    biomes: ["#minecraft:is_overworld"]
    spacing: 24
    separation: 8
    buried: false
}
Właściwość Wartości Domyślnie
file nazwa pliku .nbt, bez rozszerzenia pierwszy wariant albo nazwa struktury
biomes biomy, w których występuje, przez identyfikator lub tag —
spacing mniej więcej jedna struktura na tyle chunków 24
separation nigdy bliżej niż tyle chunków; mniej niż spacing 8
buried true zagłębia ją w ziemi, na ruiny false
offset_y bloków w górę od powierzchni, na której stoi; wartość ujemna zagłębia ją 0
adapt_ground true wypełnia grunt pod nią i oczyszcza go wokół; false stawia ją taką, jaka jest true
heights [min, max]: na losowej wysokości z tego zakresu, gdziekolwiek jest powierzchnia, zamiast na powierzchni (dom na niebie) na powierzchni

Znajdziesz ją przez /locate structure <id moda>:ruby_shrine, a postawisz przez /place structure <id moda>:ruby_shrine.

Warianty, zamiany i rozpad

Jedna struktura może pochodzić z kilku plików, a jej bloki mogą się zmieniać podczas stawiania. Dzięki temu ruiny nigdy nie są całkiem takie same:

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"] }
}
Właściwość Wartości Domyślnie
variants pliki, z których jest jedną: nazwy albo { file, weight }; jeden jest wybierany losowo, według wagi tylko file, waga 1
skip bloki z jej plików, które nie są stawiane. "minecraft:air" zostawia bloki świata tam, gdzie plik ma powietrze —
replace [{ block, with, chance }]: blok z jej plików zamienia się w inny z tą szansą (więcej niż 0, do 1) chance 1
decay { left, blocks }: zostaje tylko left (0–1) z blocks (id lub tagi); bez blocks z dowolnych bloków zostaje wszystko

Struktury z łączących się części

Wioska albo loch składa się z części, które się łączą: ulica prowadzi do domu, korytarz do sali. Każda część to plik z blokami puzzli (jigsaw) z gry, a każdy blok puzzli nazywa pulę, z której pochodzi następna część, jako <id moda>:<pula>. Zadeklaruj pule; struktura zaczyna od pierwszej.

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" }] },
    ]
}
Właściwość Wartości Domyślnie
pools pule części; pierwsza jest tą, od której zaczyna jedna część, z variants lub file
depth jak daleko od pierwszej części sięga, w częściach 1

Każda pula ma:

Klucz Wartości Domyślnie
name nazwa, której używają jej bloki puzzli, jak hamlet/streets —
pieces [{ file, weight, follows_ground }]. follows_ground: true wygina część do gruntu pod nią, dla ulic i ścieżek; false zostawia ją prostą, dla domów waga 1, false
features [{ id, weight }]: feature jako część, twój albo z gry (minecraft:chorus_plant) —
none waga braku jakiejkolwiek części, dla pustej działki 0
fallback pula używana tam, gdzie żadna część nie pasuje, na przykład na końcu ulicy nic
skip, replace jak dla pojedynczej struktury. W puli zamiana może dodać where: tylko tam, gdzie świat ma już ten blok (cegły ulicy nad wodą stają się deskami) —

Wszystkie części pozostają w promieniu 80 bloków od pierwszej.

Dwie opcje są na razie tylko w Kotlinie: salt, liczba, która wybiera, gdzie w swoim odcinku spacing chunków wypada struktura (dwie struktury o tym samym spacing i salt wypadają w tych samych miejscach; bez niej powstaje ona z id struktury), oraz aboveBottom, o ile bloków nad dnem świata muszą pozostać jej części (tam, gdzie któraś sięgnęłaby niżej, struktura nie powstaje).

Struktury, które twój kod buduje blok po bloku, opisuje strona Generowanie kodem.

Biomy

Własny biom zajmuje część miejsc biomu z gry. Zachowuje to, co tam rośnie, żyje i jest wydrążone, a do tego ma własny klimat i kolory.

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"
}
Właściwość Wartości Domyślnie
replaces biom z gry, którego miejsca zajmuje: "minecraft:plains" "minecraft:plains"
share ułamek tych miejsc, który zajmuje, większy niż 0 i do 1 0.5
temperature temperatura klimatu 0.8
downfall jak bardzo pada 0.4
precipitation true, gdy pada deszcz, false, gdy nie true
grass_color kolor trawy, #rrggbb takie jak w zastępowanym biomie
foliage_color kolor liści takie jak w zastępowanym biomie
sky_color kolor nieba takie jak w zastępowanym biomie
fog_color kolor mgły takie jak w zastępowanym biomie
water_color kolor wody #3f76e4
water_fog_color kolor mgły pod wodą takie jak w zastępowanym biomie

share rozkłada się równomiernie na miejsca, w których byłby zastępowany biom: 0.5 zajmuje połowę, co drugie. Nowy biom dziedziczy to, co tam rośnie, żyje i jest wydrążone (roślinność, rudy, jaskinie, stworzenia, muzyka) oraz to, co inne mody dodają do tego biomu. Pominięte kolory zostają takie jak w zastępowanym biomie.

Kilka biomów może zastępować ten sam: dzielą jego miejsca. Znajdziesz swój poleceniem /locate biome <id moda>:ruby_meadow.

Dźwięk, grunt i stworzenia

Biom może też mieć własną muzykę i powietrze, pokrywać swój grunt twoim blokiem i wybierać, kto w nim żyje:

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] },
    ]
}
Właściwość Wartości Domyślnie
music id dźwięku, odtwarzanego jako muzyka biomu z zastępowanego biomu
ambient_sound dźwięk, który gra tam bez przerwy (wiatr, szum) z zastępowanego biomu
particle { id, chance }: cząsteczka unosząca się w jego powietrzu; chance na miejsce w pobliżu gracza w każdym ticku (0.001 to kilka) z zastępowanego biomu; chance 0.01
surface blok, którym pokryty jest jego grunt (górny blok każdej podłogi) zwykły grunt wymiaru
spawns [{ creature, weight, group }]: stworzenia, które tam żyją; gdy poda jakiekolwiek, to te i żadne inne z zastępowanego biomu; weight 10, group [1, 4]
inherits false: generuje się tam tylko to, co dano temu biomowi (jego features, jego carvers, to, co mody w nim stawiają), a nie to, co generuje się w zastępowanym biomie true
features [{ id, step }]: istniejące już featury, z gry lub z danych, stawiane w nim. step to lakes, surface, ores, underground lub vegetation —
carvers id wyrzynaczy (carverów), które drążą jego jaskinie, twoich lub z gry; działają w podanej kolejności, przed tymi z zastępowanego biomu —

Przy inherits: false biom nadal zajmuje miejsca zastępowanego biomu oraz zachowuje jego stworzenia i dźwięki, chyba że podasz własne; przestaje się tam pojawiać tylko to, co rośnie i jest wydrążone. Grunt tworzony blok po bloku i własne carvery opisuje strona Generowanie kodem.

Biomy Endu

W Endzie biom zajmuje całe regiony, szerokie na około 200 bloków, zamiast miejsc klimatu. Zastępując minecraft:end_highlands, zajmuje całą wyspową ziemię swoich regionów (wyżyny, średnie tereny i pustkowia); zastępując minecraft:small_end_islands, pustkę między wyspami. Centralna wyspa pozostaje taka jak w grze, a regiony są inne w każdym świecie.

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

Warto wiedzieć

  • Tylko nowe chunki. Chunki już wygenerowane się nie zmieniają; rudy, drzewa, rośliny, struktury i biomy dostają tylko chunki wygenerowane po zainstalowaniu moda. Eksploruj nowy teren, żeby je znaleźć.
  • Brakujące nazwy są pomijane. Biom lub tag w biomes, który nie istnieje (na przykład z innego moda, który nie jest zainstalowany), jest pomijany, a nie jest błędem.
  • Bez gruntu nie ma struktury. Struktura stojąca na powierzchni nie powstaje tam, gdzie jej kolumna nie ma żadnego gruntu, jak w pustce między wyspami Endu.
  • Featury, struktury, ląd, mapy biomów, carvery i grunty pisane w kodzie opisuje strona Generowanie kodem.
  • Całe własne światy opisuje strona Wymiary.

W Kotlinie

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