1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

Тема в разделе "Релизы плагинов", создана пользователем DPOH-VAR, 29 сен 2012.

  1. voldemarich

    voldemarich Активный участник Пользователь

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

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

    Идейно?

    UPD: рб не дает грузить книги в формате .book ... Но можно обмениваться ими еще где-нибудь...
     
    stew и DPOH-VAR нравится это.
  2. Автор темы
    DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Баллы:
    153
    Skype:
    dpohvar
    Документация будет, но боюсь, что не скоро. Думаю создать вики.
    Как будет готово хотя бы частично, напишу в теме.
    Сейчас занимаюсь разработкой скрипта Infection и функционала планировщика.
    Также искореняю баги (прям десятками за раз, ибо было некогда тестить каждую команду)
     
    stew, PedrO, MYXOMOPX и ещё 1-му нравится это.
  3. Автор темы
    DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Баллы:
    153
    Skype:
    dpohvar
    Итак, что планируется в новой версии:
    1. Новый метод обработки событий​
    Раньше обработка событий производилась в асинхронном потоке, а само событие "ставилось на паузу". По этой причине внутри функции - обработчика события было ограничение на использование Bukkit API. Теперь события будут обрабатываться в том же потоке, что дает полную свободу действий.​
    2. Отказ от расширения списка синтаксисов.​
    Синтаксис будет один. И точка.​
    3. Самое вкусное: Планировщик!
    Вот принцип работы:​
    Планировщик содержит задания.​
    Задания хранятся в yml файлах.​
    Задание состоит из трех частей: событие, условие, действие.​
    Событие: может означать событие из Bukkit API или же событие по времени в формате cron​
    Условие: проверяет часть информации о событии. если выполнилось - запускает действие.​
    Действие: выполняет скрипт на синтаксисе Varscript или же запускает скрипт из файла.​
    За основу обработки формата cron взята библиотека cron4j
    Пример yml файла:
    Код:
    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

    Пока что все перечисленное находится в состоянии написания.
     
  4. fromgate

    fromgate Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    DPOH-VAR,
    гениально! те кто пользовался nnCron - однозначно полюбят твой плагин!
     
  5. Автор темы
    DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Баллы:
    153
    Skype:
    dpohvar
    [Varscript 0.4]
    Прототип готов.
    К сожалению, пока что поддерживает небольшое число событий (со временем добавлю остальные).
    Особенности:
    • скрипты не создают собственные потоки (если не задано), а используют основной поток сервера
    • все команды изменены
    • Scheduler
    Вот список всех команд:
    Код:
    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!!!
    после редактирования задачи делаем перезагрузку этой задачи или же планировщика.
     
    PedrO, MYXOMOPX и ITrAnEI нравится это.
  6. MYXOMOPX

    MYXOMOPX Активный участник Пользователь

    Баллы:
    78
    Skype:
    MYXOMOPX
    Имя в Minecraft:
    MYXOMOPX
     
    stew, Sergey95, ufes и 3 другим нравится это.
  7. fromgate

    fromgate Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    DPOH-VAR, это наверное один из самых гениальных плагинов. Жду-не-дождусь, когда ты решишь, что он уже "завершен".
     
    MYXOMOPX, ufes, PedrO и ещё 1-му нравится это.
  8. Автор темы
    DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Баллы:
    153
    Skype:
    dpohvar
    Сейчас балуюсь с NBT-редактором. Тесты проходят успешно.
    Можно изменять или считывать NBT-теги прям в игре с помощью текстовых запросов.
    Например для книг: "pages[3]", "Author" или "display.Name".
    С удалением тега пока проблемы, приходится использовать рефлексии для удаления элемента из массива.
    Как только он будет готов и пройдет тесты, я выложу обновленную версию плагина в этой теме.
     
    ufes нравится это.
  9. Автор темы
    DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Баллы:
    153
    Skype:
    dpohvar
    Планы на будущее:
    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
    Этот план лежит в очень долгом ящике, хотя наработки уже есть. Возможно будет реализован через несколько обновлений.
     
    Vedroyder, fromgate и ufes нравится это.
  10. fromgate

    fromgate Старожил Пользователь

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

    А что планируешь? На мой взгляд одна из нужных и важных функций - поддержка групп пермишенов. Часто возникает необходимость при наступлении какого-то события выдать определенную группу, а через какое-то время (или опять же при наступлении события) - убрать.
     
  11. Автор темы
    DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Баллы:
    153
    Skype:
    dpohvar
    Для добавления API Vault нужно много-много писать. Я еще со школьных диктантов это не люблю.
    Сложнее всего сделать NBT редактор (хотя по сути я его уже сделал) - хбз как его включить в текущий синтаксис.
     
    ВремяПриключений нравится это.
  12. OsipXD

    OsipXD Старожил Пользователь

    Баллы:
    173
    Skype:
    osip.fatkullin
    Имя в Minecraft:
    OsipXD
    Admin , разработчика!
     
    Последнее редактирование модератором: 12 окт 2023
    fromgate нравится это.
  13. Автор темы
    DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Баллы:
    153
    Skype:
    dpohvar
    Вот, что из этого вышло

    Вот вам тысяча видов оружия для сервера ^_^
    Может еще и броню сделать кастомную? Например, чтоб можно было сделать скрипт:
    при атаке игрока игрока с такой броней атакующему наносится 20% урона.
    или шанс 5% отразить урон.
    или узы эмпатии,
    или телепортация как у эндермана,
    или например если такая броня на зомбяке, того можно убить только особенным оружием,
    или предлагайте свои варианты)

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

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

    Переименование предмета - уже другим плагином. хотя можно было бы сделать и этим.
     
    ufes нравится это.
  14. Автор темы
    DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Баллы:
    153
    Skype:
    dpohvar
    Думаю, будет репозиторий файлов в формате .item
    Как только я определюсь с тем, в каком формате хранить данные программы внутри предмета.
    Старый вариант уже не нравится: хочу, чтобы можно было добавить несколько программ в один предмет (я отчасти перфекционист)
     
  15. OsipXD

    OsipXD Старожил Пользователь

    Баллы:
    173
    Skype:
    osip.fatkullin
    Имя в Minecraft:
    OsipXD
    Думаю в скором времени ни один РПГ сервер не обойдется без кастомных итемов :3 ну или сервера без таких итемов станут менее популярны

    P.S. Про броню хорошая идея
     
  16. stew

    stew Старожил

    Баллы:
    103
    Skype:
    antonov330
    Имя в Minecraft:
    StewMan
    не знаю где спросить, я пытаюсь предмет из руки одеть на голову, пишу:
    /> ME ITEMINHAND SETHELMET
    пишет как я понял что чего-то в стаке не хватает... а чего? не понятно.
     
  17. Автор темы
    DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Баллы:
    153
    Skype:
    dpohvar
    /> ME ME SETHELMET
    /> ME DUP SETHELMET
    /> ME ME ITEMINHAND SETHELMET
    /> ME ME >HLM
    выбирайте любой.

    UPD:
    ME - кому
    ME ITEMINHAND - взять то, что у МЕНЯ в РУКЕ
    SETHELMET - одеть на голову.
    в итоге получаем ME ME ITEMINHAND SETHELMET
    с таким же успехом слово ME можно заменить на чей-нибудь ник (в кавычках)
     
  18. stew

    stew Старожил

    Баллы:
    103
    Skype:
    antonov330
    Имя в Minecraft:
    StewMan
    хочу с блоком стекла на голове дышать под водой!
    /> ME 20 SETITEMINHAND "\caШлем водолаза" SETITEMNAME ... ME ME SETHELMET а вот что в пропуске? под водой здорово смотрится, прям как скафандр)))
     
    Attelis нравится это.
  19. Автор темы
    DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Баллы:
    153
    Skype:
    dpohvar
    Скорее всего нужно так: /> ^GLASS "\caШлем водолаза" SETITEMNAME ME SWAP SETHELMET
    Для переименования предмета в руке я бы советовал этот плагин (удобнее).
    К следующей версии я добавлю его API в варскрипт.
     
  20. stew

    stew Старожил

    Баллы:
    103
    Skype:
    antonov330
    Имя в Minecraft:
    StewMan
    а что на счет дыхания под водой?
     
    DavidShabaev нравится это.

Поделиться этой страницей