VarScriptTest 0.5.0.B
Добавлено:
- Создание потоков, управление ими
- Команды WAIT, TICKS, REGISTER, REGISTERPRIORITY, RETURN, STOP, END, FINISH, SLEEP, WAKEUP, команды для компиляции кода из файла и др.
Как со всем этим обращаться:
WAIT
Обычная команда, чтобы подождать сколько-то секунд.
Пример:
"Now" PRINT
10.5 WAIT
"10.5 sec later" PRINT
Код, который исполняется после этой команды, работает асинхронно, т.е. вполне возможен ConcurrentModificationException. Зато не так страшно загнать программу в бесконечный цикл.
TICKS
Аналогично предыдущему, но ждет сколько-то игровых тиков.
После этой команды дальнейшее исполнение происходит в главном потоке. Можно не бояться за ConcurrentModification.
RETURN
Завершить функцию.
STOP
Завершить указанный поток.
Пример:
@someThread STOP
THREAD
Положить в стек текущий поток
PS: команды
THREAD STOP
не остановят текущий поток, а только пометят его как завершенный. Исполнение дойдет до конца или до следующего WAIT, TICKS. Чтобы избежать этого - см. команду ниже.
FINISH
Остановить текущий поток. Исполнение прекращается неменденно
END
Остановить текущую программу. Останавливаются все потоки, программа считается завершенной
START
Запустить функцию в новом потоке.
Пример:
{ 1 WAIT "This is new thread" PRINT } START %%subThread
Команда принимает из стека функцию, а кладет в него созданный поток.
SLEEP
Поставить поток на паузу.
WAKEUP
Продолжить тот поток, который стоит на паузе. Сложный пример:
%Func1{ ## создаем функцию Func1
5 WAIT ## которая подождет 5 секунд
@mainThread WAKEUP ## и завершит главный поток
## на этом моменте завершится поток subThread
}
THREAD %%mainThread ## записываем главный поток в переменную
@Func1 START %%subThread ## запуск Func1 в новом потоке
"Let's sleep" PRINT ## [varscript] Let's sleep
SLEEP ## ставим главный поток на паузу
"awaken" PRINT ## [varscript] awaken
REGISTER
Регистрирует новый обработчик события
Вход: функция, тип события.
Выход: триггер
Пример:
%Listener{ ## создаем функцию-обработчик события
## подменяем сообщение на капс
@Evеnt:getMessage:toUpperCase @Evеnt:setMessage
}
@Listener "PlayerChatEvent" REGISTER %%trigger ## регистрируем событие
"CAPS IN CHAT!!!" PRINT ## [varscript] CAPS IN CHAT!!!
30 WAIT ## ждем 30 секунд
@trigger:unregister ## отключаем триггер события
"Just kidding =)" PRINT ## [varscript] Just kidding =)
В примере выше @Evеnt написано с ошибкой (специально)
тип события указывается в виде текста
либо полное название класса события "org.bukkit.event.player.PlayerChatEvent"
либо сокращенное "PlayerChatEvent", "PlayerChat" - работает только для стандартных событий.
REGISTERPRIORITY
аналогично предыдущему,
Вход: функция, тип события, приоритет
приоритет можно указать числом или текстом "NORMAL", "HIGH" и т.д.
Загрузка функции из файла
Команда для считывания функции из файла: @*имяфайла
Чтобы считать и запустить: *имяфайла
Файлы располагаются в директории плагина /scripts/%язык%/
Сначала ищется файл среди /scripts/vsbin/имяфайла.bin
если не найден, то /scripts/vs/имяфайла.vs
Пример:
файл /scripts/vs/SetFullHp.vs
TOENTITY %%e
@e:getMaxHealth @e:setHealth
Команды:
/> ME *SetFullHp
/> "PlayerName" *SetFullHp
Упс, команда TOENTITY не работает

Рабочий Пример:
ставим и запускаем плагин
пишем в чат /> *DamageInfo
бьем кого-нибудь
На протяжении 10 секунд в чат будет отображаться информация о нанесенном уроне.
UPD:
Обратиться к другим плагинам можно по имени как к переменной.
Например: @WorldEdit
А дальше - делаем что хотим.