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

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

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

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

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

    Баллы:
    153
    Skype:
    dpohvar
    HellJump не работает на bukkit 1.7
    Новая версия в процессе, но она будет на груви.
    hj.png
     
  2. Хостинг MineCraft
    <
  3. ujkbktj

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

    Баллы:
    123
    Тебе уже сказали что не работает на 1.7.
     
  4. Автор темы
    DPOH-VAR

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

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

    это небольшой HTTP сервер, написанный на груви
    простое и удобное решение для создания веб-интерфейса с использованием AJAX
    exm.png
    Зависимости:
    • VarScript 0.5.7 or или более поздний o.5.x
    • Java 7 или Java 8 с опцией -noverify
    Установка:
    • Установить VarScript
    • Установить Groovy:
      • Создаем директорию ./lib в корне сервера
      • Скачиваем Groovy (binary zip)
      • Находим groovy-all-*-indy.jar и кладем его в директорию ./lib
    • Запустить сервер
    • Дождаться сообщения:
      [VarScript] load Groovy Scripting Engine 2.0
      lang: Groovy 2.2.0-rc-3
      name: groovy,Groovy
      extension: groovy
    • Остановить сервер
    • Установить модуль BHTTPServer:
      • Скачиваем BHTTPServer.groovy
      • Кладем его в ./plugins/VarScript/scripts/Groovy/modules/
      • Открываем в блокноте и изменяем конфигурацию (в конце файла):
    • Запустить сервер и дождаться сообщения:
      [VarScript] [Groovy] <#> module BHTTPServer loaded.
    • Создать index.html в static директории
    • Готово: http://localhost:8011
    Использование:

    pathStatic - это директория с статичными страницами и файлами. Там нужно располагать html, js, и другие файлы

    pathExecute - директория со скриптами
    Для написания скриптов можно использовать groovy, javascript или любой другой язык, совместимый с варскриптом.
    Запрос вида http://localhost:8011/login попытается запустить скрипт ./webserver/execute/login.js или ./webserver/execute/login.groovy

    В скриптах доступны переменные:
    method - метод. строка: "GET", "POST", "OPTIONS" и т.д.
    query - мапа <string, string> содержащая запрос в ссылке
    cookie - мапа <string, string> содержащая куки
    session - мапа <string,?> содержит переменные текущей сессии
    exchange - интерфейс для работы с http-запросом и ответом
    Также доступен весь Bukkit API
    Можно добавить свои jar библиотеки или классы в директорию ./lib
    Код:
    // добавить HTTP заголовок в ответ
    exchange.header("Expires","Tue, 31 Jan 2012 15:02:53 GMT")
    // установить статус ответа
    exchange.setStatus(200)
    // отправить статус и заголовки
    exchange.sendHeaders()
    // отправить чистый текст
    exchange.send("text")
    // отправить массив байт
    exchange.send( new File("filename.txt") )
    // распарсить object как строку JSON и отправить клиенту
    exchange.sendJson( object )
    // установить куки
    exchange.setCookie("key", "val", )
    // установить куки со сроком годности
    exchange.setCookie("key", "val", new Date() )
    // закрыть соединение
    exchange.close()
    // исполнить файл и вернуть результат
    def result = exchange.include("filename.js")
    // прочитать JSON-объект из тела запроса
    def json = excnange.getJson()
    // получить JSON-объект из строки
    def json = excnange.getJson('{"foo":"bar"}')
    если скрипт вернет строку или файл - от будет отправлен клиенту
    если скрипт вернет true - соединение останется открытым

    Для языка groovy доступны следующие алиасы:
    Код:
    include "filename.groovy" // подключить файл
    setStatus 404 // установить статус ответа
    header "Content-Type", "text/html" // добавить заголовок
    sendJson([a:1, b:2]) // отправить объект как JSON строку
    send "text" // просто отослать текст
    send new File("filename") // отправить файл
    setCookie "key", "value", new Date() + 10 // установить куки на 10 дней
    getJson() // прочитать объект JSON из тела запроса
    Пример: login.groovy: Позволяет авторизоваться на сайте при помощи AuthMe
    Код:
    import fr.xephi.authme.api.API
    
    if (method != "POST") return "POST only"
    
    switch (query.action) {
        case "logout":
            session.player = null
    
        case "check":
            return asJson([player: session.player])
    
        case "login":
            def auth = API.checkPassword query.login, query.password
            if (auth) session.player = query.login
            else session.player = null
            return asJson([result: auth, player: session.player])
    }
    Скачать этот пример (.html-ки и скрипты на groovy. он на скриншоте)
     
    Hephest и 0bsid1 нравится это.
  5. ujkbktj

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

    Баллы:
    123
    А как же HellJump на Groovy? Работа идёт?
     
  6. Автор темы
    DPOH-VAR

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

    Баллы:
    153
    Skype:
    dpohvar
    он давно готов, но без командной оболочки.
    http://exe.on.ufanet.ru/varscript/Helljump.groovy

    Создание арены:
    1) построить ее
    2) встать в центр и ввести
    /g>> loc = me.location
    3) ввести
    /g>> arena = new helljump_0_2.HellJumpArena("arena-name",loc,10)
    тут "arena-name" - название арены
    10 - радиус от центра
    Готово!

    Теперь чтобы начать играть со всеми, кто на сервере:
    /g>> arena.start(Server.onlinePlayers as List)
    Чтобы взять в игру только игроков только рядом с собой в радиусе 5 пишем
    /g>> arena.start( Server.onlinePlayers.findAll {it.location.distance(me.location)<5})

    Экстренная остановка текущей игры:
    /g>> arena.stop()

    Если арена надоела, можно ее удалить (завершить обработку)
    /g>> arena.remove()[DOUBLEPOST=1393824265,1393159514][/DOUBLEPOST]
    VarScript 0.6.1
    Эта версия плагина работает только со скриптодвижками. Благодаря тому, что больше не нужно изобретать велосипед, размер jarки уменьшился с 1.2 мб до 46 кб.

    Загрузчик классов
    Все библиотеки и классы из директории ./lib теперь грузятся не отдельным загрузчиком, а тем же, который грузит плагины.

    Поддержка синтаксиса
    Вот несколько движков, с которыми я успел протестировать варскрипт:
    python - jython 2.7.0 - OK.
    ECMAScript - Mozilla Rhino 1.7 release 3 - OK
    php - Caucho Quercus Script Engine 4.0.37 - не умеет ставить переменные
    ruby - JSR 223 JRuby Engine 1.7.6 - не умеет читать и ставить переменные
    Groovy - Groovy Scripting Engine 2.0 - OK
    Scala - Scala Interpreter 1.0 - только для скриптов и библиотек
    lua - Luaj Luaj-jse 3.0-beta2 - не читает и не ставит переменные
    ECMAScript - Oracle Nashorn 1.8.0 - прячет локальные переменные
    ECMAScript - Google V8 3.19.14 - не читает и не ставит переменные
    Таким образом лучше всего lдля работы подходят groovy, python и javascript

    Рабочее пространство
    При исполнении команды игрок получает свое рабочее пространство. В нем он может хранить переменные, исполнять код, регистрировать события и таймеры. В любой момент его можно отключить, удалить или сменить. При отключении - останавливаются все таймеры и зарегистрированные события. При удалении - пропадают все сохраненные данные.
    Пример:
    /workspace set w1 - установлено рабочее пространство w1
    /js> foo = "bar"
    /js> print(foo)
    - выведет bar
    /workspace set w2 - установлено пространство w2
    /js> print(foo) - ошибка, переменная foo не определена
    /js> foo = "baz"
    /js> print(foo)
    - выведет baz
    /workspace set w1 - вернулись на w1
    /js> print(foo) - выведет bar

    Скрипты
    Все скрипты располагаются в ./plugins/VarScript/scripts/
    Чтобы исполнить скрипт, нужно ввести имя файла полностью.
    />> myScript.js
    Язык определяется расширением файла

    Переменные
    Доступные переменные, в порядке приоритета:
    me - как и раньше
    workspace - текущее рабочее пространство
    server - сервер
    pluginManager - менеджер плагинов
    classLoader - загрузчик классов
    server - сервер
    переменные рабочего пространства
    названия плагинов
    общие пользовательские константы
    пользовательские константы для конкретного языка (планируется)
    имена игроков онлайн

    Модули
    А нету их :D и не будет.
    Вместо модуля нужно создавать заранее рабочее пространство:
    /plugins/VarScript/workspace/testWorkspace/TestWorkspace.js
    Скрипт загрузится автоматически при старте сервера
    имя папки и скрипта должны совпадать (но имя скрипта обязательно с прописной буквы в юниксах)
    Модуль может состоять из нескольких файлов.
    Чтобы подключить другой файл, можно использовать команду
    workspace.include("NextFile.groovy")
    Язык скрипта может не совпадать с текущим.
    Старые модули не сложно переделывать под новый формат.

    Команды
    /engine - список доступных скриптодвижков
    /engine [name] - информация о конкретном движке
    /workspace - текущее рабочее пространство
    /workspace list - просмотр всех загруженных
    /workspace set [workspace] <player> - сменить себе или другому игроку
    /workspace set-default [workspace] <player> - задать по умолчанию
    /workspace get <player> - посмотреть рабочее пр-во у игрока
    /workspace stop <workspace> - остановить пр-во (по имени или свое)
    /workspace unload <workspace> - выгрузить пр-во
    /workspace reload <workspace> - перезагрузить пр-во
    /workspace load <workspace> - загрузить принудительно
    /workspace unload-all - выгрузить пр-во
    /workspace reload-all - перезагрузить пр-во
    /workspace load-all - загрузить все неподгруженные пр-ва
    />> [script-file] - запустить скрипт в файле
    /> [language] [lang-code] - исполнить команду на каком-либо языке
    /g> [groovy-code] - исполнить команду на груви
    /js> [javascript-code] - исполнить команду на js
    /py> [python-code] - исполнить команду на питоне
     
    Последнее редактирование: 22 мар 2014
    FedorNogopletov, fromgate, Hephest и 2 другим нравится это.
  7. FedorNogopletov

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

    Баллы:
    173
    Хочу вики(
     
  8. ptnk

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

    Баллы:
    173
    Какой же большой и сложный велосипед, который по сути является игрушкой для собственного самообучения.
    Смысл всего этого?
    Смысл всего это развития, появление, отмирание возможностей, функциональностей, если всё это по сути используется только одним человеком, автором?
    Это плагин не для широкой публики: документации нет, то, что есть - недостаточно, как этим пользоваться нормальному человеку не понятно.
    Может быть стоит попробовать в сторону для народа? Чтобы этим начали в большем количестве пользоваться?

    Мало того, что придумал свой собственный синтаксис (я же не ошибаюсь?), добавил какие-то извращения, чтобы работать с этим на js, потом ещё добавил поддержку других языков(не ошибаюсь?)
    А на какой весь этот винегред обычному поцанёнку?

    Обрезать кучу ненужного, оставить какие-нить плюшки-конструкторы, чтобы любой желающий смог собрать свою мини арену с супер-способностями - вот секрет успеха, это привлечёт почёт, большее уважение и известность, а так же возможно и появятся другие заинтересованные люди, кто захочет работать над твоим проектом.

    А пока, это игра в одни ворота.
     
    Последнее редактирование: 3 мар 2014
  9. Автор темы
    DPOH-VAR

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

    Баллы:
    153
    Skype:
    dpohvar
    1) Да, мой синтаксис varscript был велосипедом. Однако некоторым пользователям он показался удобнее, чем js или груви. В то время я не знал о существовании стандарта JSR-223, да и сейчас о нем мало кто знает, даже из профессиональных программистов. Сейчас я отказываюсь от VS-синтаксиса в пользу развития модулей на уже существующих языках.

    2) Плагин используется только мной? Не смешите. Я согласен, что плагин не для широкой публики. Основное его предназначение - написание скриптов. Хотите писать скрипты - учите язык.
    Изучить ECMAScript можно с нуля за 3-5 дней, если сильно хотеть. Для тех, кто знает хоть один ЯП - проблем не будет.

    3) В этой теме я выкладываю кучу плюшек(модулей) с аренами, мини-играми и прочими ништяками. Если бы я делал это только для себя, не было бы смысла публиковать исходники.
    Думаю, что под 0.6 стоит завести отдельную тему, т.к. плагины многим отличаются.
    Я постепенно буду переписывать старые модули под 0.6 (во многих скриптах нужно лишь пару строчек заменить). Если нужен какой-то скрипт - пишите, поставлю в приоритет.
     
  10. ptnk

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

    Баллы:
    173
    Кучу плюшей и модулей выкладываешь ты, но вот чётко структурированной документации нет, хорошего исходного кода с подробными комментариями нет. Хорошего обоснования идеи нет, как и чёткого набора описания плюсов и минусов, только на собственном опыте и в ходе разборок можно с этим разбираться.
    Нужно понижать порог вхождения в это дело.


    Всё это я к чему, ты работаешь над замечательной идеей, у которой есть превосходный потенциал. Но этим потенциалом можешь воспользоваться только ты.
    Сделай устойчивым вначале один язык, оформи к нему документацию, чтобы можно было воспользоваться полным пакетом благ. Под устойчивостью - я понимаю меньшее количество телодвижений, чтобы запустить скриптовое дополнение и минимальное количество телодвижений в поддержке актуальности (а то новая версия вышла - нужно переписывать).
     
    Последнее редактирование: 4 мар 2014
  11. Автор темы
    DPOH-VAR

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

    Баллы:
    153
    Skype:
    dpohvar
    Последнее редактирование: 22 мар 2014
  12. MYXOMOPX

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

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

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

    Баллы:
    153
    Skype:
    dpohvar
    Представляю вам еще одну безбашенную идею!
    PowerTower
     
    0bsid1 нравится это.
  14. StalkerStels

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

    Баллы:
    88
    Имя в Minecraft:
    STELS
    Можно ли на этом плагин сделать аномалии как в сталкере? А именно: игрок наступает на какой-нибудь блок, сверху блока появляется огонь, как от зажигалки, или же простой урон.
     
  15. Benseeley

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

    Баллы:
    123
    этим плагином можно всё сделать. вот сам и делай.
     
  16. StalkerStels

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

    Баллы:
    88
    Имя в Minecraft:
    STELS
    Судя по документации, я далеко пойду :)
     
  17. Benseeley

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

    Баллы:
    123
    удачки
     
  18. MYXOMOPX

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

    Баллы:
    78
    Skype:
    MYXOMOPX
    Имя в Minecraft:
    MYXOMOPX
    Пожалуйста. (код также лежит на pastebin)
    Код:
    import org.bukkit.Bukkit
    import org.bukkit.Location
    import org.bukkit.Material
    import org.bukkit.block.Block
    import org.bukkit.block.BlockFace
    import org.bukkit.command.Command
    import org.bukkit.command.CommandSender
    import org.bukkit.entity.Player
    import org.bukkit.event.player.PlayerMoveEvent
    import org.yaml.snakeyaml.DumperOptions
    import org.yaml.snakeyaml.Yaml
    
    import java.util.logging.Level
    
    List<Block> traps = []
    
    Yaml yaml = new Yaml(new DumperOptions(defaultFlowStyle: DumperOptions.FlowStyle.BLOCK))
    
    File playerStatsFile = new File(workspace.directory,"traps.yml")
    
    /** При старте загружаем все статы из файла **/
    playerStatsFile.createNewFile()
    playerStatsFile.withInputStream {
        try {
            List<HashMap<String,Object>> loadedList = yaml.load(it) as List<HashMap<String,Object>>;
            loadedList.each { HashMap<String,Object> el ->
                traps.add(new Location(Bukkit.getWorld(el.world as String),
                        el.x as double,
                        el.y as double,
                        el.z as double)
                        .block)   ;
            };
        }catch (ignored){
            Bukkit.getLogger().log(Level.WARNING,"[Traps] Can't load traps file!",ignored)
            workspace.stop()
        }
    }
    
    workspace.addFinisher({
        List<HashMap<String,Object>> listToSave = []
        traps.each {
            listToSave.add([x:it.location.x,y:it.location.y,z:it.location.z,world:it.location.world.name])
        }
        playerStatsFile.withOutputStream {
            String dump = yaml.dump(listToSave)
            try {
                it.write(dump.getBytes("UTF8"))
            } catch (ignored) {
                Bukkit.getLogger().log(Level.WARNING,"[Traps] Can't save traps to file!",ignored)
            }
        }
    })
    
    List<Player> damagedPalyers = [];
    
    workspace.addEvent({PlayerMoveEvent event ->
        if(damagedPalyers.contains(event.player) && !(traps.contains(event.to.block))){
            damagedPalyers.remove(event.player)
            return
        }
        if(traps.contains(event.to.block) && !(damagedPalyers.contains(event.player))){
            Player plr = event.player
            plr.setFireTicks(20*7)
            damagedPalyers.add(plr)
            plr.sendMessage("\u00A74You been trapped!")
        }
    },PlayerMoveEvent)
    
    workspace.addCommand("addtrap",{ CommandSender commandSender, Command command, String s, String[] strings ->
        if(!(commandSender instanceof Player)) return false;
        Player player = commandSender
        if(!player.hasPermission("trap.add")){
            player.sendMessage("\u00A74You have not permissions!")
            return true;
        }
        Block bl = player.getTargetBlock(null,10)
        if(bl == null){
            player.sendMessage("\u00A74Block not selected!")
            return true;
        }
        bl = bl.getRelative(BlockFace.UP)
        if(traps.contains(bl)){
            player.sendMessage("\u00A76This block already have trap!")
            return true;
        }
        traps.add(bl)
        player.sendMessage("\u00A7aTrap successful created!")
        return true;
    })
    
    workspace.addCommand("removetrap",{ CommandSender commandSender, Command command, String s, String[] strings ->
        if(!(commandSender instanceof Player)) return false;
        Player player = commandSender
        if(!player.hasPermission("trap.remove")){
            player.sendMessage("\u00A74You have not permissions!")
            return true;
        }
        Block bl = player.getTargetBlock(null,10)
        if(bl == null){
            player.sendMessage("\u00A74Block not selected!")
            return true;
        }
        bl = bl.getRelative(BlockFace.UP)
        if(traps.contains(bl)) {
            player.sendMessage("\u00A7aTrap successful removed!")
            traps.remove(bl);
        }else {
            player.sendMessage("\u00A76This block not trapped!")
        }
        return true
    })
    
    Сохранить в /plugins/VarScript/workspace/TrapBlock/Main.groovy
    (при отсутствии какой-либо директории - создать ее)

    Для добавления ловушки команда: /addtrap
    Для удаления - /removetrap
    В обоих случаях берется блок на 1 выше чем тот, на который смотрит игрок.
    Пермиты:
    trap.add - для добавления ловушки
    trap.remove - для удаление ловушки
    Все ловушки хранятся в traps.yml
    Если будет в консоль вываливаться "[Traps] Can't load traps file!" - думаю поможет удалить этот файл.
     
  19. StalkerStels

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

    Баллы:
    88
    Имя в Minecraft:
    STELS
    Благодарю
     
  20. Benseeley

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

    Баллы:
    123
    воу-воу-воу, круто.
    а можно метро, наподобие этого:
    https://forum.greencubes.org/viewtopic.php?f=195&t=20590
    https://wiki.greencubes.org/Блоки-контроллеры?
    это было б полезно очень, очень многим.
     
  21. EternalHuman

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

    Баллы:
    88
    Это из разряда: "Мы создали плагин, для написания плагинов, чтобы вам было удобнее их писать" А так плаг куул
     

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