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

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

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

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

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

    Баллы:
    153
    Skype:
    dpohvar
    Если только такой:
    SYSTIME %%start
    <какой-то код>
    SYSTIME @START - PRINT
    Получаем миллисекунды
    Насчет наносекунд - сделаю обязательно. Например NANOTIME

    @ptnk
    Секунды над курицей изменяются по задержке:
    <пишем текст тад курицей>
    20 TICKS
    <пишем ей другой текст>
    Задержка осуществляется с помощью BukkitTask - тут нет ничего страшного или тормозного.

    Смотрим далее..
    У нас есть набор(HashSet) куриц.
    На низком уровне регистрируется EntityDeathEvent и PlayerInteractEvent (их тут всего два)
    PlayerInteractEvent:
    если у игрока есть специфический предмет с определенными NBT тегами, читаем программу из тега, компилируем и исполняем ее.
    Программа, которую мы прочитали швыряет курицу и добавляет ее в HashSet
    EntityDeathEvent:
    если умершая курица была в HashSet, то взрываем ее и удаляем из набора.

    У каждого слушателя есть уже готовая к запуску функция, которую надо только пнуть, чтобы она запустилась. Когда нужно, функция получает пинок и переменную Event в придачу.

    Единственное, чего тут действительно много, это объектов BukkitTask в ожидании. Их количество равно количеству куриц. Как только курица сдохла, таски отрубаются в месте с ней. А потом их жрет gc.
    Но даже несколько сотен объектов BukkitTask никак не сказываются в плане производительности на моем слабеньком ноутбуке с запущенной IDEA в режиме дебага.
     
    Оригинало_о нравится это.
  2. Хостинг MineCraft
    <
  3. ptnk

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

    Баллы:
    173
    Это все очень интересно и позновательно, но для обычного пользователя это сложно (как и тот же lua на computercraft)
    Если хочешь подогреть интерес, то нужна система загрузки\сохранения с сайта и готовая баз скриптов.
    Для более продвинутого пользователя, кто может и знает какие-то азы, ну или там цикл просто сможет жахнуть - это покажется интересным.
    Для тех, кто знает и пишет плагины, это баловство. Я вот для себя не вижу, где это можно применить. Ведь это тоже самое, но в другой упаковке.
     
  4. ufes

    ufes Старожил Девелопер Пользователь

    Баллы:
    173
    Мелкие задачи намного удобнее будет реализовать скриптами, чем под каждую делать отдельный плагин. Или например если какой-нибудь эвент сервер, то удобнее для каждой игры написать скрипт, чем делать плагин.
     
  5. ptnk

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

    Баллы:
    173
    Если это маленькие писЮльки, то да, проще воспользовать скрипт в одну строку. Но при этом придется прочитать мануалы, ну или проглядеть, быстренько ознакомится с синтаксисом, найти и узнать как реализуется эта маленькая писюлька и сделать её. Но на данный момент не любую маленькую писюльку ты сделаешь из-за малохой дкоументированости.
    Ивенты всякие бывают, а вдруг понадобится разделение команд, подсчёт очков, игровой магазин, вывод очков справа я просто буду умиляться вашим скриптам и вашим приключениям по их отладке. (Или существует нормальный способ, как к этому делу подключиться, поставить точки останова и радоваться?).
     
  6. Автор темы
    DPOH-VAR

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

    Баллы:
    153
    Skype:
    dpohvar
    Для этого нужна хоть какая-то IDE, так то пишем скрипты в notepad++
    А вообще над вариантами дебага надо подумать.. Я оставил лазейку, чтобы подключиться в любой поток и приостановить его, но как это реализовать (через консольные команды) - вообще не представляю.


    Все преимущество варскрипта вот в чем:
    Захотелось найти все сундуки в локации и взорвать их... прямо сейчас!
    На написание плагина (даже с использованием библиотек) уйдет 10-30 минут.
    На варскрипте 30 секунд при хорошем знании команд, или 2-3 минуты с учетом поиска команд
    /> ME 50 SPHERE 54 BLOCKSID :{1 EXPLODE}
    Усложним задачу: сундуки, которые стоят сверху на дереве
    /> ME 50 SPHERE 54 BLOCKSID :SELECT{-1 BLOCKRELY BID 5 =} :{1 EXPLODE}
    или короче, но менее читабельно:
    /> 0 50 SPH 54 BSID :?{-1 BLRY BID 5 =} :{1 EX}
    или вместо взрыва ударим по ним молнией:
    /> 0 50 SPH 54 BSID :?{-1 BLRY BID 5 =} :{BOLT}

    Или же составляем модуль в файле, который ищет и взрывает блоки. А потом вызываем его:
    /> ME @ModuleName:destroyChests
     
    ufes нравится это.
  7. ptnk

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

    Баллы:
    173
    Да, прикольно, да забавно. Но все равно же получается, что кто-то реализовал некоторую универсальную функцию для поиска и перенес её на другой язык. Или оно само по себе всю жизнь умело искать в майне блоки с данным id?
    Преимущество в том, что это забавно и, возможно, этому школьника можно научить быстрее.
     
    ВремяПриключений нравится это.
  8. Автор темы
    DPOH-VAR

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

    Баллы:
    153
    Skype:
    dpohvar
    Добавлена команда SORT или SORTASC для сортировки списка по критерию, работает примерно так:

    /> MOBS:SORT{HP} PRINT - отсортирует игроков по уровню хит-пойнтов
    /> PLAYERS:SORT{NAME} PRINT - отсортирует игроков по алфавиту
    /> PLAYERS:SORT{NAME UPPERCASE} PRINT - то же, но без учета регистра

    Обязательное условие, чтобы внутренняя функция всегда возвращала объекты одного типа, которые можно сравнивать между собой.

    /> PLAYERS:SORT{HAND} - выдаст ошибку, потому что ItemStask нельзя сравнивать.
    /> PLAYERS:SORT{HAND ID} - Integer можно сравнивать. Отсортируются.
    /> [ 1 , 3.14 , 2 ]:SORT{} - Ошибка. Объекты разного типа: Double и Integer
    /> [ 1 , 3.14 , 2 ]:SORT{<Double>} - Во время сортировки все были приведены к Double. OK.

    Скорость сортировки низкая:
    /> SYSTIME ME 15 SPHERE :SORT{BY} SIZE . SYSTIME - .
    14.124 объектов - 1000 мс - 2 ядра по 1.8 ГГц
    14.124 объектов - 35 мс - 4 ядра по 3 ГГц
    /> SYSTIME ME 30 SPHERE :SORT{DROP RANDOM} SIZE . SYSTIME - .
    113.065 объектов - 6000 мс - 2 ядра по 1.8 ГГц
    113.065 объектов - 380 мс - 4 ядра по 3 ГГц

    Ну и еще одна команда: SORTDESC - работает аналогично, но сортирует в обратном подядке
     
    MineMan910, Jampire и ptnk нравится это.
  9. Jampire

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

    Баллы:
    173
    Skype:
    jampire-h
    Имя в Minecraft:
    Jampire
    Просто не перестаешь удивлять, столько всего нового...
     
  10. Автор темы
    DPOH-VAR

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

    Баллы:
    153
    Skype:
    dpohvar
    Первый пост этой темы обновляется по мере появления новых полезных материалов.
    Временно он будет "базой знаний" о плагине VarScript
    Сейчас я подготовил две инструкции а-ля Get Started :
    - Туториал: Использование команд
    - Туториал: Переменные. Чтение скрипта из файла
    Если кто желает помочь мне с тестированием плагина, добро пожаловать в эту тему.
    Скоро на dev.bukkit.org в паблике будет версия 0.5.3

    Добавлено:
    - Планировщик CRON
    - еще пара десятков команд
    Исправлено:
    - куча ошибок в командах
    - больше нет жесткой зависимости от PowerNBT (но всё-таки... они созданы друг для друга :D)
    - совместим с версиями 1.4.5 - 1.6.2

    Скоро выложу в паблик модуль RedstoneLagDetector (на замену плагина RedstoneClockDetector)
    http://www.rubukkit.org/threads/Доработка-плагина-redstoneclockdetector.44456
     
  11. Автор темы
    DPOH-VAR

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

    Баллы:
    153
    Skype:
    dpohvar
    Вот еще один полезный модуль: Regenerator.vs
    Он позволяет создавать снапшоты блоков, а затем их восстанавливать.

    Regenerator:snapshot ## List -> Snapshot
    создает снимок блоков
    Snapshot:regen
    восстанавливает блоки

    Количество снимков не ограничено, т.е. можно иметь два снимка одной территории.
    Восстанавливаются id и data блоков.
    Если есть плагин PowerNBT - восстанавливается всё.

    И вот пример использования:
    Записываем в переменную area все блоки в радиусе 30 от себя
    /> ME 30 SPHERE BLOCKS %area
    Создаем снимок блоков и записываем его в переменную snap1
    /> @area @Regenerator:snapshot %snap1
    Взрываем все вокруг нафиг! :D не забываем о gamemode
    /> ME 5 EXPLODE
    Создаем снимок наших развалин и записываем его в переменную snap2
    /> @area @Regenerator:snapshot %snap2
    Теперь можно переключаться между снимками:
    /> @snap1:regen
    /> @snap2:regen

    Видео от MYXOMOPX
     
    fromgate нравится это.
  12. obana3

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

    Баллы:
    88
    А можно скрипт с helljump? А то по первой ссылке некачает
     
    DPOH-VAR нравится это.
  13. Автор темы
    DPOH-VAR

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

    Баллы:
    153
    Skype:
    dpohvar
    Для версии 0.5 он еще не готов.
    Скорее всего HellJump будет тоже в виде модуля[DOUBLEPOST=1376504222,1376479077][/DOUBLEPOST]Добавлено:
    Туториал: Ветвления, циклы, обработка массивов
     
  14. obana3

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

    Баллы:
    88
  15. MYXOMOPX

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

    Баллы:
    78
    Skype:
    MYXOMOPX
    Имя в Minecraft:
    MYXOMOPX
    Демонстрация модуля ItemScript
    Оружия, которые мы использовали:
    Мина (TNT) - выбрасывается айтем, который взрывается при прикосновении или по цепной реакции
    Лук - Универсально оружие, имеет несколько режимов стрельбы:
    • Explode - Взрывные стрелы
    • Lighting - Стрелы, по которым бьет молния
    • Potions - Стрела, которая при приземлении дает игрокам в небольшой сфере плохие эффекты зелий
    • Teleport - Телепортирует игрока туда, где упала стрела
    • Snake - Запускает стрелу, которая взрывается пока летит
    • Random - Берет случайный мод из выше перечисленных
    C4- Запускает вагонетку которая взрывается по окончанию таймера. Можно взорвать детонатором нажав левую кнопку мыши.
     
    GrimJoy, fromgate и ufes нравится это.
  16. Автор темы
    DPOH-VAR

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

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

    Скачать: [pastebin]
    Зависимости: модуль PlayerSaver [pastebin]
    Требуется версия VarScript 0.5.4 или выше

    Сам модуль Helljump позволяет создавать новые арены для игры.
    /> @config @Helljump:makeArena %arena
    где @config - объект, содержит следующие поля:
    X,Y,Z,World - координаты центра арены
    Radius - радиус сканирования арены. Для арены 3x3 более чем достаточно радиуса 10
    Name - имя арены.
    В итоге в переменной arena мы получаем готовую игру.

    Начать игру можно так:
    /> @players @config @arena:start
    Тут параметры:
    @players - массив игроков
    @config - конфиг текущего раунда. не используется, пишем NULL

    Игра будет длиться до тех пор, пока последний игрок держится на арене.
    Можно завершить игру принудительно:
    /> @arena:stop

    Ну и пример, как это сделать в чедулере:
    Создаем задачу, которая нам создаст и настроит арену
    Код:
    enabled: true
    init:
    - VS OBJECT %config
    - VS 144 @config.>X
    - VS 78 @config.>Y
    - VS 180 @config.>Z
    - VS 10 @config.>Radius
    - VS "world" @config.>World
    - VS "First Arena" @config.>Name
    - VS @config @Helljump:makeArena RUNTIME.>FirstArena
    Теперь наша арена содержится в глобальной переменной @FirstArena
    И еще: создаем коммандблок с таким содержанием:
    Код:
    > PLAYERS ME 4 SPHERE SCAN NULL @FirstArena:start
    (просканировать игроков в радиусе 4 от блока, начать с ними игру)

    Теперь подходим с друзьями к этому блоку, активируем его и играем!

    [DOUBLEPOST=1376994430,1376929872][/DOUBLEPOST]Небольшая вводная инструкция о том, как создавать задачи:
    http://www.rubukkit.org/threads/45427/
     
    Hephest и MYXOMOPX нравится это.
  17. Sirse

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

    Баллы:
    173
    Имя в Minecraft:
    Sirse
    Мне кажется, или после релиза ReActions плагин стал разрабатываться куда активнее?
    Но плагин просто офигенен, поставлю в связке с ReActions, себе VarScript, админам ReActions )
     
  18. Автор темы
    DPOH-VAR

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

    Баллы:
    153
    Skype:
    dpohvar
    Да, кажется.
    Между плагинами мало общего (эх, заставил же сравнить...):
    VarScript - в первую очередь набор инструментов для вмешательства в игру. Он содержит свой собственный планировщик - как один из инструментов. И тут ты должен сам позаботиться о том, какое событие и как мониторить. Тебе предоставляется только мост к использованию Bukkit API.
    ReActions - сам по себе планировщик с моделью событие-условие-действие, с ограниченным числом команд. Он намного проще в изучении и использовании. Выбираешь активатор, потом выбираешь флаги, действия - и готово! Не нужно быть программистом или гиком - чем меньше вариантов команд тебе предоставляют, тем проще разобраться!
    Хотя если судить по тому, как fromgate добавляет новые фичи... вполне может быть, что его плагин тоже покроет весь Bukkit API (а то и до рефлексий дело дойдет :D )
    - - - - -​

    А теперь (барабанная дробь) ... то, ради чего когда-то создавалась тема про in-game JavaScript
    Встраиваем javascript в ядро плагина VarScript!

    /js> p = org.bukkit.Bukkit.getPlayer("Player")
    /js> p.setHealth(15)
    /js> function kill(e) { e.setHealth(0) }
    /js> kill(p)
    /js> importClass(org.bukkit.util.Vector)
    /js> p.setVelocity(new Vector(0,0.5,0))

    Сыровато еще... зато работает!
    вот аналог тех же действий на варскрипте

    /> "Player" <Player> %p
    /> @p 15 SETHP
    /> {0 SETHP} %kill
    /> @p kill
    />
    /> @p 0.5 THROW

    Уже следующая версия плагина выйдет с поддержкой javascript
     
    FedorNogopletov нравится это.
  19. Sirse

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

    Баллы:
    173
    Имя в Minecraft:
    Sirse

    Мне кажется что рефлексии будут слишком хардкорны :D
     
  20. Автор темы
    DPOH-VAR

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

    Баллы:
    153
    Skype:
    dpohvar
    Верно. Дать человеку доступ пермит на варскрипт - почти то же самое, что дать ему удаленную консоль от твоей машины.
    Можно, (хоть и сложновато...) я исходники держу открытыми.
    А какой в этом смысл? Разве что for fun
    Ради хардкора можешь подключить Rhino к ReActions, делается это легко, в несколько строчек.
    Код:
    ScriptEngineManager sem = new ScriptEngineManager();
    RhinoScriptEngine engine = sem.getEngineByName("JavaScript");
    engine.eval("jonny = org.bukkit.Bukkit.getPlayer('Jonny')");
    // ...
    engine.eval("jonny.kickPlayer('bye, Jonny!')");
    И опять же еще одна сумасшедшая идея для ReActions :cool:

    PS: Рино очень активно и умело использует рефлексии..
    Если не ошибаюсь, то даже проксифицировать объекты умеет (эх... мне бы прокси)
     
  21. Sirse

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

    Баллы:
    173
    Имя в Minecraft:
    Sirse
    Вот так всегда, сначала один язык, котом другой, потом Pascal, потом ассемблер :D
     

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