Перейти к содержанию

Кулинарная книга (рецепты)

Короткие готовые куски. Каждый — вставка в .fs-файл; команды не забудьте дублировать в plugin.yml.

При входе и выходе

on player join:
    broadcast sender-name() + " joined!"

on quit:
    broadcast sender-name() + " left."

Прощание с причиной смерти

on death:
    broadcast sender-name() + " died."
    #deaths = #deaths + 1

#deaths = #deaths + 1 упадёт для новичка (null + 1)! Добавьте выше: if #deaths is null: #deaths = 0. См. учебник 2.

Лечение себя и еда

command feed:
    heal 20
    message "Yum! (food setter есть только в Java-API: PlayerAccess.set)"

command healme:
    let me = sender()
    set-health(me, me.max-health)
    message "Healed."

Проверка прав без permission:

command vipkit:
    let me = sender()
    if has-permission(me, "shop.vip") == false:
        message "VIP only."
        stop
    give "DIAMOND" 5
    message "Enjoy!"

Телепорт к спавну мира

command spawn:
    teleport(0, 100, 0)
    message "Back to spawn."

Список онлайна одной строкой

command online:
    let names = ""
    for p in online-players():
        names = names + p + ", "
    message "Online: " + names

Конкатенация объектов

names + p превращает объект игрока в текст через toText. Получится что-то вроде CraftPlayer{name=Steve}, а не ник! Для ников нужен name(p): names = names + name(p) + ", ".

Правильный вариант:

command online:
    let names = ""
    for p in online-players():
        names = names + name(p) + ", "
    message "Online: " + names

Разбор строки по словам

let words = split("a b c", " ")
message first(words)     # "a"
message last(words)      # "c"
message size(words)      # 3 (размер списка)

size(x) / length(x) — размер списка, мапы или длина текста. first / last — пустой список даёт null.

Регистр и чистка ввода

let nick = trim(arg(2))
if lower(nick) == "admin":
    message "Nice try."

Случайность

command roll:
    let me = sender()
    let r = random(1, 6)
    message "Rolled: " + r
    if r == 6:
        give "GOLD_INGOT" 1

Одноаргументный random/1 тоже есть (диспетчер), но в командах используйте двухаргументный — он компилируется в прямой вызов.

Время суток

command day:
    set-time(6000)
    message "Set to noon."

command clock:
    message "Time: " + time()

time() — тики мира игрока события (вне контекста игрока — 0).

Титул победителю

command win:
    title("Victory!", sender-name() + " wins!")

Отмена урона себе

on damage:
    cancel-event
    message "You are protected."

Блок неделимого спавна (заглушка под координаты)

on place block:
    message "Block placed. (coords unavailable in DSL v1)"

Честно: координат блока в DSL v1 нет — только факт события. Не пишите проверки «если блок в регионе» — нечем сравнивать.

Счётчик убийств общий

$ kills = 0

Пробел после $?

Нет! $ kills — ошибка. Только $kills. Пробел допустим только вокруг операторов: $kills = $kills + 1.

$kills = 0

on death:
    $kills = $kills + 1
    broadcast "Total deaths: " + $kills + "."