API

Oberfläche

Formulare, die der Spieler ausfüllt, und Bildschirmelemente: Bossleisten und eine Seitenleiste. Alles davon funktioniert mit jedem Client, ob er Crafting installiert hat oder nicht.

Formulare

Ein Formular hat einen Titel, einen Text, Felder und Knöpfe. Du deklarierst es in einer Datei unter ui/ und zeigst es, wo du es brauchst (ein Befehl, ein Event, beim Benutzen eines Gegenstands):

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)
}
Feld Geschrieben als Gelesen mit
Text { text: "note", label: "Notiz", default: "" } r.text("note")
Schalter { toggle: "gift", label: "Es ist ein Geschenk", default: false } r.toggle("gift")
Schieberegler { slider: "amount", label: "Menge", min: 1, max: 64, step: 1, default: 8 } r.number("amount")
Auswahl { choice: "color", label: "Farbe", options: ["red", "blue"], default: "red" } r.choice("color")
  • Jeder Feldschlüssel nutzt Kleinbuchstaben, Ziffern und _. label ist, was der Spieler sieht. Fehlt es, wird der Schlüssel benutzt.
  • buttons ist eine Liste von { id, label } oder nur IDs. Ein Formular ohne Knöpfe bekommt einen „OK“-Knopf.
  • In der Antwort ist r.button die ID des gedrückten Knopfs oder null, wenn der Spieler das Formular geschlossen hat (Esc). r.values ist eine Map mit allen Feldern.
  • Die Antwort kommt in der Funktion an, die du an show_form übergibst. Der Rest des Servers läuft weiter, während der Spieler sich entscheidet.

In 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) mit body, text(key, label, default, maxLength), toggle(key, label, default), slider(key, label, min, max, step, default), choice(key, label, options, default) und button(id, label). player.showForm(form) { r -> … } bekommt eine FormResponse mit button, values und text, toggle, number, choice.

Bossleisten

Eine Leiste oben am Bildschirm, mit Titel, Farbe, Fortschritt und Stil. Nutze sie für einen Timer, ein Server-Event oder die Gesundheit von etwas:

events/countdown.craftCraftScript
const TIMER = server.boss_bar("rubies:countdown", "&cRubinrausch", "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 = "&cRubinrausch: {left}s"
    if left == 0 { TIMER.remove() }
}
Member Was es macht
server.boss_bar(id, title?, color?, style?) Erstellt die Leiste oder gibt die vorhandene mit dieser ID zurück. Eine ID pro Leiste: Neuladen der Mod verdoppelt sie nicht.
bar.progress Von 0 bis 1.
bar.title Der Text, mit &-Farben.
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) Wer sie sieht. bar.players listet sie auf.
bar.remove() Entfernt sie für alle und gibt die ID frei.

In Kotlin: Crafting.server?.bossBar("rubies:countdown", "Time", BarColor.RED, BarStyle.SEGMENTS_10), mit denselben Eigenschaften in camelCase.

Seitenleiste

Eine Liste mit bis zu 15 Zeilen am rechten Bildschirmrand, für jeden Spieler anders. Ruf sie erneut auf, um sie zu aktualisieren:

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

on join {
    player.set_sidebar("&6Rubine", [
        "&fBesuche: &e{visits(player)}",
        "&fRubine: &c{player.inventory.count("rubies:ruby")}"
    ])
}
  • player.set_sidebar(title, lines) zeigt oder aktualisiert sie, nur dieser Spieler sieht sie. Farben mit &.
  • player.clear_sidebar() entfernt sie.
  • In Kotlin: player.setSidebar(title, lines) und player.clearSidebar().

Tasten einer Mod

Eine Mod kann eigene Tasten hinzufügen. Man deklariert sie mit key und reagiert mit on key, das auf dem Server für den Spieler läuft, der sie gedrückt hat. e.key ist die Id mit dem Namespace der Mod (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) }
}

Die Tasten erscheinen unter Optionen > Steuerung > Tastenbelegung, in einem Abschnitt mit dem Namen der Mod. Spieler können sie ändern, und ihre Wahl bleibt erhalten. default ist ein Tastenname wie "R", "G", "F6" oder "LEFT_ALT".

Spieler brauchen Crafting in ihrem Spiel, um die Tasten zu haben. In Kotlin: ContentBuilder.key("dash", label = "Dash", default = "R") und Crafting.events.on<PlayerKeyEvent> { e -> … }.

Gut zu wissen

  • Formulare, Leisten und die Seitenleiste sind für jeden Client von Minecraft Java 26.3 sichtbar, mit oder ohne Crafting. Eine Server-Mod kann sie nutzen, ohne dass jemand etwas installiert.
  • Titel, die Aktionsleiste und Chatnachrichten stehen in Die Welt und die Spieler.
  • Eigene Bildschirme mit eigenem Layout (Menüs, Inventare von Maschinen) gibt es noch nicht, siehe die Roadmap.