API

Mga bloke, gamit at resipe

Idinedeklara mo ang content bilang listahan ng mga property. Ginagawa ng Crafting ang totoong mga object ng laro sa tamang oras at ginagawa ang mga model, loot table, tag, recipe at salin na kailangan nila. Wala kang isusulat na data file ng laro.

Mga item

content/items.craftCraftScript
item "ruby" { rarity: "rare" }

item "ruby_apple" {
    food: { nutrition: 8, saturation: 1.2, always_edible: true }
    glint: true
}

item "ruby_pickaxe" { tool: { type: "pickaxe", tier: "diamond", speed: 9 }, tab: "tools_and_utilities" }
Katangian Mga value Default na halaga
stack o max_stack 1–99 64
rarity common, uncommon, rare, epic (kulay ng pangalan) common
glint kinang ng enchantment false
durability numero; pinipilit ang stack: 1 0
fireproof hindi nasusunog sa lava o apoy false
food numero, o { nutrition, saturation, always_edible } —
tool "pickaxe", o { type, tier, damage, speed }; type: pickaxe, axe, shovel, hoe, sword —
tab tab ng creative inventory (nasa ibaba) ingredients
texture path ng texture item/<id>
on_use fun(player, stack); nagre-return ng true kung ito ang humawak sa paggamit —
armor { slot, defense, toughness, knockback_resistance, texture } —
on_hit fun(attacker, target, stack) —
cooldown segundo 0

Armor, sandata at cooldown

Ang item na may armor ay maaaring isuot. Ang slot ay head, chest, legs o feet. Ang defense, toughness at knockback_resistance (0 hanggang 1) ay ang mga halaga ng armor ng laro: ang iron chestplate ay may 6 defense, ang diamond ay may 2 toughness.

content/armor.craftCraftScript
item "frost_helmet" { texture: "minecraft:item/iron_helmet", armor: { slot: "head", defense: 3, texture: "frost" } }
item "frost_chestplate" { armor: { slot: "chest", defense: 8, toughness: 2 }, durability: 400 }

Ang texture ay ang itsura nito kapag suot. Ang frost ay nangangahulugang textures/entity/equipment/humanoid/frost.png sa mod at, para sa binti, textures/entity/equipment/humanoid_leggings/frost.png, na may parehong ayos ng mga texture ng armor ng laro. Kung wala ito, mukhang iron ang armor.

Tumatakbo ang on_hit kapag ginamit ang item sa pagtama, ng player man o ng mob.

content/frost_blade.craftCraftScript
item "frost_blade" {
    texture: "minecraft:item/diamond_sword"
    tool: "sword"
    cooldown: 3
    on_hit: fun(attacker, target, stack) {
        target.add_effect("minecraft:slowness", 4, 4)
        target.world.spawn_particle("minecraft:snowflake", target.location.add(0, 1, 0), 20, 0.4, 0.02)
    }
}

Ang cooldown (sa segundo) ay humaharang sa item nang ganoong katagal pagkatapos ng bawat gamit na tinanggap ng on_use nito, at makikita ito sa hotbar. Mula sa code: player.set_cooldown("minecraft:feather", 2) at player.has_cooldown(id). Sa Kotlin: armor(EquipmentSlot.HEAD, defense = 3, texture = "frost") para sa armor at onHit = { ctx -> … } para sa sandata (ctx.attacker, ctx.target, ctx.stack).

content/Armor.ktKotlin
item("frost_helmet") { armor(EquipmentSlot.HEAD, defense = 3, texture = "frost") }

Mga block

content/ores.craftCraftScript
block "ruby_ore" {
    hardness: 3
    tool: "pickaxe"
    tier: "iron"
    loot: [
        { item: "rubies:ruby", count: [1, 2] },
        { item: "minecraft:diamond", chance: 0.1 }
    ]
}

block "ruby_block" { hardness: 5, light: 7, tool: "pickaxe", sound: "metal" }

block "ruby_lamp" { hardness: 0.3, light: 15, sound: "glass", transparent: true, tab: "functional_blocks" }

block "ruby_bricks" { hardness: 2, tool: "pickaxe", drops: "ruby", drop_count: [2, 4] }
Katangian Mga value Default na halaga
hardness numero; -1 = hindi nasisira 1.5
resistance tibay laban sa pagsabog = hardness
light 0–15 0
light_when isang toggle state, tulad ng "lit": kumikinang lang ang block habang naka-on ito (tingnan ang Mga state ng block) palagi
sound stone, wood, gravel, grass, metal, glass, wool, sand stone
like isang block na ginagawang kapareho, sa laro ("minecraft:end_stone") o sa iyo: ang hardness, resistance, tunog nito at kung kailangan ba ng tamang tool para may mahulog ay ang sa block na iyon —
kind isa sa mga uri ng laro: hagdan, pinto, chest, pananim… (tingnan ang Mga uri ng block) cube
tool, tier tool na kailangan para may i-drop ang block, at ang pinakamababang materyal ng tool na iyon: wood, stone, iron, diamond, netherite —, wood
drops, drop_count iisang item: id; numero o [min, max] ang block mismo, 1
loot ilang item: [{ item, count, chance, tool, fortune }, …]. Hiwalay na nira-roll ang bawat isa; numero o [min, max] ang count at mula 0 hanggang 1 ang chance (default 1). Ang tool at fortune: tingnan ang Mga drop: mga tool at fortune sa ibaba —
friction 0.6 normal, 0.98 yelo 0.6
transparent nakikita ang kabila nito (glass, leaves) false
has_item i-register din ang item ng block; kapag wala, walang ibinabagsak ang block maliban kung sinasabi ng drops o loot kung ano true
tab tab ng creative inventory building_blocks
on_use fun(player, block); nagre-return ng true kung ito ang humawak sa paggamit. Ang manlalarong nakaluhod na may hawak ay inilalagay ito sa halip, gaya ng sa mga block ng laro —

Mga tab: building_blocks, colored_blocks, natural_blocks, functional_blocks, redstone_blocks, tools_and_utilities, combat, food_and_drinks, ingredients, spawn_eggs. Sa Kotlin, nasa CreativeTabs ang mga ito.

Para mag-drop ng dagdag ang isang nilalang kapag namatay ito, idagdag ito sa e.drops sa event na entity_death (tingnan ang Mga kaganapan).

Sa parehong paraan idinedeklara ang mga block na hindi cube, mga block ng mga uri ng laro, mga nilalang, ore, tunog at particle, at may sarili silang pahina: Mga hugis ng block, Mga uri ng block, Mga nilalang, World generation, Mga tunog at partikulo.

Mga drop: mga tool at fortune

Ang drop sa loot ay puwedeng mangailangan ng tool, at puwede itong dagdagan ng fortune:

content/drops.craftCraftScript
block "ruby_ore" {
    kind: "ore"
    tool: "pickaxe"
    tier: "iron"
    xp: [1, 4]
    loot: [
        { item: "ruby", count: [1, 2], fortune: true },
        { item: "ruby_ore", tool: "silk_touch" }
    ]
}

block "frost_leaves" {
    kind: "leaves"
    loot: [
        { item: "frost_leaves", tool: "shears" },
        { item: "frost_sapling", chance: 0.05, fortune: true }
    ]
}
  • tool: "silk_touch": nahuhulog lang ito kapag binasag ang block gamit ang silk touch. tool: "shears": gamit lang ang gunting o silk touch, gaya ng pagbagsak ng sarili ng mga dahon at baging sa laro.
  • Kapag may mga drop na nangangailangan ng tool, ang mga drop na walang tool ay nangyayari lang kapag hindi ginamit ang tool na iyon: ibinabagsak ng ore sa itaas ang sarili nito kapag may silk touch at ang mga ruby nito kung wala.
  • fortune: true: dinadagdagan ito ng fortune, mas marami sa count nito gaya ng sa mga ore ng laro, o mas magandang chance gaya ng sa mga sapling mula sa mga dahon.

Sa Kotlin: drop("ruby", 1..2, tool = null, fortune = true) at drop("ruby_ore", tool = DropTool.SILK_TOUCH).

content/Drops.ktKotlin
block("ruby_ore") {
    kind = BlockKind.ORE
    xp = 1..4
    drop("ruby", 1..2, tool = null, fortune = true)
    drop("ruby_ore", tool = DropTool.SILK_TOUCH)
}

Mga recipe

content/recipes.craftCraftScript
recipe shaped "ruby_block" {
    pattern: ["RRR", "RRR", "RRR"]
    keys: { R: "ruby" }
    result: "ruby_block"
}

recipe shapeless "rubies_from_block" { ingredients: ["ruby_block"], result: "ruby", count: 9 }

recipe smelting "ruby_from_ore" { input: "ruby_ore", result: "ruby", xp: 1.0 }

Behaviour kapag ginamit

Ang on_use lang ang logic na nakatira katabi ng data. Kung lumampas ito sa ilang linya, isulat ang function sa lib/ at i-import ito:

content/wands.craftCraftScript
import { lift } from "/lib/teleport"

item "lift_wand" { stack: 1, rarity: "uncommon", on_use: lift }
lib/teleport.craftCraftScript
fun lift(player, stack) {
    player.teleport(player.location.add(0, 10, 0))
    return true
}

Mga block na tumutugon

Puwedeng magpatakbo ng code ang isang block kapag may nangyari sa kanya o sa paligid niya. Natatanggap ng bawat handler ang block at, kung naaangkop, ang entity.

Property Tumatakbo kapag
on_step: fun(block, entity) may entity na tumapak sa block.
on_inside: fun(block, entity) may entity sa loob ng block. Dapat nitong payagang dumaan ang mga entity: portal, halaman o hugis na hindi solid.
on_random_tick: fun(block) paminsan-minsan, nang random, tulad ng paglaki ng mga pananim: mga isang beses kada 68 segundo bawat block.
on_tick: fun(block) lumipas na ang oras na hiniling gamit ang block.schedule(ticks) (20 tick = 1 segundo).
on_neighbor_change: fun(block) may nagbago sa katabing block: nilagay, binasag o nilagyan ng signal.
on_placed: fun(block, entity) may naglagay ng block; ang entity ay kung sino.
content/reactions.craftCraftScript
block "jump_pad" { on_step: fun(b, e) { e.velocity = vector(0, 1.1, 0) } }

block "blinker" {
    light: 7
    on_tick: fun(b) {
        b.world.spawn_particle("minecraft:end_rod", b.location.add(0.5, 1.2, 0.5), 4, 0.1, 0.01)
        b.schedule(20)
    }
    on_neighbor_change: fun(b) { b.schedule(1) }
}

Sa Kotlin, ang mga handler ay onStep, onInside, onRandomTick, onTick, onNeighborChange at onPlaced. Bawat isa ay tumatanggap ng BlockEventContext na may block at, kung mayroon, entity:

content/Reactions.ktKotlin
block("pad") { onStep = { ctx -> ctx.entity?.velocity = Vector(0.0, 1.1, 0.0) } }

Mga portal

Dinadala ng block na may portal ang sinumang nasa loob nito sa ibang dimension. Ibigay ang dimension na pupuntahan, o to at back para piliin kung saan ito patungo mula roon:

content/portals.craftCraftScript
block "sky_gate" { portal: "gatemod:sky", light: 11 }

block "sky_gate_two_way" { portal: { to: "gatemod:sky", back: "minecraft:overworld" } }

Dumarating ang entity sa lupa sa parehong x at z at naghahanap doon ng portal block na pambalik; kung wala sa malapit, naglalagay ng isa sa tabi ng pagdating. Sandaling naghihintay ang mga entity bago muling gumamit ng portal. Pinapadaan ng mga portal block ang mga entity. Ideklara ang mismong dimension gamit ang dimension (tingnan ang @dim@). Sa Kotlin:

content/Portals.ktKotlin
block("sky_gate") { portal("gatemod:sky") }

Mga state ng block

Binibigyan ng states ang block ng mga value na naaalala at maipapakita nito:

content/states.craftCraftScript
block "lamp" {
    model: "block/lamp"
    states: ["facing", "lit"]
    on_use: fun(p, b) { b.set_state("lit", !b.state("lit")); return true }
    on_neighbor_change: fun(b) { b.set_state("lit", b.redstone_power > 0) }
}

block "crop" { states: [{ stage: 3 }, { wet: true }] }
  • "facing": hilaga, silangan, timog o kanluran. Humaharap ito sa manlalarong naglalagay ng block, at umiikot ang model kasama nito.
  • "lit": ang pangalan lang ay isang on/off na toggle, off bilang default. Ginagawa itong on bilang default ng { lit: true }.
  • { stage: 3 }: numerong mula 0 hanggang sa maximum na ibibigay mo (1 hanggang 15).
  • "facing_all": gaya ng "facing", pero pataas at pababa rin. Nakaharap ito sa manlalarong naglalagay nito, at iniikot ang model para sa pataas at pababa.
  • { shape: ["top", "middle", "bottom"] }: isa sa ilang pangalan, ang una bilang default. Ang mga pangalan ay maliliit na letra, numero at _.

Basahin at baguhin ang mga ito gamit ang block.state("lit") at block.set_state("lit", true). Gumagana rin ito sa mga block ng laro, halimbawa ang facing at lit ng furnace.

Puwedeng magmukhang iba ang state na wala sa default. Magdagdag ng texture sa textures/block/<id>_<pangalan>.png (toggle na naka-on) o <id>_<pangalan><n>.png (numero) o <id>_<value>.png (pangalan), o ng model sa models/block/<id>_<pangalan>.json. Una munang sinusubukan ang buong kombinasyon (<id>_lit_stage2), tapos ang bawat state nang mag-isa. Sa halimbawa, ang lamp.json at lamp_lit.json ang dalawang model ng mod, halimbawa na may parent na minecraft:block/orientable at mga texture ng harap, gilid at itaas.

Liwanag ayon sa state. Sa light_when: "lit", kumikinang lang ang light ng block habang naka-on ang toggle na iyon, tulad ng sa isang lampara:

content/lamp.craftCraftScript
block "lamp" {
    light: 15
    light_when: "lit"
    states: ["lit"]
    on_use: fun(p, b) { b.set_state("lit", !b.state("lit")); return true }
}

Sa Kotlin: facing(), facingAll(), toggle("lit"), number("stage", 3), choice("shape", "top", "middle", "bottom"), at block.state(…) at block.setState(…) sa code:

content/States.ktKotlin
block("lamp") {
    model = "block/lamp"
    facing()
    toggle("lit")
    number("stage", 3)
}

Mga effect

Ang isang mod ay maaaring magdagdag ng sarili nitong mga status effect. Lumalabas ang mga ito sa screen ng player tulad ng sa laro at ibinibigay at binabasa sa parehong paraan.

content/frozen.craftCraftScript
effect "frozen" {
    color: "#88CCFF"
    kind: "harmful"
    on_tick: fun(e, level) { e.damage(level) }
}
  • color: ang kulay ng mga particle nito at ng background ng icon nito.
  • kind: beneficial, harmful o neutral.
  • on_tick: fun(e, level), tumatakbo bawat segundo habang may effect ang isang entity, kasama ang level nito (ang 1 ay I).
  • Ang icon ay ang textures/mob_effect/<id>.png ng mod.

Ibigay ito gamit ang e.add_effect("mymod:frozen", 3, 1) (id, segundo, level) at tingnan gamit ang e.has_effect("mymod:frozen"), tulad ng mga effect ng laro (tingnan ang Ang mundo at ang mga manlalaro). Sa Kotlin:

content/Frozen.ktKotlin
content.effect("frozen") {
    color = 0x88CCFF
    kind = EffectKind.HARMFUL
    onTick = { e, level -> /* … */ }
}

Redstone

content/battery.craftCraftScript
block "battery" {
    texture: "minecraft:block/copper_block"
    redstone: true
    on_use: fun(p, b) { if b.state("power") > 0 { b.set_state("power", 0) } else { b.set_state("power", 15) }; return true }
}

Pinapalabas ng redstone: true sa block ang signal na kasinglakas ng power state nito, isang numerong 0 hanggang 15 na awtomatikong idinaragdag. Binubuksan ito ng b.set_state("power", 15), at sumusunod ang mga wire, lampara at pinto sa paligid. Ang block.redstone_power ay ang lakas na natatanggap ng block mula sa paligid, at tumatakbo ang on_neighbor_change kapag nagbago ito (ginagamit ito ng lampara sa itaas).

Sa Kotlin: redstone = true at block.redstonePower.

content/Battery.ktKotlin
block("battery") {
    texture = "minecraft:block/copper_block"
    redstone = true
    // in a handler: ctx.block.redstonePower
}

Mga inventory

content/crate.craftCraftScript
block "crate" { texture: "minecraft:block/barrel_side", inventory: 27 }

Binibigyan ng inventory: 27 ang block ng ganoong karaming slot (9 hanggang 54, sa mga hanay na may 9). Nananatili ang mga item nito kahit i-restart, nagbubukas ng screen ng chest kapag ginamit (maliban kung kinuha ng on_use nito ang click), at nahuhulog ang laman nito kapag binasag. Mula 1 hanggang 8 slot, walang screen: ang mod mismo ang naglalagay at kumukuha ng mga item.

Sa code, nag-aalok ang block.inventory (gumagana rin para sa mga chest at barrel ng laro) ng set(slot, item(…)), get(slot), count(id) at add(…). Sa Kotlin: inventory = 27.

content/Crate.ktKotlin
block("crate") {
    texture = "minecraft:block/barrel_side"
    inventory = 27
}

Mga item na ipinapakita sa block. Ang shows_item: 14 ay ginagawang lumutang sa ibabaw ng block, umiikot, ang item sa unang slot ng block, sa ganoong karaming pixel sa itaas ng ilalim nito. Nakikita ito ng bawat manlalaro, at nawawala ito kapag nawalan ng laman ang slot o nasira ang block. Ang pedestal ay kumukuha ng item sa kamay ng manlalaro at ibinabalik ito sa kanya:

content/pedestal.craftCraftScript
block "pedestal" {
    shape: [[2, 0, 2, 14, 12, 14]]
    inventory: 1
    shows_item: 14
    on_use: fun(p, b) {
        let inv = b.inventory
        if inv.get(0) == null and p.held_item != null {
            inv.set(0, p.held_item)
            p.set_held_item(null)
        } else if inv.get(0) != null {
            p.give(inv.get(0))
            inv.set(0, null)
        }
        return true
    }
}

Ang player.set_held_item(stack) ay naglalagay ng item sa main hand ng manlalaro, o inaalis ito gamit ang null. Sa Kotlin: showsItem = 14 at player.setHeldItem(stack).

content/Pedestal.ktKotlin
block("pedestal") {
    box(2, 0, 2, 14, 12, 14)
    inventory = 1
    showsItem = 14
    onUse { ctx ->
        val inv = ctx.block.inventory!!
        val held = ctx.player.heldItem
        val shown = inv[0]
        if (shown == null && held != null) { inv[0] = held; ctx.player.setHeldItem(null) }
        else if (shown != null) { ctx.player.give(shown); inv[0] = null }
        true
    }
}

Mga texture

Kasama sa loob ng mod ang mga texture; walang kailangang mag-install ng resource pack. Ang pangalan ng file ay ang id:

Mod Saan
CraftScript (folder) mods/rubies/textures/item/ruby.png, mods/rubies/textures/block/ruby_ore.png
Kotlin o Java src/main/resources/assets/rubies/textures/item/ruby.png

Kung may sariling model, recipe o loot table ang isang mod sa parehong mga folder na iyon, ginagamit ng Crafting ang mga iyon.

Sa Kotlin

content/Blocks.ktKotlin
package com.example.rubies.content

object Blocks {
    fun register(content: ContentBuilder) {
        content.block("ruby_ore") {
            hardness = 3f
            requiresTool = ToolType.PICKAXE
            minTier = ToolTier.IRON
            drop("ruby", 1..2)
            drop("minecraft:diamond", chance = 0.1)
        }
        content.block("ruby_block") { hardness = 5f; luminance = 7; sound = SoundGroup.METAL }
    }
}

Mga id. Kung walang namespace, sa mod mo ang id ("ruby" ay rubies:ruby). Para sa content ng laro, isulat ang namespace: "minecraft:diamond". Hindi ka puwedeng mag-register ng content sa namespace na minecraft.