Плагин [ADMN/DEV/FUN] VarScript 1.2 - Пишем скрипты на Groovy

Дрон сделал новую возможность - сохранять книги в файл .book
Это очень хорошо, так как при сохранении книги и ее повторной загрузке книга не теряет своих свойств.
Это дает идеи:
- для продажи заклинаний-свитков (уже заряженных, без участия админов)
- главное (!) обмена спеллами и скриптами прямо в книгах между администраторами.

Посему предлагаю в этой теме (либо на сайте дрона, как он захочет) основать репозиторий скриптов в формате .book

Идейно?

UPD: рб не дает грузить книги в формате .book ... Но можно обмениваться ими еще где-нибудь...
 
Мьсе, замечательный плагин. Сам не пробывал, но думаю сделать небольшой ивентсервер с участием плагиина. Хорошо бы было увидеть документацию по плагину....
Документация будет, но боюсь, что не скоро. Думаю создать вики.
Как будет готово хотя бы частично, напишу в теме.
Сейчас занимаюсь разработкой скрипта Infection и функционала планировщика.
Также искореняю баги (прям десятками за раз, ибо было некогда тестить каждую команду)
 
Итак, что планируется в новой версии:
1. Новый метод обработки событий​
Раньше обработка событий производилась в асинхронном потоке, а само событие "ставилось на паузу". По этой причине внутри функции - обработчика события было ограничение на использование Bukkit API. Теперь события будут обрабатываться в том же потоке, что дает полную свободу действий.​
2. Отказ от расширения списка синтаксисов.​
Синтаксис будет один. И точка.​
3. Самое вкусное: Планировщик!​
Вот принцип работы:​
Планировщик содержит задания.​
Задания хранятся в yml файлах.​
Задание состоит из трех частей: событие, условие, действие.​
Событие: может означать событие из Bukkit API или же событие по времени в формате cron​
Условие: проверяет часть информации о событии. если выполнилось - запускает действие.​
Действие: выполняет скрипт на синтаксисе Varscript или же запускает скрипт из файла.​
За основу обработки формата cron взята библиотека cron4j​
Пример yml файла:
YAML:
name: Kick me!
enabled: true
event:
  - EVENT PlayerJoin
  - CRON */5 * * * *
condition:
  - NAME = "DPOHVAR" OR NAME = "DPOH"
  - TIME AFTER "19:00"
  - TIME BEFORE "21:00"
action:
  - FILE some_actions.var
  - FILEBIN some_actions.bin
  - VARSCRIPT EVENT(PLAYER) DUP NULL = ! IF "отдыхай" KICK THEN

Пока что все перечисленное находится в состоянии написания.
 
DPOH-VAR,
гениально! те кто пользовался nnCron - однозначно полюбят твой плагин!
 
[Varscript 0.4]
Прототип готов.
К сожалению, пока что поддерживает небольшое число событий (со временем добавлю остальные).
Особенности:
  • скрипты не создают собственные потоки (если не задано), а используют основной поток сервера
  • все команды изменены
  • Scheduler
Вот список всех команд:
YAML:
vsfile:
        description: read file to buffer
        usage: /vsfile <filename>
        permission: varscript.file
        aliases: '>f'
    vsurl:
        description: read url to buffer
        usage: /vsurl <url>
        permission: varscript.url
        aliases: '>u'
    vsbook:
        description: read book contents to buffer
        usage: /vsbook
        permission: varscript.url
        aliases: '>b'
    vssign:
        description: read sign contents to buffer
        usage: /vssign (then right-click to sign)
        permission: varscript.sign
        aliases: '>s'
    vscopy:
        description: copy text to buffer
        usage: /vscopy [text]
        permission: varscript.copy
        aliases: '>c'
    vsfilebin:
        description: read binary file to buffer
        usage: /vsfilebin <file>
        permission: varscript.filebin
        aliases: '>fb'
    vsurlbin:
        description: read binary contents of url to buffer
        usage: /vsurlbin <url>
        permission: varscript.urlbin
        aliases: '>ub'
    vswfile:
        description: write buffer to file
        usage: /vswfile <file>
        permission: varscript.wfile
        aliases: '>wf'
    vswbook:
        description: write buffer to book in your hand
        usage: /vswbook
        permission: varscript.wfile
        aliases: '>wb'
    vswbook:
        description: write buffer to book in your hand
        usage: /vswbook
        permission: varscript.wfile
        aliases: '>wb'
    vswsign:
        description: write buffer to selected sign
        usage: /vswsign (then right-click to sign)
        permission: varscript.wsign
        aliases: '>ws'
    vswfilebin:
        description: write buffer to file in binary mode
        usage: /vswfilebin <file>
        permission: varscript.wfilebin
        aliases: '>wfb'
    vswfilecmp:
        description: compile text file and write to binary file
        usage: /vswfilecmp <file>
        permission: varscript.vswfilecmp
        aliases: '>wff'
    vswnewsign:
        description: write buffer to new sign
        usage: /vswnewsign (then place chain of signs)
        permission: varscript.wnewsign
        aliases: '>wn'
    vsrun:
        description: compile and execute script
        usage: /vsrun <script>
        permission: varscript.run
        aliases: '>'
    vscmprun:
        description: compile buffer and execute
        usage: /vscmprun
        permission: varscript.cmprun
        aliases: '>>'
    vsrunbin:
        description: execute bytes from buffer
        usage: /vsrunbin
        permission: varscript.runbin
        aliases: '>>b'
    vsrunfile:
        description: compile file and execute
        usage: /vsrunfile <file>
        permission: varscript.runfile
        aliases: '>>f'
    vsrunfilebin:
        description: execute bytes from file
        usage: /vsrunfilebin <file>
        permission: varscript.runfilebin
        aliases: '>>fb'
    vsrunurl:
        description: compile url and execute
        usage: /vsrunurl <url>
        permission: varscript.runurl
        aliases: '>>u'
    vsrunurlbin:
        description: execute bytes from url
        usage: /vsrunurlbin <url>
        permission: varscript.runurlbin
        aliases: '>>ub'
    vscmp:
        description: compile buffer
        usage: /vscmp
        permission: varscript.cmp
        aliases: '>cmp'
    vscmpfile:
        description: compile file and write bytes to buffer
        usage: /vscmpfile <file>
        permission: varscript.cmpfile
        aliases: '>cmpf'
    vscmpurl:
        description: compile url and write bytes to buffer
        usage: /vscmpur <url>
        permission: varscript.cmpurl
        aliases: '>cmpu'
    vspaste:
        description: print buffer
        usage: /vspaste
        permission: varscript.paste
        aliases: '>p'
    vslen:
        description: print buffer length
        usage: /vslen
        permission: varscript.len
        aliases: '>l'
    vshex:
        description: print buffer in hex mode
        usage: /vshex
        permission: varscript.hex
        aliases: '>h'
    vssavebook:
        description: save book to file
        usage: /vssavebook <filename>
        permission: varscript.savebook
        aliases: '>sb'
    vsloadbook:
        description: load book from file
        usage: /vsloadbook <filename>
        permission: varscript.loadbook
        aliases: '>lb'
    vsvalidbook:
        description: validate book
        usage: /vsvalidbook
        permission: varscript.validbook
        aliases: '>vb'
    vsvalidsign:
        description: validate selected sign
        usage: /vsvalidsign (then right-click to sign)
        permission: varscript.validsign
        aliases: '>vs'
    vsbookflag:
        description: set book flags
        usage: /vsbookflag <flags>
        permission: varscript.bookflag
        aliases: '>bf'
    vssignflag:
        description: set sign flags
        usage: /vssignflag <flags>
        permission: varscript.signflag
        aliases: '>sf'
    vsconfig:
        description: read config
        usage: /vsconfig <option>
        permission: varscript.config
        aliases: '>conf'
    vssetconfig:
        description: read config
        usage: /vssetconfig <option> <value>
        permission: varscript.setconfig
        aliases: '>setconf'
    vsoperand:
        description: get help for operand
        usage: /vsoperand [operand]
        permission: varscript.operand
        aliases: '>o'
    vstag:
        description: view operands with tag
        usage: /vstag [tag]
        permission: varscript.tag
        aliases: '>t'
    vsevent:
        description: view help with event
        usage: /vsevent [event]
        permission: varscript.event
        aliases: '>e'
    task:
        description: varscript task commands
        usage: /task <name> (view|rename <name>|enable|disable|remove|(action|condition|event) <add [task]|remove <id>|edit <id> [task]>)
        permission: varscript.task
        aliases: '>:'
    scheduler:
        description: varscript scheduler commands
        usage: /scheduler (enable|disable|reload|cron (enable|disable)|newtask <name> [description])
        permission: varscript.scheduler
        aliases: '>sch'
Планировщик:
при запуске, планировщик ищет yml файлы в директории /plugins/varcript/tasks/ и считывает данные.​
Включение/выключение планировщика:​
/scheduler enable/disable​
Включение/выключение компонента cron:​
/scheduler cron enable/disable​
Обновить задачи (при редактировании файлов вручную):​
/scheduler reload​
Создание новой задачи для планировщика:​
/scheduler newtask название описание задачи​
будет создана новая пустая задача и соответствующий yml файл​
Список задач:​
/task​
красные - отключены. зеленые - активны.​
Посмотреть задачу:​
/task название​
Удалить задачу​
/task название remove​
Включить/отключить:​
/task название enable/disable​
Перезагрузить задачу из файла:​
/task название reload​
Посмотреть события:​
/task название event​
Посмотреть условия:​
/task название condition​
Посмотреть действия:
/task название action​
Редактировать события:​
/task название event add событие​
/task название event remove индекс(начиная с 0)​
/task название event edit индекс событие​
Редактировать условия и действия - аналогично​
Пока что есть два варианта событий:​
1) события cron. пишем "CRON выражение" пример события, повторяющегося каждые 15 минут:​
CRON */15 * * * *​
2) события bukkit. пищем "BUKKIT событие", где событие - название класса или название события из списка. примеры:​
BUKKIT PHYSIC​
BUKKIT BlockBreak​
список поддерживаемых событий можно посмотреть с помощью команды /vsevent​
Условия:​
раздел в разработке. Но пока что работает в таком режиме:​
строка условия представляет из себя скрипт, который должен оставить в стеке булево выражение. Пример:​
EVENT(PLAYER) OP​
условие проверяет, является ли игрок опом.​
Действия:​
1) скрипт. пишем "SCRIPT наш скрипт". вот пример:​
SCRIPT EVENT(PLAYER) KILL​
убьет игрока, который вызвал событие.​
2) скрипт из файла, пишем "FILE имя файла"​
3) байт-код из файла пишем "FILEBIN имя файла"​
Файлы скриптов и бинарники:​
теперь файлы хранятся в директории /plugins/varscript/scripts​
имя файла указывается только латиницей, без расширения, директории разделяются точкой.​
например: файл "games.helljump"​
скрипт будет содержаться в файле /plugins/varscript/scripts/games/helljump.var​
байт-код (при компиляции или записи) в файле /plugins/varscript/scripts/games/helljump.bin​
Вроде пока что все. В случае чего дополню пост.
PS:
MYXOMOPX, реквестирую пример!
PS2:
Все задания проще всего редактировать в yaml-файлах.
Сохраняем файлы в кодировке UTF-8!!!
после редактирования задачи делаем перезагрузку этой задачи или же планировщика.
 
Сейчас балуюсь с NBT-редактором. Тесты проходят успешно.
Можно изменять или считывать NBT-теги прям в игре с помощью текстовых запросов.
Например для книг: "pages[3]", "Author" или "display.Name".
С удалением тега пока проблемы, приходится использовать рефлексии для удаления элемента из массива.
Как только он будет готов и пройдет тесты, я выложу обновленную версию плагина в этой теме.
 
  • Нравится
Реакции: ufes
Планы на будущее:
1) Сделать вики. Думаю, что это самое необходимое для плагина.
Поставил докувики, пишу туториалы, но это займет очень много времени. Поэтому призываю всех, кто хочет помочь, принять участие в заполнении
http://diggers.no-ip.org/wiki/doku.php?id=varscript:tutorials

2) Была интересная идея выполнять скрипты, написанные в книгах. Но чем другие предметы - не книги? Проще говоря, любой предмет может иметь совершенно любые NBT-теги, и они сохраняются вместе с предметом, что бы вы с ним не делали (за исключением крафта).
Думаю, в следующей версии появится возможность добавлять программы в любой предмет.

3) Интегрировать NBT-редактор. Функционал будет взят отсюда, но в виде скриптовых команд. Сам плагин PowerNBT не потребуется.

4) Сохранение и загрузка не только книг, но и любых предметов.
Недавно нашел в исходниках net.minecraft.server удобное средство для сохранения в файл и загрузки NBT-тегов. Теперь файлы будут храниться в виде gzipнутых тегов предметов. Старый убогий формат .book больше поддерживаться не будет. Можно будет сохранить и предметы-с-программами

5) Vault API
Этот план лежит в очень долгом ящике, хотя наработки уже есть. Возможно будет реализован через несколько обновлений.
 
Планы на будущее:
2) Была интересная идея выполнять скрипты, написанные в книгах. Но чем другие предметы - не книги? Проще говоря, любой предмет может иметь совершенно любые NBT-теги, и они сохраняются вместе с предметом, что бы вы с ним не делали (за исключением крафта).
Думаю, в следующей версии появится возможность добавлять программы в любой предмет.

А ведь действительно! Это было бы отлично. Соответственно можно будет реализовывать разные "мечи-кладенцы" :)

5) Vault API
Этот план лежит в очень долгом ящике, хотя наработки уже есть. Возможно будет реализован через несколько обновлений.

А что планируешь? На мой взгляд одна из нужных и важных функций - поддержка групп пермишенов. Часто возникает необходимость при наступлении какого-то события выдать определенную группу, а через какое-то время (или опять же при наступлении события) - убрать.
 
А что планируешь? На мой взгляд одна из нужных и важных функций - поддержка групп пермишенов. Часто возникает необходимость при наступлении какого-то события выдать определенную группу, а через какое-то время (или опять же при наступлении события) - убрать.
Для добавления API Vault нужно много-много писать. Я еще со школьных диктантов это не люблю.
Сложнее всего сделать NBT редактор (хотя по сути я его уже сделал) - хбз как его включить в текущий синтаксис.
 
Admin , разработчика!
 
Последнее редактирование модератором:
Вот, что из этого вышло
Вот вам тысяча видов оружия для сервера ^_^
Может еще и броню сделать кастомную? Например, чтоб можно было сделать скрипт:
при атаке игрока игрока с такой броней атакующему наносится 20% урона.
или шанс 5% отразить урон.
или узы эмпатии,
или телепортация как у эндермана,
или например если такая броня на зомбяке, того можно убить только особенным оружием,
или предлагайте свои варианты)

И еще: предметы можно сохранять в файл, причем это мог бы быть и не меч, а любой другой предмет. Можно понаделать разных айтемов и продавать игрокам.

Теперь что было на видео:
/>c EVENT(ENTITY) BOLT - мы просто копируем скрипт в буфер
скрипт: взять из события энтити(которого атаковали) и ударить молнией.
/>wi - пишем из буфера в предмет
/>if rD - добавляем предмету флаги r и D
флаг r - означает, что скрипт написан в виде текста
флаг D - нужно исполнять его при событии Damage
есть и другие флаги, которые отвечают за крафт предмета, клик по блоку, пикап, дроп, и др.

Переименование предмета - уже другим плагином. хотя можно было бы сделать и этим.
 
  • Нравится
Реакции: ufes
Посему предлагаю в этой теме (либо на сайте дрона, как он захочет) основать репозиторий скриптов в формате .book
Думаю, будет репозиторий файлов в формате .item
Как только я определюсь с тем, в каком формате хранить данные программы внутри предмета.
Старый вариант уже не нравится: хочу, чтобы можно было добавить несколько программ в один предмет (я отчасти перфекционист)
 
Думаю в скором времени ни один РПГ сервер не обойдется без кастомных итемов :3 ну или сервера без таких итемов станут менее популярны

P.S. Про броню хорошая идея
 
не знаю где спросить, я пытаюсь предмет из руки одеть на голову, пишу:
/> ME ITEMINHAND SETHELMET
пишет как я понял что чего-то в стаке не хватает... а чего? не понятно.
/> ME ME SETHELMET
/> ME DUP SETHELMET
/> ME ME ITEMINHAND SETHELMET
/> ME ME >HLM
выбирайте любой.

UPD:
ME - кому
ME ITEMINHAND - взять то, что у МЕНЯ в РУКЕ
SETHELMET - одеть на голову.
в итоге получаем ME ME ITEMINHAND SETHELMET
с таким же успехом слово ME можно заменить на чей-нибудь ник (в кавычках)
 
хочу с блоком стекла на голове дышать под водой!
/> ME 20 SETITEMINHAND "\caШлем водолаза" SETITEMNAME ... ME ME SETHELMET а вот что в пропуске? под водой здорово смотрится, прям как скафандр)))
 
хочу с блоком стекла на голове дышать под водой!
/> ME 20 SETITEMINHAND "\caШлем водолаза" SETITEMNAME ... ME ME SETHELMET а вот что в пропуске? под водой здорово смотрится, прям как скафандр)))
Скорее всего нужно так: /> ^GLASS "\caШлем водолаза" SETITEMNAME ME SWAP SETHELMET
Для переименования предмета в руке я бы советовал этот плагин (удобнее).
К следующей версии я добавлю его API в варскрипт.
 
Назад
Верх