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

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

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

  1. Автор темы
    DPOH-VAR

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

    Баллы:
    153
    Skype:
    dpohvar

    1) Этот сайт мертв. (Вместо него возможно будет varscript.ru/wiki - но не факт) Создать полноценную вики скорее всего у меня не хватит сил.
    Базу знаний я сделал из этого форума, большая хуча туториалов в первом посте. И я его периодически обновляю. Считаю, что этого хватит для изучения синтаксиса и многих примочек
    2) Модуль ItemScript в разработке еще, им занимается MYXOMOPX .
    Чтобы его использовать - нужно быть хорошим специалистом по плагину, т.к. там активно используются программистские фишки, замыкания, области видимости, потоки и прочие трюки. Модуль еще без документации.
    В будущем возможно будет переписан на groovy.

    Ну и еще дополню:
    Плагин может использовать внешние скриптодвижки, но я советую ими пользоваться только ради эксперимента. Я оставил утечку памяти (PermGen space error) - обусловлено тем, что при перезагрузке сервера (/reload) груви каждый раз создает толстый ClassLoader. Как потом оказалось, ECMAScript в java 8 делает то же самое. И Scala, и jRuby - в общем, все движки кушают память в области perm gen.
    Мне много что нужно переделать в них...
    И я не смогу заниматься плагином еще в течение 2-3 недель

    PS: обновлю TODO в шапке, но это долгосрочные планы
    Готовится к выходу VarScript 0.5.7
    Единственное что будет изменено - механизм загрузки модулей и загрузка внешних библиотек.

    - Библиотеки будут лежать в папке lib в корне сервера. Возможность загрузки по ссылке я отключил.
    - Все библиотеки подгружаются только один раз при инициализации плагина.
    - Исправлен баг PermGen space error: скриптодвижки создаются каждый в единственном экземпляре.
    - Для добавления дополнительной библиотеки придется остановить сервер.

    - Модули теперь будут загружаться/выгружаться динамически.
    - Зависимость модулей: функция boolean require("модуль") будет загружать необходимый модуль и возвращать булево (удалось загрузить требуемый модуль или нет)

    Еще одна новость: скоро релиз мини-игры DarkRuna!
    Это самый сложный проект на варскрипте, имеет кучу зависимостей, настроек и т.д.
    Для пользователей и игроков мы упростили управление, создав команду /darkruna
    Подробнее можно прочитать тут.
     
    Reedanger, ufes, smilesdc и ещё 1-му нравится это.
  2. MYXOMOPX

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

    Баллы:
    78
    Skype:
    MYXOMOPX
    Имя в Minecraft:
    MYXOMOPX
    Релиз мини-игры DarkRuna!


    Скачать:
    https://drive.google.com/file/d/0B9AYr_oGwl1YRUE5ZXIwN3NVSlk/edit?usp=sharing
    Требования:
    VarScript 0.5.6
    PowerNBT 0.5.3 или новее
    Остальные зависимости содержатся в архиве
    Содержимое архива закинуть в папку /plugins

    Суть игры:
    Игрок присоединяется к арене, его задача - убить других игроков с помощью рун. Руны хаотично спавнятся на арене. При убийстве игрока из него выпадает артефакт. Кто его поднимет - получает очки.
    За очки можно покупать новые руны или улучшать свои способности.

    Список рун:
    Fire:
    При броске - руна поджигает землю и рядом стоящих игроков
    При попадании - поджигает конкретного игрока
    При использовании на себя - включает эффект DemonRun​
    Water:
    При броске - окатывает водой все по радиусу.
    Игроки в радиусе получают статус Wet
    При использовании на себя - игрок становится мокрым (статус Wet)​
    Freeze:
    При броске - вокруг руны все замораживается
    При использовании - игрок замораживается сам. (статус Freeze)​
    Lightning:
    При броске - в руну бьет молния.
    При использовании на себя - игрок получает щит (статус Shield)​
    Curse:
    При броске - все в радиусе действия получают статус curse
    При использовании на себя - игрок сам получает статус.
    Blast:
    При броске - руна взрывается, нанося урон по радиусу
    При использовании - игрок получает реактивное ускорение​
    Astral:
    При броске - игрок телепортируется туда, где упала руна.
    При попадании в игрока - они поменяются местами.
    При использовании - игрок получит статус Astral (невидимый)​
    Life:
    При использовании - восстанавливает здоровье (эффект Healing)
    количество hp зависит от уровня руны.
    При попадании в противника - из него высасываются жизни и передаются игроку. Но при промахе - фигвам :p

    Статусы:
    Различные статусы могут накладываться на игрока при использовании рун или окружающей среды.
    Статус может:
    - устанавливаться на какое-то время;
    - устанавливаться навсегда;
    - применяться моментально (не остается).
    Каждый игрок видит свои статусы слева на скорборде.
    Все статусы сбрасываются после смерти.

    Wet (мокрый) / временный статус:
    Игрок получает этот статус, если он в воде, или его намочили с помощью рун.
    этот статус снимает эффекты огня и проклятья.
    Игрок становится более уязвим ко льду и молнии.
    Не может использовать DemonRun
    Игрок становится мокрым, если наступил в воду.
    Неуязвим к эффекту curse.
    Эффект: водяные брызги от игрока.​
    Fire (огонь) / временный статус:
    Игрок просто горит.
    Взрывается при проклятии.
    Игрока нельзя заморозить.
    Если игрок был мокрый - высохнет.
    Если игрок имел curse - он взорвется.
    Эффект: игрок горит огнем и получает дамаг.​
    DemonRun / временный статус:
    Игрок загорается, но не получает урона
    Иммунитет к огню.
    Взрывается при проклятии.
    Теряет статус при намокании или заморозке
    Поджигает ближайших противников
    Ускоряется передвижение (в зависимости от уровня)
    Эффект: лавовые брызги от игрока​
    Freeze / временный статус:
    Игрок не может двигаться или использовать руны.
    Не намокает.
    Эффект: ноги игрока застывают в снегу.​
    Curse / временный статус:
    Ослепляет игрока и снижает скорость перемещения
    Игрок уязвим к огню (взорвется)
    Статус очищается водой или при ударе молнии
    Эффект: фиолетовая аура вокруг игрока.​
    Astral / временный статус:
    Игрок становится невидимым.
    Переходя в астрал, очищает эффект curse
    Эффект - еще не придумали ;)
    Shield / временный статус:
    Вокруг игрока появляется электростатический щит
    Все в радиусе действия щита получают небольшой урон (статус Lightning)
    Щит отталкивает от игрока все летящие в него руны. (в обратном направлении)
    Эффект - от игрока исходят искры.​
    Silent / постоянный статус, не отображается:
    Игрок не может использовать руны, подбирать их или выбрасывать.
    Игрок не может нанести кому-то урон.
    Обычно устанавливается вместе с заморозкой (Freeze)​
    Lightning / мгновенный статус:
    Мгновенный статус при ударе игрока молнией / током
    Наносит урон (в зависимости от уровня)
    Если игрок мокрый - урон удваивается.
    Если игрок сухой и имеет электростатический щит - он не получает уронЭффект - от игрока при ударе исходят искры.​
    Healing / мгновенный статус:
    Мгновенно пополняет здоровье игрока
    Снимает эффект curse
    Эффект - сердечки над головой.

    Команды:
    /darkruna help - Выводит список всех команд с краткими описаниями
    /darkruna runa - Посмотреть свои руны, а также руны, которые можно купить
    /darkruna runa <Руна> - Покажет информацию о руне
    /darkruna runa <Руна> upgrade <Способность> - Прокачивает руну
    /darkruna slots - Покажет сколько у Вас слотов и сколько нужно монет для покупки еще одного слота
    /darkruna slots buy - Купить слот
    /darkruna list - Отобразит список всех арен
    /darkruna money - Отобразит количество денег
    /darkruna join <Арена> - Присоединиться к арене. Пермит: darkruna.join.<арена>
    /darkruna leave - Выйти из текущей арены
    /darkruna start <Арена> - запустить арену. Пермит: darkruna.start.<арена>
    /darkruna stop <Арена> - остановит арену. Пермит: darkruna.stop.<арена>
    /darkruna create <Параметры> - создаст арену. Пермит: darkruna.create
    Пример: /darkruna create Name=MyArena AutoStart
    Параметры:
    Name - Имя арены. Обязательный параметр.
    AutoStart - запускать ли арену автоматически при старте\релоуде сервера
    AX, AY, AZ, BX, BY, BZ, World - Координаты арены.
    Координаты можно не указывать, если выделить арену с помощью WorldEdit​
    /darkruna kick <Игрок> - кикнет игрока из игры. Пермит: darkruna.kick.<арена>
    Алиас для команды /darkruna - /dr

     
    GrimJoy, Reedanger, AlexGL и 3 другим нравится это.
  3. Jampire

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

    Баллы:
    173
    Skype:
    jampire-h
    Имя в Minecraft:
    Jampire
    Я походу был прпв, что этот плагин может заменить все остальные.
     
    DPOH-VAR нравится это.
  4. Автор темы
    DPOH-VAR

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

    Баллы:
    153
    Skype:
    dpohvar
    Ну разве что ProtocolLib он не сможет заменить.

    UPD:
    Ан нет, сможет, с помощью груви))
    Но все равно это в первую очередь плагин для скриптинга, а не заменятель всего и вся
     
  5. Jampire

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

    Баллы:
    173
    Skype:
    jampire-h
    Имя в Minecraft:
    Jampire
    на посоеднем видео видел много частиц, как от эндерпортала, кровь после смерти, эффект холода при заморозке - чем это реализовано?
     
    Greenberg нравится это.
  6. Автор темы
    DPOH-VAR

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

    Баллы:
    153
    Skype:
    dpohvar
    Модуль Particles.groovy этим занимается. Лежит в архиве с даркруной.
    На варскрипте его можно использовать так:
    /> ME 0.5 1 50 @Particles.LAVA:playCustom
    И этот модуль отправляет пакеты частиц ближайшим игрокам
    ME - где создать эффект; 0.5 - радиус; 1 - скорость эффекта; 50 - количество частиц.

    Я хотел использовать PlayEffect API, но в нем нет детальной настройки эффектов
     
  7. Jampire

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

    Баллы:
    173
    Skype:
    jampire-h
    Имя в Minecraft:
    Jampire
    спасибо. интересно. посмотрю.
     
  8. kiroboev

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

    Баллы:
    68
    А каким образом можно реализовать команду на пермишенсы?
    Например:
    Если игрок вы брал класс "archer", добавить его в группу "archer" в пермишенсах.
     
  9. Автор темы
    DPOH-VAR

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

    Баллы:
    153
    Skype:
    dpohvar
    Первый способ, самый простой:
    "pex user " @player S+ " add rpg.archer" CONSOLE %%result
    Этой командой мы заставим консоль принять команду для pex
    @player - игрок, которому выдаем пермиты
    @result - текстовый ответ консоли на команду

    Способ №2:
    Используйте Vault API или API своего плагина пермитов.
    Плагин можно вызвать через команду @ИмяПлагина, а остальное - рефлексиями.
     
  10. kiroboev

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

    Баллы:
    68
    Немного поподробнее напишу, потому что запутался в плагине.
    Задача:
    Игрок при входе на сервер выбирает класс Archer (любой игрок). Его автоматически перекидывает из группы Default (в которой он был на сервере до выбора класса) в группу Archer в Пермишенсах (я использую плагин GroupManager от Essential).
     
  11. Автор темы
    DPOH-VAR

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

    Баллы:
    153
    Skype:
    dpohvar
    Давай еще подробнее.
    1 - как игрок будет выбирать класс?
    2 - ограниченное число классов или нет?
    3 - может ли игрок забить на это, и не выбирать класс?
    4 - Можно ли добавить игрока в группу через консоль? Какой командой?
     
  12. kiroboev

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

    Баллы:
    68
    1. Это делает плагин RP Classes (есть на ведре). Командой /classes pick [class].
    2. Количество классов - 5
    3. Если он не выбирает класс, он не может сдвинуться с места и ничего использовать кроме чата.
    4. Через консоль похоже нельзя. Но можно через конфиг-лист.
     
  13. Автор темы
    DPOH-VAR

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

    Баллы:
    153
    Skype:
    dpohvar
    Ага. и я запутался. пиши в скайп.
    Теперь покажу фокус-покус на варскрипте :D.
    1) Запускаем сервер.
    2) заходим в директорию lib
    3) создаем файл TestClass.java:
    Безымянный.png
    4) Сохраняем файл.
    5) Компилируем (почему бы не в командной строке?):
    Безымянный.png
    6) Получаем файл TestClass.class, который должен лежать в папке lib
    Безымянный.png
    7) Пользуемся только что написанным классом!
    Безымянный.png
    Безымянный.png
    Безымянный.png

    Таким образом можно писать плагины для плагина VarScript!
    We-need-to-go-deeper_inception.jpg

    А на самом деле:
    это означает, что мы можем использовать любые недостающие библиотеки, чтобы написать свой крутой скрипт ;)

    ПС: зто работает с версии 0.5.7
    В версии 0.5.6 файлы .class нужно предварительно упаковать в какой-нибудь архив.jar
     
    Последнее редактирование: 31 окт 2013
    Сникерсни, zuma2, Hephest и ещё 1-му нравится это.
  14. Sirse

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

    Баллы:
    173
    Имя в Minecraft:
    Sirse
    Гайд по рефлексиям когда стоит ждать?
     
  15. Автор темы
    DPOH-VAR

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

    Баллы:
    153
    Skype:
    dpohvar
    Я совсем забыл про них!
    Продолжу пополнять список туториалов... прямо сейчас!

    А если используешь grovy/js/php/другой движок - у них это реализовано по своему.
    Советую использовать те версии движков, который поддерживает InvokeDynamic:
    это indy-сборки groovy и движок Nashorn для javascript
     
  16. Sirse

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

    Баллы:
    173
    Имя в Minecraft:
    Sirse
    PHP как-то упорото выглядит в майне, почему-то не понравилось на нём что-то делать.
    Крутил-ставил разные движки, но больше всего понравился Groovy.
     
    The Midnight Wizard нравится это.
  17. Автор темы
    DPOH-VAR

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

    Баллы:
    153
    Skype:
    dpohvar
    Обновляю плагин до версии 0.5.7

    И сразу новая фишка: модуль metaclasses.groovy
    Суть его в том, чтобы упростить использование команд путем перегрузки функций.
    Большая куча примеров
    Код:
    // Использование функции print()
    print "Hello world"   // вывести на экран сообщение
    print Server          // на экран можно вывести любой объект
    
    // Быстрый доступ к массивам игроков и энтитей
    players                // список игроков
    worlds                 // список всех миров
    living                 // список всех LivingEntity
    entities               // список всех энтитей
    mobs                   // список мобов (все живые энтити кроме игроков)
    items                  // список всех предметов (Item)
    mobs + items           // все мобы и предметы
    players - me           // все игроки, кроме себя
    
    // Векторы и работа с ними
    v1 = vector(1,2,3)     // создать вектор v с параметрами x,y,z
    v2 = vector(10)        // создать вертикальный вектор
    v = up(2)              // v = вертикальный вектор (0,2,0)
    v = down(5)            // аналогично, вектор вниз.
    ~v                     // нормализованный вектор v
    v1 + v2                // сложение векторов (будет вектор 1,12,3)
    v1 * 10                // умножение на скаляр (получим 10,20,30)
    v2 / 2.5               // деление вектора (будет 0,4,0)
    v1 % 5                 // длина вектора станет равна 5
    
    // Строки
    -"Player"              // Найти игрока с именем Player
    +"&4Colored &eText"    // цветной текст
    
    // Дислокации(точки)
    l = me.loc             // простой способ взять свое местоположение
    l2 = loc(1,2,3,"world")// взять точку (1,2,3) в мире world
    l << e1 << e2 << eN    // телепортирует в точку l энтитей e1,e2,eN
    l.bolt()               // ударить молнией в точке l
    l.bolt(false)          // ударить молнией без нанесения повреждений
    l2 = l + v             // сложить точку и вектор
    l3 = l - v             // наоборот, вычитает вектор из точки
    v = l2 - l3            // получить вектор между двумя точками
    l.block                // блок в этой точке
    me.loc = l2            // телепортироваться в точку l2
    me.loc += up(1)*10     // телепортироваться на 10 блоков вверх
    me >> l3               // телепорт в точку l3
    
    // Энтити, игроки и др.
    me.throw(v)            // подбросит игрока на вектор v
    me.throw(2.5)          // подбросит игрока вверх с силой 2.5
    me.throw(1,2,3)        // подбросит игрока на вектор (1,2,3)
    me.velocity += v       // то же самое
    me.hp += 1             // добавить чуток хит-пойнтов
    me.gm = "SURVIVAL"     // изменить гейммод
    me.kill()              // убить энтити
    me.dmg(10)             // нанести урон
    me.bolt()              // ударить игрока молнией
    me.bolt(false)         // ударить молнией без урона
    me.tp(entity)          // телепортироваться к entity
    me >> entity           // телепортироваться к entity
    entity << me           // телепортироваться к entity
    me.shift(v)            // сдвинуть игрока на вектор v
    me.shift(1,2,3)        // сдвинуть игрока на вектор (1,2,3)
    me.shift(10)           // сдвинуть игрока вверх на 10 блоков
    me.loc += down(1)*5    // сдвинуть вниз на 5 блоков
    me.maxhp = 40          // изменение максимального запаса здоровья
    me.give(42)            // получить блок железа
    me.give(35,14)         // получить блок красной шерсти
    me.give(35,14,500)     // получить 500 таких блоков

    Кроме всего этого есть еще и упрощенные методы регистрации событий.
    Выглядит регистрация так:
    Код:
    listen { PlayerChatEvent e ->
        print e.message
    }
    
    Подробнее описание в самих исходниках.

    Модуль metaclasses будет потихоньку обновляться и обрастать новыми методами и функциями.
     
    Последнее редактирование: 12 ноя 2013
    Hephest и FedorNogopletov нравится это.
  18. Автор темы
    DPOH-VAR

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

    Баллы:
    153
    Skype:
    dpohvar
    Гайд по использованию groovy в плагинe VarScript

    Данный туториал рассматривается для VarScript версии 0.5.7
    1. Установка Groovy

    Первым делом, необходимо скачать движок groovy
    Найти его можно тут: http://groovy.codehaus.org/Download
    Рекомендую использовать последнюю версию (2.2.0 на этот момент)
    Для Java 7, Java 8
    В скачанном архиве найти папку embeddable, в ней выбрать jar библиотеку с пометкой "indy", скопировать ее в директорию bukkit-сервера ./lib
    Для Java 6
    Проделать то же самое, но выбрать библиотеку без пометки "indy"
    Готово!

    2. Запуск сервера

    Запускаем сервер с плагином VarScript и установленной библиотекой Groovy
    Затем внимательно смотрим в консоль:
    [INFO] [VarScript] Enabling VarScript v0.5.7
    Запуск плагина VarScript.
    Если этого сообщения нет, проверьте наличие плагина и его версию.
    [INFO] [VarScript] jar file groovy-all-2.2.0-rc-3-indy.jar loaded
    загрузка библиотеки groovy. Если появилось это сообщение, значит библиотека установлена верно.
    Если сообщения нет, проверьте правильность действий в пункте 1.
    [INFO] [VarScript] load Groovy Scripting Engine 2.0
    lang: Groovy 2.2.0-rc-3
    name: groovy,Groovy
    extension: groovy

    Сообщение об активации движка. Теперь его можно использовать для написания скриптов.

    3. Проверка движка.

    Пишем команду:
    /g>> "hello, world"
    При первом запуске команд возможна задержка 5-30 секунд на загрузку классов groovy
    Затем в ответ получим следующее:
    [VarScript] hello, world!
    Теперь точно все работает!

    Команды
    /g>> {скрипт}
    /->> groovy {скрипт}

    эта команда запустит скрипт, затем вернет в ответ результат исполнения.
    Пример выше.

    /g> {скрипт на groovy}
    /-> groovy {скрипт}

    Аналогично предыдущей, но не отображает результат.
    Пример:
    /g> me.gameMode = "ADVENTURE"
    Команда изменит гейммод, при этом не выдаст никакого сообщения

    /->f groovy {файл} {параметры}
    /g>f {файл} {параметры}

    Прочитать скрипт из файла и исполнить его.
    Файл при этом должен располагаться в директории ./plugins/VarScript/scripts/Groovy
    Расширение файла .groovy
    При вводе команды расширение не указывается
    Кодировка файла UTF-8
    Параметры будут переданы в файл в виде массива args[]
    Пример:
    Файл /plugins/VarScript/scripts/Groovy/sayall.groovy
    Код:
    args.each { Server.broadcastMessage it }
    /g>f sayall foo bar baz
    Сервер напечатает всем игрокам три сообщения:
    foo
    bar
    baz


    Переменные

    Ниже перечислен список переменных, с помощью которых можно взаимодействовать с игрой
    me - при каждом запуске скрипта это тот, кто его запустил. Это может быть игрок, блок, консоль или задача VarScript. В более детальных случаях me может ссылаться на что угодно
    caller - оболочка над запустившим скрипт. С помощью caller можно обратиться к локальным переменным (для игрока), напечатать что-либо в ответ и т.д.
    сaller.send(объект) - напечатать объект
    caller.location - узнать местоположение (для консоли это 0:0:0 в первом мире)
    caller.getField("имя") - взять значение локальной переменной (null если не существует)
    caller.setField("имя",значение) - установить значение локальной переменной
    caller.removeField("имя") - удалить переменную
    caller.hasField("имя") - проверка наличия переменной

    program - текущая программа. С помощью этой переменной можно регистрировать события, таймеры, задавать окружение (глобальные переменные для текущего скрипто-движка)
    примеры использования будут рассмотрены отдельно

    args - массив строк, при запуске скрипта из файла

    Server - объект org.bukkit.Server
    PluginManager - объект PluginManager
    Engines - хешмапа всех скрипто-движков. У одного движка может быть несколько имен.
    Безымянный.png Безымянный.png Безымянный.png Безымянный.png Безымянный.png Безымянный.png Безымянный.png
     
  19. DigitalMisha

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

    Баллы:
    58
    Могу ли я использовать XTend с этим плагином?
     
  20. Автор темы
    DPOH-VAR

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

    Баллы:
    153
    Skype:
    dpohvar
    К сожалению он не совместим с JSR-223
     

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