API

Ang mundo at ang mga manlalaro

Magbasa at magbago ng mga block, mag-spawn ng mga entity, kausapin ang mga player. Sa CraftScript, gumagamit ng snake_case ang mga pangalan (block_at, max_health); sa Kotlin at Java, camelCase (blockAt, maxHealth). Iisang mga object ang mga ito.

Isang halimbawa

commands/beacon.craftCraftScript
command beacon requires "rubies.beacon" describe "Magsindi ng beacon kung saan ka nakatayo" {
    if player == null { return "Para sa mga player lang" }
    let w = player.world
    let at = player.location
    w.set_block(at.block_x, at.block_y, at.block_z, "minecraft:lantern", { hanging: false })
    w.spawn_particle("minecraft:flame", at, 30, 0.5, 0.02)
    w.play_sound(at, "minecraft:block.lantern.place")
    player.title("&eNakasindi", "")
}
commands/BeaconCommand.ktKotlin
object BeaconCommand {
    fun register() {
        Crafting.commands.command("beacon") {
            permission = "rubies.beacon"
            executes { c ->
                val at = c.player.location
                val world = c.player.world
                world.setBlock(at.blockX, at.blockY, at.blockZ, Identifier.parse("minecraft:lantern"), mapOf("hanging" to false))
                world.spawnParticle(Identifier.parse("minecraft:flame"), at, count = 30, spread = 0.5, speed = 0.02)
                world.playSound(at, Identifier.parse("minecraft:block.lantern.place"))
                c.player.title("&eNakasindi")
            }
        }
    }
}

Mundo

world() sa CraftScript (ang pangunahing mundo, o world("minecraft:the_nether")); Crafting.server?.world(id) o player.world sa Kotlin.

Miyembro Ano ang ginagawa nito
id, players, time, is_raining, data Id ng mundo, mga player, oras ng araw (nababasa at nasusulatan), kung umuulan, saved data.
block_at(x, y, z) Ang block sa posisyong iyon.
set_block(x, y, z, type) Naglalagay ng block.
set_block(x, y, z, type, states) Naglalagay ng block na may state: { open: true }, { facing: "north" }.
spawn(type, location) Nag-i-spawn ng entity.
drop_item(location, stack) Naghuhulog ng item sa lupa.
explode(location, power, fire?) Pagsabog.
strike_lightning(location) Kidlat.
spawn_particle(id, location, count?, spread?, speed?) Mga particle.
spawn_particle(id, location, velocity) Isang particle na may ganoong velocity, sa mga block bawat tick. Ang ilan, gaya ng minecraft:enchant at minecraft:portal, ay papunta sa kung saan sila ginawa: nanggagaling sila sa location + velocity.
play_sound(location, id, volume?, pitch?) Isang tunog sa isang posisyon.
light_at(x, y, z) Gaano karami ang liwanag, mula 0 hanggang 15.
container_at(x, y, z) Ang inventory ng chest, barrel…, o null.
set_sign_text(x, y, z, lines) Text sa isang sign.
set_chunk_loaded(cx, cz, loaded) Pinapanatiling naka-load ang isang chunk kahit walang tao sa malapit.
entities() Ang mga entity sa mundo.
living_near(location, radius) Ang mga buhay na entity malapit sa isang lugar, ang pinakamalapit muna.
shoot(projectile, from, velocity, shooter?, damage?) Nagpapalipad ng projectile, ng laro o ng isang mod.

Ang manlalaro

Miyembro Ano ang ginagawa nito
name, uuid, is_op, has_crafting_client Pagkakakilanlan; kung may naka-install na Crafting ang client.
send(msg), action_bar(msg), title(title, subtitle?) Mga mensahe sa chat, sa action bar at sa screen. Mga kulay gamit ang &.
inventory, held_item, give(stack) Inventory, ang item na hawak, magbigay ng item.
set_held_item(stack) Naglalagay ng item sa main hand, kapalit ng dating naroon; ang null ay nag-aalis nito.
health, max_health, food_level, game_mode Health, gutom (nababasa at nasusulatan) at game mode.
is_sleeping Kung natutulog ang player.
data Data na naka-save kasama ng player (nasa ibaba).
play_sound(id, volume?, pitch?) Isang tunog para sa player na iyon lang.
has_permission(p), kick(reason) Mga permission; kick.

Living entity rin ang Player (nasa ibaba).

Mga entity, block at inventory

Uri Mga member
Entity uuid, type, world, location, custom_name, is_alive, data, direction, vehicle; teleport, remove, set_rotation, add_tag, has_tag.
LivingEntity Lahat ng nasa Entity, at health, max_health; damage, heal, set_ai, add_effect, remove_effect, has_effect, effects, add_modifier, remove_modifier, attribute, set_attribute, equipment, set_equipment (pinapatay o binubuksan ang sarili nitong behaviour).
Block type, x, y, z, world, location, is_solid, data; set_type, relative(dx, dy, dz).
Inventory size; get(slot), set(slot, stack), add(stack), count(id), clear().
Location world, x, y, z, yaw, pitch, block_x, block_y, block_z; add(dx, dy, dz), distance_to(other).

May hawak na id, bilang, pangalan, paglalarawan (lore) at sariling data ng mod ang isang ItemStack, at pinapanatili nito ang mga ito habang lumilipat sa mga inventory at chest. Sa CraftScript, gumagawa ka nito gamit ang item("rubies:ruby", 3); sa Kotlin, gamit ang ItemStack.of("rubies:ruby", 3) o ang buong constructor.

Ang stack.enchantments ay isang map mula sa id ng bawat enchantment papunta sa level nito (minecraft:sharpness → 3); sa enchanted book, ang mga ibinibigay nito. Sa Kotlin, ang stack.withEnchantments(mapOf(Identifier.parse("minecraft:sharpness") to 3)) ay ang parehong stack na may mga enchantment na iyon. Ang stack na binasa mula sa laro ay iniingatan ang lahat ng mayroon ito, kasama ang hindi pinapangalanan ng API (ang laman ng mapa, ang mga effect ng potion), kapag inilipat ito ng mod o binago gamit ang with_count o withEnchantments (hindi ito iniingatan ng copy ng Kotlin).

Mga effect, attribute at kagamitan

Mga effect. Ang anumang buhay na entity ay maaaring magkaroon ng mga effect ng laro. Ang e.add_effect("minecraft:speed", 8, 3) ay kumukuha ng id, segundo at level (ang 1 ay I); ang opsyonal na huling argumento, true o false, ang nagtatakda kung magpapakita ng particles. Kumpleto ito sa remove_effect(id), has_effect(id) at effects (isang map mula id patungong { level, seconds }). Sa Kotlin: addEffect(Identifier.parse("minecraft:speed"), 8.0, 3) at ActiveEffect(level, seconds).

Ang isang mod ay maaaring magdeklara ng sarili nitong mga effect (tingnan ang Mga bloke, gamit at resipe); ibinibigay at binabasa ang mga ito gamit ang parehong mga miyembro.

Mga attribute. Ibinabalik ng attribute("minecraft:movement_speed") ang halaga ngayon, kasama ang armor at mga effect. Binabago ng set_attribute("minecraft:scale", 1.6) ang base value: scale, attack_damage, max_health, jump_strength, armor… Sa Kotlin: attribute(id) at setAttribute(id, value).

commands/grow.craftCraftScript
command grow() {
    let p = player
    if p.attribute("minecraft:scale") > 1.2 { p.set_attribute("minecraft:scale", 1) } else { p.set_attribute("minecraft:scale", 1.6) }
}

Mga modifier. Binabago ng isang modifier ang isang attribute nang hindi pinapalitan ang base value nito, kaya maaaring magsama-sama ang marami at maaaring alisin ang bawat isa. Ang e.add_modifier("minecraft:movement_speed", "mymod:frozen_slow", -0.3, "percent_of_base") ay kumukuha ng attribute, isang id para sa modifier, ang halaga at ang operasyon; inaalis ito ng e.remove_modifier("minecraft:movement_speed", "mymod:frozen_slow"). Kapag idinagdag muli ang parehong id, napapalitan ito. Ang mga operasyon ay add (idinadagdag ang halaga), percent_of_base (idinadagdag ang halaga na beses ang base value) at multiply_total (minumultiply ang resulta sa 1 dagdag ang halaga). Sa Kotlin: addModifier(attr, id, amount, ModifierOperation.PERCENT_OF_BASE).

commands/chill.craftCraftScript
command chill() {
    player.add_modifier("minecraft:movement_speed", "mymod:chill", -0.3, "percent_of_base")
    // later: player.remove_modifier("minecraft:movement_speed", "mymod:chill")
}

Pagsakay at mga area effect. Ang entity.vehicle ay ang sinasakyan ng entity, o null. Ang world.living_near(location, radius) ay naglilista ng mga buhay na entity sa paligid ng isang lugar, ang pinakamalapit muna, na kailangan ng mga area effect:

commands/frostwave.craftCraftScript
command frostwave() {
    let p = player
    for other in p.world.living_near(p.location, 8) {
        if other.type != "minecraft:player" { other.add_effect("mymod:frozen", 4, 1) }
    }
}

Kagamitan. Ang e.equipment("head") ay ang item na suot doon, o null; binabago ito ng e.set_equipment("main_hand", item("minecraft:iron_sword")). Ang mga slot ay main_hand, off_hand, head, chest, legs at feet. Sa Kotlin: EquipmentSlot.HEAD, equipment(slot) at setEquipment(slot, stack).

Direksyon at cooldown. Ang entity.direction ay kung saan ito nakatingin, isang vector na isang block ang haba. Ang player.set_cooldown(item, seconds) at player.has_cooldown(item) ay naglalagay ng cooldown sa item at nagsusuri nito.

Naka-save na data

May data ang mga player, entity, block at mundo: isang key-value store na nananatili kahit mag-restart. Nag-iimbak ito ng mga string, numero, boolean, list at map.

lib/storage.craftCraftScript
// Data that survives restarts. Keys start with the mod id: they're shared by every mod.
const VISITS = "rubies.visits"

fun visits(p: Player): number {
    return p.data.get_int(VISITS) ?? 0
}

fun add_visit(p: Player): number {
    let n = visits(p) + 1
    p.data.set(VISITS, n)
    return n
}
storage/Visits.ktKotlin
package com.example.rubies.storage

object Visits {
    private const val KEY = "rubies.visits"   // shared by every mod: prefix it with the mod id

    fun of(player: Player): Int = player.data.getInt(KEY) ?: 0

    fun add(player: Player): Int = (of(player) + 1).also { player.data[KEY] = it }
}
CraftScript Kotlin / Java Ano ang ginagawa nito
data.set(k, v) o data[k] = v data[k] = v Nag-iimbak ng value (binubura ito ng null).
data[k] data[k] Nagbabasa ng value kung paano ito ini-imbak, o null.
data.get_int(k), get_number, get_string, get_boolean getInt(k), getNumber, getString, getBoolean Nagbabasa ng value ng ganoong type, o null kung wala.
data.remove(k), data.clear(), data.keys remove(k), clear(), keys Nagbubura ng key, nagbubura ng lahat, naglilista ng mga key.
  • Shared ng lahat ng mod ang mga key. Simulan ang bawat key sa id ng mod mo (rubies.visits) para hindi mo ma-overwrite ang mga key ng ibang mod.
  • Gaano ito katagal: nananatili sa player ang data ng player; nawawala ang data ng entity kapag namatay ito; nawawala ang data ng block kapag sinira ito ng player o pinalitan ito sa pamamagitan ng API.
  • Iniimbak bilang decimal ang mga numero; ibinabalik ng get_int ang mga ito bilang integer.
  • Ilagay ang mga key at ang mga function nila sa iisang file (lib/storage.craft, storage/ sa Kotlin): hindi kailangang malaman ng natitirang bahagi ng mod ang mga ito. Tingnan ang Pag-aayos ng mod.

Server

Miyembro Ano ang ginagawa nito
players, worlds, motd, tps, is_dedicated State ng server; ang tps ay ang average na tick bawat segundo (20 ang ideal).
player(name), world(id) Maghanap ng online na player o ng mundo.
broadcast(msg) Mensahe sa lahat.
stop() Nagse-save at pinapatigil ang server.
run_command(cmd) Emergency na labasan: nagpapatakbo ng command ng laro (tingnan sa ibaba).

Mga emergency na labasan

Dalawang function ang tumatanggap ng sariling format ng laro: run_command (run(…) sa CraftScript), na nagpapatakbo ng command ng laro, at summon(type, location, nbt), na gumagawa ng entity na may data sa internal na format ng laro. Para sa hindi pa sakop ng API ang mga ito, pero sa Minecraft ang mga format na iyon at puwedeng magbago sa bagong bersyon, kaya puwedeng masira ang mod na umaasa sa mga ito. Gamitin ang mga ito nang kaunti hangga't maaari at laging unahin ang API.

Walang gawa-gawa. Walang member ng API na nagre-return ng placeholder na value. Kung hindi gagana ang isang bagay sa larong tumatakbo, nagbibigay ito ng error na nagsasabi kung ano at bakit.