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

Перечитал всю тему, плагин меня крайне заинтересовал именно из-за того, что возможности его применения зависят лишь от фантазии.
У меня возникло пара вопросов, скорее организационных:
1) Что стало с викой? ( http://diggers.no-ip.org/wiki/ )
2) Много раз упоминается модуль ItemScript, да же в шапке есть видео его использования, но там же в шапке нет его в списке модулей. Можно его где-то сейчас найти? (Поиск по форуму не дал рабочей ссылки)


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
Подробнее можно прочитать тут.
 
Релиз мини-игры 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
​
 
Я походу был прпв, что этот плагин может заменить все остальные.
 
Я походу был прпв, что этот плагин может заменить все остальные.
Ну разве что ProtocolLib он не сможет заменить.

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

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

Я хотел использовать PlayEffect API, но в нем нет детальной настройки эффектов
спасибо. интересно. посмотрю.
 
А каким образом можно реализовать команду на пермишенсы?
Например:
Если игрок вы брал класс "archer", добавить его в группу "archer" в пермишенсах.
 
А каким образом можно реализовать команду на пермишенсы?
Например:
Если игрок вы брал класс "archer", добавить его в группу "archer" в пермишенсах.
Первый способ, самый простой:
"pex user " @player S+ " add rpg.archer" CONSOLE %%result
Этой командой мы заставим консоль принять команду для pex
@player - игрок, которому выдаем пермиты
@result - текстовый ответ консоли на команду

Способ №2:
Используйте Vault API или API своего плагина пермитов.
Плагин можно вызвать через команду @ИмяПлагина, а остальное - рефлексиями.
 
Немного поподробнее напишу, потому что запутался в плагине.
Задача:
Игрок при входе на сервер выбирает класс Archer (любой игрок). Его автоматически перекидывает из группы Default (в которой он был на сервере до выбора класса) в группу Archer в Пермишенсах (я использую плагин GroupManager от Essential).
 
Немного поподробнее напишу, потому что запутался в плагине.
Задача:
Игрок при входе на сервер выбирает класс Archer (любой игрок). Его автоматически перекидывает из группы Default (в которой он был на сервере до выбора класса) в группу Archer в Пермишенсах (я использую плагин GroupManager от Essential).
Давай еще подробнее.
1 - как игрок будет выбирать класс?
2 - ограниченное число классов или нет?
3 - может ли игрок забить на это, и не выбирать класс?
4 - Можно ли добавить игрока в группу через консоль? Какой командой?
 
1. Это делает плагин RP Classes (есть на ведре). Командой /classes pick [class].
2. Количество классов - 5
3. Если он не выбирает класс, он не может сдвинуться с места и ничего использовать кроме чата.
4. Через консоль похоже нельзя. Но можно через конфиг-лист.
 
1. Это делает плагин RP Classes (есть на ведре). Командой /classes pick [class].
2. Количество классов - 5
3. Если он не выбирает класс, он не может сдвинуться с места и ничего использовать кроме чата.
4. Через консоль похоже нельзя. Но можно через конфиг-лист.
Ага. и я запутался. пиши в скайп.
Теперь покажу фокус-покус на варскрипте :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
 
Последнее редактирование:
Гайд по рефлексиям когда стоит ждать?
 
Гайд по рефлексиям когда стоит ждать?
Я совсем забыл про них!
Продолжу пополнять список туториалов... прямо сейчас!

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

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

PHP как-то упорото выглядит в майне, почему-то не понравилось на нём что-то делать.
Крутил-ставил разные движки, но больше всего понравился Groovy.
 
Обновляю плагин до версии 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 будет потихоньку обновляться и обрастать новыми методами и функциями.
 
Последнее редактирование:
Гайд по использованию groovy в плагинe VarScript

Данный туториал рассматривается для VarScript версии 0.5.7
в 99% случаев любая программа, написанная на java, запускается на движке groovy. Это позволяет использовать готовые решения и классы java для создания своих скриптов

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
 
Могу ли я использовать XTend с этим плагином?
 
Назад
Верх