Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

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

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

  1. MYXOMOPX

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

    Баллы:
    78
    Skype:
    MYXOMOPX
    Имя в Minecraft:
    MYXOMOPX
    Скрипт для генерации островов: http://pastebin.com/yvGVnXjq
    [​IMG]
    [​IMG]
    [​IMG]
    [​IMG]
    [​IMG]
    Как использовать:
    1)Создаем файл plugins/varscript/scripts/island.var и копируем в него текст с pastebin
    2)Заходим в игру, строим небольшую площадку в воздухе.
    3)Берем блок травы в первый слот, блок земли во второй слот и камень в третий.
    4)Пишем />>f island
    5)Нажимаем правой кнопкой мыши по нашей площадке.
    6)Нажимаем левой кнопкой мыши по воздуху.
    7)Остров готов!
     
    Hilgert, Hephest, ITrAnEI и 3 другим нравится это.
  2. Хостинг MineCraft
    <
  3. Автор темы
    DPOH-VAR

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

    Баллы:
    153
    Skype:
    dpohvar
    Добавлю..
    Во первых:
    Генерируются только летающие острова. При попытке генерировать остров в воде - скорее всего он уйдет глубоко под землю и выскочит корнем с высоты 256 блоков. При попытке сделать такой невысоко над землей - возможно будет тот же эффект.
    Во вторых:
    Можно изменить материал для построения острова.
    В первом слоте инвентаря - верхний слой острова, во втором - промежуточный (глубина 2-3 блока) и в третьем слоте - основной материал. Ледяные острова или из песка и песчаника - запросто!
    И на последок:
    Многие любят говорить о "Это какая же аццкая нагрузка на сервер!"...
    Генерировать остров скриптом получается в 10-50 раз быстрее, чем скопировать его же ворлдедитом.
    Нам удалось сделать остров размером 200x200x500. Примерно секунд за 30 он был готов :). Несколько раз обошел циклично высоту карты. Острова, которые на скриншотах, были сделаны быстрее, чем за секунду.
     
    I-Am-Black-Overlord и ITrAnEI нравится это.
  4. stew

    stew Старожил

    Баллы:
    103
    Skype:
    antonov330
    Имя в Minecraft:
    StewMan
    VARSCRIPT: IllegalArgumentException No enum constant me.dpohvar.varscript.utils.event.BukkitListenerFormer.EventType.PlayerInteract
    а я только пытался написать >>f island, всё по инструкции
     
  5. Автор темы
    DPOH-VAR

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

    Баллы:
    153
    Skype:
    dpohvar
    версию сервера и плагина плз.
    скрипт для varscript 4.1
    для 4.0 немного по другому:
    нужно
    REG(PlayerInteract)
    заменить на
    REG(INT) или REG(INTERACT)
     
  6. stew

    stew Старожил

    Баллы:
    103
    Skype:
    antonov330
    Имя в Minecraft:
    StewMan
    1.4.5 vs4.0.1
     
  7. stew

    stew Старожил

    Баллы:
    103
    Skype:
    antonov330
    Имя в Minecraft:
    StewMan
    заменил, теперь VARSCRIPT: IllegalArgumentException No enum constant me.dpohvar.varscript.utils.event.BukkitListenerFormer.EventType.Interact
     
  8. MYXOMOPX

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

    Баллы:
    78
    Skype:
    MYXOMOPX
    Имя в Minecraft:
    MYXOMOPX
    Вот версия для Varscript 4.01 http://pastebin.com/vLXfA107
     
  9. Автор темы
    DPOH-VAR

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

    Баллы:
    153
    Skype:
    dpohvar
    Погорячился я насчет версии 0.5
    Возможно заброшу разработку Varscript в пользу этого.
     
  10. Автор темы
    DPOH-VAR

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

    Баллы:
    153
    Skype:
    dpohvar
    Скоро будут незначительные изменения в синтаксисе.
    Вот нынешняя идея:

    1 Локальная среда исполнения для каждого игрока.​
    Переменные будут сохраняться в среде, причем независимо от языка (Varscript, JavaScript или любой другой)​
    т.е. можно будет прописать:​
    /> 10:20:30 "Zombie" SPAWNMOB %mob
    /js mob.setHealth(15);

    2 ООП + прототипное наследование​

    В основе языка лежит стек данных, очередь команд и набор переменных. Достаточно сложно будет добавить объекты в его конструкцию. Пример под спойлером
    Глупо будет применять такие конструкции для исполнения в чате. Однако в связи с тем, что среда исполнения сохраняется (у нас есть доступ к объекту в любое время) - можно использовать объекты, построенные ранее, например вызовом скрипта из файла или любого объекта, способного содержать скрипт.
    Вот наброски:
    Код выбирает некоторую платформу из блоков, затем разрушает ее.
    Код:
    Platform: {
        Blocks: <ARRAY
        Destroy: {
            @Blocks { 0 SETBLOCK DROP } EACH
        }
        THIS
    }
    ME 5 SPHERE Platform %pl1
    ME 6 SPHERE Platform %pl2
    @pl1.Blocks %b1
    pl1.Destroy
    1 WAIT
    pl2.Destroy
    Platform: { ... } - это конструктор платформы. Точнее, полю "Platform" присваивается новая функция-конструктор
    Blocks: <ARRAY - записать в поле Blocks текущего объекта значение из стека, преобразованное в массив
    Destroy: { ... } - записать в поле Destroy функцию, которая разрушает блоки
    THIS - вернуть объект (а не просто выполнить функцию)
    ME 5 SPHERE Platform %pl1 - берется сфера из блоков вокруг игрока (радиус 5 блоков), затем создается объект-платформа и записывается в переменную "pl1". Т.к. поля pl1 нет у данного объекта, значение записывается в глобальную область видимости, доступную всем скриптам и языкам у данного игрока/того кто вызвал код.
    ME 5 SPHERE Platform %pl2 - аналогично, платформа радиусом в 6 блоков записывается в "pl2"
    @pl1.Blocks %b1 - поле "Blocks" объекта pl1 записывается в переменную b1
    pl1.Destroy - вызывается метод Destroy объекта pl1 (блоки платформы уничтожаются)
    1 WAIT - ждем секунду
    pl2.Destroy - уничтожаем вторую платформу
    А суть всё та же:
    val %var - запись в переменную (или поле)
    @var - чтение переменной
    Насчет наследования - пока не решил. И надо ли оно?
     
  11. _DokeR_

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

    Баллы:
    103
    Skype:
    gta-ilya
    Имя в Minecraft:
    SuperDoker
    Плагин класс
     
  12. Автор темы
    DPOH-VAR

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

    Баллы:
    153
    Skype:
    dpohvar
    Сейчас у меня дела обстоят так:
    Цикл проходит по чанкам в основном потоке. Примерно через каждые 2 секунды выполнение останавливается, проходит 10-20 серверных тиков, затем обработка возобновляется. Этот перерыв нужен, чтоб игроки не повылетали с сервера и не очень-то замечали лаги. Можно увеличить время исполнения цикла до 5 секунд - но лаги будет заметно. Больше 15 секунд - грозит вылетом игроков.
    Желательно максимально упростить код в цикле. Т.е. не вычислять внутри, какой ID блока нужен, а сразу брать из уже готового массива.

    Раньше я использовал асинхронный вариант - т.е. менял блоки в параллельном потоке. Перерыв не требовался, но был огромный риск получить ConcurrentModificationException.

    Будет беда, если недалеко находятся игроки) Поэтому ради оптимизации я с помощью скрипта убираю их с территории. Вся проблема в том, что сервер генерирует огромную кучу пакетов (изменения для каждого блока) и передает игрокам. Была идея на самом деле, как сделать замену блока без перессылки пакета (через рефлексии), но провалилась благодаря постоянным крашам буккита.
     
  13. stew

    stew Старожил

    Баллы:
    103
    Skype:
    antonov330
    Имя в Minecraft:
    StewMan
    что с 1.4.7?
     
  14. Автор темы
    DPOH-VAR

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

    Баллы:
    153
    Skype:
    dpohvar
    Пока что используйте Varscript 0.4.1.
    Или есть небольшая модификация от MYXOMOPX (он добавил несколько команд для изменения Name и Lore у предметов)
    Разработка Varscript 0.5 продвигается слишком медленно, я по 10 раз все переписываю. Но он должен оказаться на порядок мощнее предыдущей версии, за счет взаимодействия скриптов между собой, лямбда-функций, конструкторов. (потянуло меня на ООП, без него же никак)
    Сейчас занимаюсь ядром языка VarScript. Как будет готово, выложу бету. Затем, как обещал, добавлю JavaScript.
     
    stew нравится это.
  15. MYXOMOPX

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

    Баллы:
    78
    Skype:
    MYXOMOPX
    Имя в Minecraft:
    MYXOMOPX
    Varscript 0.4.2
    NSETITEMNAME : ставит имя предмету
    краткая форма: >NTNAME
    Пример: /> ME "CustomName" NSETITEMNAME

    NITEMNAME : кладет в стэк имя предмета
    краткая форма: NTNAME
    Пример: /> ME ME NTNAME MSG

    NSETITEMLORE : ставит предмету lore
    краткая форма: >NTLORE
    Пример: /> ME [Lore1,Lore2,Lore3,Blablabla] >NTLORE

    NITEMLORE : кладет в стэк lore предмета
    краткая форма: NTLORE
    Пример: /> ME ME NTLORE MSG
     
    Оригинало_о и stew нравится это.
  16. MYXOMOPX

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

    Баллы:
    78
    Skype:
    MYXOMOPX
    Имя в Minecraft:
    MYXOMOPX
    stew нравится это.
  17. Автор темы
    DPOH-VAR

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

    Баллы:
    153
    Skype:
    dpohvar
    На текущий момент состояние плагина вот какое:
    Новый движок языка varscript, готовы следующие плюшки:
    - ООП
    - Использование функций в качестве конструкторов
    - Замыкания
    - Глобальная область видимости переменных (общая для всех игроков)
    - Обратная польская запись (без этого никак ;) )
    - Многопоточность
    - Динамическая компиляция и интерпретация:
    каждую написанную функцию можно будет сохранить в byte[]
    В итоге всего этого будет некая смесь Forth и ECMAScript

    В разработке:
    - Наследование на основе прототипов
    - Куча команд управления
    типа BEGIN REPEAT BREAK IF ELSE THEN START END STOP и т.д.
    - Команды, относящиеся к Bukkit API
    (пишет MYXOMOPX )

    Планируется:
    - Планировщик. (планируется планировщик... ха-ха)
    От прошлого будет отличаться тем, что включить/отключить можно любую задачу и даже любой ее пункт. и + возможность объединения задач в группы.
    - использование внешних пользовательских библиотек на java (./plugins/VarScript/lib/java)
    Точно сделаю отдельную библиотеку для работы с MySQL, т.к. это нужно не всем.
    - подключение движка Rhyno (JavaScript)
    Rhyno дает больше возможностей благодаря рефлексиям, но в тоже время пользователь должен знать JavaScript и Bukkit API. Еще в нем отсутствует многопоточность, поэтому придется обходиться по старинке, регистрацией таймера.
    - подключение других движков ScriptEngine (это в последнюю очередь)

    Синтаксис varscript:
    - Объявление функций
    Функцию объявить можно будет внутри другой функции, как в JavaScript
    Пример: KillRandomPlayer{ PLAYERS ARANDOM KILL }
    Все, что внутри фигурных скобок - отдельная функция.
    Допускаются безымянные.
    - Переменные
    Чтение переменной в стек: @x
    Запись в переменную: значение %x
    Запись в переменную и объявление ее локальной: значение %%x
    Я не стал заморачиваться насчет анализа кода, поэтому переменная становится локальной в момент объявления (если она используется выше по коду до объявления, то считается глобальной)
    Область видимости локальных переменных сохраняется в контексте исполнения функции. Могут использоваться в этой функции и любой внутренней, однако извне - недоступны.
    - Потоки
    Каждый отдельный поток содержит свой стек. "Общаться" между собой потоки могут через переменные.
    Какой командой создавать потоки - еще не придумал.
    - Управление списками
    Для списков (java.util.List) будут доступны команды map, foreach и свертка, все на основе callback функций.
     
    Greenberg, Jampire и smilesdc нравится это.
  18. Jampire

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

    Баллы:
    173
    Skype:
    jampire-h
    Имя в Minecraft:
    Jampire
    Определенно, самый полезный плагин в истории Bukkit[DOUBLEPOST=1373263714,1373263669][/DOUBLEPOST]главное не забивать на плагин. идея суровая
     
  19. Автор темы
    DPOH-VAR

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

    Баллы:
    153
    Skype:
    dpohvar
    Задумка у меня даже такая:
    /plugins/VarScript/scheduler/ будет содержать задачи в виде yml файлов.
    /plugins/VarScript/script/[language]/ тут будут скрипты на каком-либо языке.
    /plugins/VarScript/lib/[language]/ тут пользовательские библиотеки (в основном jar файлы)

    Так вот: чтобы исполнить какой-либо красивый трюк, нужно написать
    /> параметры... *имяфайла
    считается функция из файла /plugins/VarScript/script/vs/имяфайла.vs и запустится с переданными параметрами. Таким же образом из одного файла можно вызывать другой.

    Создавать задачи чуть труднее, однако тоже можно научиться.

    Достаточно всего-лишь скопировать нужные файлы в эти директории - и все настроено!
    Для планировщика потребуется /scheduler reload
    Для библиотек - перезагрузка всего плагина

    Еще у меня в планах сотворить репозиторий скриптов, библиотек, вики на varscript.ru

    Эх... конечно же самое главное... но и самое сложное(((
    Я сразу добавляю описание к каждой команде на английском, сделал возможность поиск по ключевым словам. Но этого не достаточно[DOUBLEPOST=1373647977,1373270995][/DOUBLEPOST]Если кому интересно, выкладываю тут прототип (просто побаловаться)
    VarScriptTest 0.5.0.A
    https://docs.google.com/file/d/0B50fBoyxANzsbHJhQ0dwR0lSem8/edit?usp=sharing

    Инструкция:
    ставим плагин на тестовый сервер, начинаем баловаться :D
    справку по командам не делал, будет позже.

    Основные команды:
    • PRINT - вывод на экран
    • ME - ты
    • "блабла" - строка с escape-форматированием; & заменяется на цвет; \& - экранирование символа &
    • DUP SWAP DROP ROT - как в предыдущих версиях
    • ## - комментарий до конца строки
    Теперь самое интересное:
    • %x - запись в глобальную переменную
    • %%x - определение локальной переменной и запись в нее
    • @x - взять значение переменной
    Предопределенные переменные (локальные на каждую программу): @Me @Location @Caller
    • Function{...} - создание функции.
    Пример: Add500{500 +} %%add500## создаст функцию с именем Add500 и запишет в перем add500
    • %Function{...} - создание локальной функции.
    %fun{...} почти аналогично записи fun{...} %%fun
    • RUN - запуск функции. Пример: 70 @add500 RUN PRINT ## выведет 570
    • THIS - текущий объект (а-ля javascript)
    Объекты у нас являются Fieldable, т.е. содержат поля. об этом чуть ниже
    • OBJECT - создать новый объект (пустой). Пример: OBJECT %%object
    • .%поле - записать в поле объекта. (можно писать слитно с предыдущим операндом не-числом)
    Пример: 10 @object.%value## аналогично javascript: object.value=10
    (можно писать слитно с предыдущим операндом не-числом)
    • .поле - прочитать поле объекта. Пример: @object.value
    • NEW - запустить функцию-конструктор
    Вот пример:
    %Pet{ THIS.%age THIS.%name } ## это функция-конструктор
    "MyLittlePony" 4 @Pet NEW %%mypet ## создали объект и записали в перем mypet
    @mypet.name PRINT ## выведет MyLittlePony
    @mypet.age PRINT ## выведет 4
    • @@конструктор - аналогично @конструктор NEW. т.е. @@Pet вместо @Pet NEW
    • :поле - взять поле-функцию и применить ее к объекту.
    @someObject:execute Аналогия в JS someObject.execute()
    И самое интересное:
    При поиске полей объекта, если он не является Fieldable, то его поля и методы ищутся на основе рефлексий. Т.е. мы можем использовать:
    /> ME:getHealth PRINT
    /> 15 ME:setHealth
    Если в рефлексиях нашлось два метода с одинаковым названием, мы можем выбрать:
    /> ME:teleport/0
    /> ME:teleport/1
    /> ME:teleport/2
    Вроде бы всё. Прототип тестирую на 1.6.2[DOUBLEPOST=1373648131][/DOUBLEPOST]Забыл еще упомянуть:
    Замыкания, наследование, все в силе!
    Чтобы получить прототип функции, юзаем @function.prototype
    Чтобы взять конструктор: @object.constructor[DOUBLEPOST=1373649236][/DOUBLEPOST]UPD:
    идеально подходит notepad++ с подсветкой синтаксиса Perl
    Вот еще шпаргалка по синтаксису:
    doggy.png
     
    fromgate нравится это.
  20. Автор темы
    DPOH-VAR

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

    Баллы:
    153
    Skype:
    dpohvar
    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 не работает :p

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

    UPD:
    Обратиться к другим плагинам можно по имени как к переменной.
    Например: @WorldEdit
    А дальше - делаем что хотим.
     
    fromgate нравится это.
  21. Jampire

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

    Баллы:
    173
    Skype:
    jampire-h
    Имя в Minecraft:
    Jampire
    решил написать свой язык с блекджеком и ш.. девушками? Чего тут уже только нет :D[DOUBLEPOST=1373879971,1373879885][/DOUBLEPOST]Такими темпами и не нужны будут плагины... Уже эвенты вижу)
     

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