API

Інтерфейс

Форми, які заповнює гравець, і елементи на екрані: смуги босів і бічна панель. Усе це працює для будь-якого клієнта, встановлено на ньому Crafting чи ні.

Форми

Форма має заголовок, основний текст, поля й кнопки. Ти оголошуєш її у файлі в ui/ і показуєш там, де потрібно (у команді, події, під час використання предмета):

ui/shop.craftCraftScript
import { give_rubies } from "/lib/rewards"

const SHOP = form("Ruby shop", {
    body: "Rubies cost 10 emeralds each.",
    fields: [
        { slider: "amount", label: "Rubies", min: 1, max: 16, default: 1 },
        { toggle: "gift", label: "Wrap as a gift" },
        { choice: "pouch", label: "Pouch", options: ["leather", "silk"] },
        { text: "note", label: "Note" }
    ],
    buttons: [{ id: "buy", label: "Buy" }, "cancel"]
})

fun open_shop(p: Player) {
    p.show_form(SHOP, fun(r) {
        if r.button != "buy" { return }                  // closed with Esc or cancelled
        let n = int(r.number("amount") ?? 1)
        if p.inventory.count("minecraft:emerald") < n * 10 { p.send("&cNot enough emeralds"); return }
        give_rubies(p, n)
        if r.toggle("gift") { p.send("&dWrapped in {r.choice("pouch")}: {r.text("note")}") }
    })
}
commands/shop.craftCraftScript
import { open_shop } from "/ui/shop"

command shop describe "Buy rubies" {
    if player == null { return "Players only" }
    open_shop(player)
}
Поле Як записати Як прочитати
Текст { text: "note", label: "Note", default: "" } r.text("note")
Перемикач { toggle: "gift", label: "It's a gift", default: false } r.toggle("gift")
Повзунок { slider: "amount", label: "Amount", min: 1, max: 64, step: 1, default: 8 } r.number("amount")
Вибір { choice: "color", label: "Color", options: ["red", "blue"], default: "red" } r.choice("color")
  • Ключ кожного поля складається з малих літер, цифр і _. label — те, що бачить гравець; якщо його немає, використовується ключ.
  • buttons — список { id, label } або просто id. Форма без кнопок отримує кнопку «OK».
  • У відповіді r.button — id натиснутої кнопки або null, якщо гравець закрив форму (Esc). r.values — мапа з усіма полями.
  • Відповідь надходить у функцію, яку ти передаєш у show_form; решта сервера працює далі, поки гравець вирішує.

У Kotlin

ui/ShopForm.ktKotlin
package com.example.rubies.ui

object ShopForm {
    private val form = Form("Ruby shop").apply {
        body = "Rubies cost 10 emeralds each."
        slider("amount", "Rubies", 1.0, 16.0, default = 1.0)
        toggle("gift", "Wrap as a gift")
        choice("pouch", "Pouch", listOf("leather", "silk"))
        text("note", "Note")
        button("buy", "Buy")
        button("cancel", "Cancel")
    }

    fun show(player: Player) = player.showForm(form) { r ->
        if (r.button != "buy") return@showForm                 // closed with Esc or cancelled
        val n = (r.number("amount") ?: 1.0).toInt()
        if (player.inventory.count(Identifier.parse("minecraft:emerald")) < n * 10) { player.send("&cNot enough emeralds"); return@showForm }
        player.give(ItemStack.of(Items.RUBY, n))
        if (r.toggle("gift") == true) player.send("&dWrapped in ${r.choice("pouch")}: ${r.text("note")}")
    }
}

Form(title) з body, text(key, label, default, maxLength), toggle(key, label, default), slider(key, label, min, max, step, default), choice(key, label, options, default) і button(id, label). player.showForm(form) { r -> … } отримує FormResponse з button, values і text, toggle, number, choice.

Смуги босів

Смуга вгорі екрана із заголовком, кольором, прогресом і стилем. Використовуй її для таймера, серверної події або здоров’я чогось:

events/countdown.craftCraftScript
const TIMER = server.boss_bar("rubies:countdown", "&cРубінова лихоманка", "red", "segments_10")
let left = 60

on join { TIMER.show(player) }

every 1 second {
    left = max(0, left - 1)
    TIMER.progress = left / 60
    TIMER.title = "&cРубінова лихоманка: {left} с"
    if left == 0 { TIMER.remove() }
}
Член Що робить
server.boss_bar(id, title?, color?, style?) Створює смугу або повертає наявну з цим id. Один id на смугу: перезавантаження мода її не дублює.
bar.progress Від 0 до 1.
bar.title Текст із кольорами через &.
bar.color pink, blue, red, green, yellow, purple, white.
bar.style solid, segments_6, segments_10, segments_12, segments_20.
bar.show(player), bar.hide(player) Хто її бачить. bar.players їх перелічує.
bar.remove() Прибирає її для всіх і звільняє id.

У Kotlin: Crafting.server?.bossBar("rubies:countdown", "Time", BarColor.RED, BarStyle.SEGMENTS_10), з тими самими властивостями в camelCase.

Бічна панель

Список до 15 рядків праворуч на екрані, свій для кожного гравця. Виклич її знову, щоб оновити:

events/welcome.craftCraftScript
import { visits } from "/lib/storage"

on join {
    player.set_sidebar("&6Рубіни", [
        "&fВізити: &e{visits(player)}",
        "&fРубіни: &c{player.inventory.count("rubies:ruby")}"
    ])
}
  • player.set_sidebar(title, lines) показує або оновлює її; бачить її лише цей гравець. Кольори через &.
  • player.clear_sidebar() прибирає її.
  • У Kotlin: player.setSidebar(title, lines) і player.clearSidebar().

Клавіші мода

Мод може додавати власні клавіші. Їх оголошують через key, а реагують через on key, який виконується на сервері для гравця, що натиснув клавішу. e.key — це id з простором імен мода (dashmod:dash).

content/keys.craftCraftScript
key "dash" { label: "Dash", default: "R" }
key "heal" { label: "Second wind", default: "G" }

on key(e) {
    let p = e.player
    if e.key == "dashmod:dash" && !p.has_cooldown("minecraft:feather") {
        let d = p.direction
        p.velocity = vector(d.x * 1.6, 0.35, d.z * 1.6)
        p.set_cooldown("minecraft:feather", 2)
    }
    if e.key == "dashmod:heal" { p.heal(6) }
}

Клавіші з'являються в Налаштування > Керування > Прив'язка клавіш, у розділі з назвою мода. Гравці можуть їх змінювати, і їхній вибір зберігається. default — назва клавіші, наприклад "R", "G", "F6" або "LEFT_ALT".

Щоб клавіші були доступні, у гравців у грі має бути встановлений Crafting. У Kotlin: ContentBuilder.key("dash", label = "Dash", default = "R") і Crafting.events.on<PlayerKeyEvent> { e -> … }.

Варто знати

  • Форми, смуги й бічну панель бачить будь-який клієнт Minecraft Java 26.3, з Crafting чи без. Серверний мод може ними користуватися, і нікому нічого не треба встановлювати.
  • Заголовки, панель дій і повідомлення в чаті описано на сторінці Світ і гравці.
  • Власних екранів із власною розміткою (меню, інвентарі механізмів) поки немає; дивись дорожню карту.