Операторы и выражения (statements)¶
Объявление локала и присваивание¶
let total = 0
total = total + loop-index
total += 5
list[0] = "first"
victim.health = 20
let name = <выражение>— явное объявление локала (=обязателен).- Обычное и составное присваивание:
= += -= *= /= %=. - Цели: локал,
$глобал,#player-переменная,list[i]/map[key]и свойства игрока (victim.health = 20пишется черезPlayerAccess.set). - Постфикс-инкремент:
i++,i--(и префиксные++x,--x).
Ветвления¶
if victim is null:
message "Nobody here."
stop
else / else if поддерживаются, пустая строка между ветками разрешена:
if n < 2:
return n
else if n < 10:
return n * 2
else:
return -1
Циклы¶
while i > 0:
result = result + i + ","
i = i - 1
loop n times:
total = total + loop-index
for friend in online-players():
message "Online: " + friend
while <условие>:— классический цикл.loop <N> times:— ровно N итераций (timesможно опустить);loop-index— номер итерации с нуля. Лимит и индекс хранятся в разных JVM-слотах (старый баг «цикл выполняется один раз» был именно здесь).for <var> in <список>:— источник обязан быть списком (Values.toList).break/continue— только внутри цикла, иначе ошибка компиляции.
Управление выполнением¶
| Стейтмент | Действие |
|---|---|
stop |
Остановить обработчик (в функции — тоже выход) |
return [expr] |
Вернуть значение из функции |
cancel-event |
Эффект: отменить Bukkit-событие (если отменяемое) |
Эффекты: вызовы без скобок¶
Эффекты можно писать в «голой» форме — имя + аргументы через пробел/запятую:
message "Healing " + target
give "DIAMOND" 3
log "FastScript routines are ready."
Эквивалент со скобками (message("hi")) тоже работает. Правило разбора:
имя + начало нового выражения на той же строке (текст, число, переменная,
true/false/null/not) = эффект; имя + ... с оператором = выражение.
Отрицательные bare-аргументы пишите в скобках: damage(-5).
Тернарник¶
message "You are " + (victim is null ? "nobody" : victim)
Приоритет: ?: ниже всего, ветви — полные выражения.