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):
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")}") }
})
}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
_.labelist, was der Spieler sieht. Fehlt es, wird der Schlüssel benutzt. buttonsist eine Liste von{ id, label }oder nur IDs. Ein Formular ohne Knöpfe bekommt einen „OK“-Knopf.- In der Antwort ist
r.buttondie ID des gedrückten Knopfs odernull, wenn der Spieler das Formular geschlossen hat (Esc).r.valuesist 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
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:
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:
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)undplayer.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).
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.