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
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.
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.
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).
item("frost_helmet") { armor(EquipmentSlot.HEAD, defense = 3, texture = "frost") }Mga block
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:
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 sacountnito gaya ng sa mga ore ng laro, o mas magandangchancegaya 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).
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
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:
import { lift } from "/lib/teleport"
item "lift_wand" { stack: 1, rarity: "uncommon", on_use: lift }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. |
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:
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:
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:
block("sky_gate") { portal("gatemod:sky") }Mga state ng block
Binibigyan ng states ang block ng mga value na naaalala at maipapakita nito:
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:
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:
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.
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,harmfuloneutral.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>.pngng 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.effect("frozen") {
color = 0x88CCFF
kind = EffectKind.HARMFUL
onTick = { e, level -> /* … */ }
}Redstone
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.
block("battery") {
texture = "minecraft:block/copper_block"
redstone = true
// in a handler: ctx.block.redstonePower
}Mga inventory
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.
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:
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).
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
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.