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

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

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

  1. Jampire

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Баллы:
    153
    Skype:
    dpohvar
    Ага. и я запутался. пиши в скайп.[DOUBLEPOST=1383228067,1382969841][/DOUBLEPOST]Теперь покажу фокус-покус на варскрипте :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-му нравится это.
  13. Sirse

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

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

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

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

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

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

    Баллы:
    173
    Имя в Minecraft:
    Sirse
    PHP как-то упорото выглядит в майне, почему-то не понравилось на нём что-то делать.
    Крутил-ставил разные движки, но больше всего понравился Groovy.
     
    The Midnight Wizard нравится это.
  16. Автор темы
    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 нравится это.
  17. Автор темы
    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
     
  18. DigitalMisha

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

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

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

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

    zhenya27 Активный участник

    Баллы:
    68
    Имя в Minecraft:
    zhenya
    мда.... норм, лайк
     
  21. Автор темы
    DPOH-VAR

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

    Баллы:
    153
    Skype:
    dpohvar
    Модуль NBTWrapper

    Фактически - это замена плагина PowerNBT
    Позволяет редактировать предметы, энтити и блоки.
    Скачать, посмотреть и т.д: [pastebin.com] ( < 500 строк )

    Что он из себя представляет

    Всего лишь два класса-обертки:

    class NBTCompound implements Map
    Содержит внутри себя объект {nms}.NBTTagCompound, позволяет работать с ним как с обычной мапой. В мапу можно класть объекты следующих типов:
    byte, short, int, long, float, double, String, int[], byte[], Map, Collection.
    Они будут автоматически преобразованы в NBTBase и занесены в nms объект.
    Когда берем из мапы объект - он тоже преобразуется к одному из выше перечисленных типов.​

    class NBTList implements List
    Реализация списка. Обертка над {nms}.NBTTagList. С ним можете работать как с обычной коллекцией объектов. Типы преобразуются так же, как и в NBTCompound
    Как использовать

    1. функция nbt(Object) позволяет получить NBTCompound у объекта (это может быть Entity, Block, ItemStack)
    Код:
    def myNbtData = nbt me
    print myNbtData
    2. функция nbt(Object, NBTCompound) установит объекту новые теги.
    Вернет true, если все прошло успешно, или же false в случае неудачи
    Код:
    def result = nbt me, myNbtData
    print result
    3. функция nbt(Object, Closure) позволяет просмотреть или изменить теги объекта.
    Вернет результат вычисления замыкания (фигурной скобки)
    Код:
    def myMaxHealth = nbt (me) { it.Attributes[0].Base }
    print myMaxHealth
    
    nbt (me) {
        it.Attributes[0].Base += 20
        it.HealF = it.Attributes[0].Base as float
        it.Inventory.clear()
    }
    4. функция nbt(Map) создаст новый NBTCompound, основываясь на переданной мапе
    Код:
    def myCompound = nbt( [
        foo: "bar",
        number: 15,
        list: [1,2,3]
    ] )
    5. функция nbt(Collection) создаст новый NBTList. Можно вызывать с переменным числом аргументов вместо коллекции
    Код:
    def numbers = nbt( [1, 2, 3, 4, 6, 7] )
    def primes = nbt 2, 3, 5, 7, 11
    С помощью этих функций можно в полной мере работать с NBT-данными.
    Например, вот так можно циклически двигать строки на табличке blockSign:
    Код:
     def rotateLines = {
        def t = it.Text1
        it.Text1 = it.Text2
        it.Text2 = it.Text3
        it.Text3 = it.Text4
        it.Text4 = t
    }
    nbt (blockSign rotateLines)
     
    slavik123123123, Hephest, MrGiffi и ещё 1-му нравится это.

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