Войти или зарегистрироваться

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

мда.... норм, лайк
 
Модуль 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)
 
Скрипт для генерации островов: http://pastebin.com/yvGVnXjq
68f5c07e6309d3c45597749810a0be24.png

d43b5286dcffe4fe690056891550f65c.png

39e50b24237f958e50c37dce2a9f4320.png

fef867835b9e9e55e65818441d831f14.png

7512cfc341f9514cd98d656592d0cae4.png
Как использовать:
1)Создаем файл plugins/varscript/scripts/island.var и копируем в него текст с pastebin
2)Заходим в игру, строим небольшую площадку в воздухе.
3)Берем блок травы в первый слот, блок земли во второй слот и камень в третий.
4)Пишем />>f island
5)Нажимаем правой кнопкой мыши по нашей площадке.
6)Нажимаем левой кнопкой мыши по воздуху.
7)Остров готов!
можно это великолепие на последнюю версию? или же и так будет работать? и да, кинул джар-файл варскрипта в папку "плагины", запустил сервер, ничего не сгенерировалось... всё это делать в том же самом джарнике?
 
можно это великолепие на последнюю версию? или же и так будет работать? и да, кинул джар-файл варскрипта в папку "плагины", запустил сервер, ничего не сгенерировалось... всё это делать в том же самом джарнике?
Этот скриптик только для версии 0.4
Мобыть мы сделаем для 0.5, но на груви.
 
DPOH-VAR, жду-не дождусь, очень уж полезный скрипт!
 
Сейчас я совершенствую систему планировщика.
Будет работать он так:
В папке plugins/VarScript/scheduler располагаются директории events,conditions,actions с классами.
К примеру, файл plugins/VarScript/scheduler/events/CLICK.class будет отвечать за событие клика по блоку.
файл plugins/VarScript/scheduler/actions/BROADCAST.class будет отсылать сообщение всем игрокам

В папке plugins/VarScript/scheduler/tasks будут по старинке лежать yml файлы задач.

Пример: plugins/VarScript/scheduler/tasks/test.monitor.yml

enabled: true
description: Описание задачи
init:
- SET gm = SURVIVAL
events:
- CLICK 225 74 161 world
- CLICK 225 74 159 world
actions:
- BROADCAST "&cBlock is clicked? Arrrr!"
- BEAN $Player velocity = 2:2:2 gameMode = $gm health = 10
- BEAN $Block data=7


При нажатии на любой из двух блоков произойдет следующее:
- сообщение Block is clicked? Arrrr!
- игрок получит ускорение (2,2,2), игровой режим SURVIVAL, а также установит кол-во жизней в 10.
- блок, на который нажали, получит data = 7

PS:
А еще будет раздел reactions (запустится, если хотя бы одно условие оказалось ложным) :D:D:D
Посмотреть вложение 15471Посмотреть вложение 15471 Посмотреть вложение 15472 Посмотреть вложение 15473 Посмотреть вложение 15474 Посмотреть вложение 15475 Посмотреть вложение 15476 Посмотреть вложение 15477
 
Последнее редактирование:
Создаю репозиторий для модулей.
https://github.com/DPOH-VAR/VarScript/tree/master/groovy-modules
Тут можно найти свеженькие модули на груви.
На данный момент там имеются:
  1. NBTTools.groovy - полностью заменяет все функции PowerNBT. Позволяет работать с NBT-данными как с обычными хешмапами и списками.
  2. metaclasses.groovy - упрощает написание других скриптов. Однако для использования ее в модулях - нужно указать зависимость от metaclasses

Текущая версия работает с 1.7.2, полет нормальный)
 
Кстате, а можно любой диалект ЕКМЫ использовать? ActionScript можно?
 
Кстате, а можно любой диалект ЕКМЫ использовать? ActionScript можно?
Нет. Используется только тот, который установлен в вашей java-машине.
В большинстве случаев это движок Rhino 1.7R4, и он использует синтаксис javascript.
К тому же я не видел движка ActionScript, реализуемого на java-машине.
 
Кстате, а как можно использовать Jython с этим чудом?
 
Кстате, а как можно использовать Jython с этим чудом?
1) Скачать jar (ищите на офсайте)
~10 мегабайт
Убедиться, что внутри архива лежит метаинформация о службе
файл \META-INF\services\javax.script.ScriptEngineFactory
я использовал jython-2.7-b1.jar

2) Поместить этот файл в папку lib и запустить сервер
Советую добавить ключи перед запуском:
-XX:+UseConcMarkSweepGC -XX:+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled
Они изменяют поведение GC, чтобы он мог выгружать неиспользуемые объекты и классы.

3) Видим сообщение в консоли:
[23:23:24 INFO]: [VarScript] load jython 2.7.0
lang: python 2.7
name: python,jython
extension: py


4) Пользуемся!
Я не предусмотрел отдельной команды для работы с питоном, поэтому придется обращаться к нему по имени:
>->> jython Server.worlds[0].time
[23:23:24 INFO]: [VarScript] 17451

Можно юзать команды в игре:
/-> python команда
/->> python команда и вывод результата на экран


 
проблема в том, что я не смог найти jar
 
А разве это не инсталятор?
jython-2.5.4-rc1.jar - не инсталлятор.
Это именно тот jar, который нужен варскрипту.
PS:
jython при использовании создает немного мусора в директории lib\cachedir\packages\
У меня он занимает примерно 1.5Mb и периодически увеличивается.
 
Мусор я переживу. Просто многие просят Питоно-подобный синтаксис. И я подумал почем бы не использовать Питон?
 
Есть туториал по работе с mysql?
Запись данных в mysql?
 
Есть туториал по работе с mysql?
Запись данных в mysql?
varscript не имеет своих команд для работы с MySQL
Теоретически можно использовать механизм рефлексий, но это не удобно.

Я советую взять любой скриптовый движок и выполнить всю работу с MySQL на нем.
К примеру, подключить groovy и использовать JDBC (туториал)
То же самое можно сделать на JavaScript (он установлен по умолчанию), если есть определенные знания языка и особенностей движка Rhino.
 
У меня пишет, что нету прав на команду />
пермиссионов никакх не стоит

только через консоль пашет


upd:

:O с PEX не работает, как убрал - заработало
 
Последнее редактирование:
Написал модуль кастомных достижений!
  • Создание ачивки: /g> CustomAchievements.addAchievement("название","отображаемое название","описание")
  • Выдать игроку ачивку: /g> CustomAchievements.giveAchievement("ник игрока","название ачивки") P.S. если у игрока она уже есть - ничего не произойдет
  • Проверить ачивку у игрока: /g>> CustomAchievements.hasAchievement("ник игрока","название ачивки")
  • Показать игроку его ачивки: /g> CustomAchievements.selfListAchievements("имя игрока")
  • Показать ачивки игрока всем: /g> CustomAchievements.printListAchievements("ник игрока")
  • Показать игрку ачивки которые существуют: /g> CustomAchievements.selfAllAchievements("ник игрока")
  • Удалить ачивку: /g> CustomAchievements.removeAchievement("название ачивки")
Ставим на спавне нажимную плиту, под нее командный блок и пишем в него:
  • /g> CustomAchievements.selfListAchievements(" @p ".trim())
И когда игрок наступит - ему выведутся все его ачивки.
  • /g> CustomAchievements.selfAllAchievements(" @p ".trim())
При нажатии на плиту, игрок увидит все ачивки, которые вы создали.

Пишем в чат /g> CustomAchievements.addAchievement("SecretRoom","Secret room! ^_^","Find the secret room").
Делаем секретную комнату, в ней ставим кнопку, командный блок, в который пишем:
  • /g> CustomAchievements.giveAchievement(" @p ".trim(),"SecretRoom")
При нажатии на эту кнопку, игрок получит ачивку. ^_^
в архивах уже есть 5 созданных мной достижений.
This is MINECRAAAFT - столкнуть кого-нибудь с обрыва так, что-бы он умер!
But.. you tried D: - сломать алмазную руду золотой киркой.
Nice trick: - спрыгнуть на лошади в небытие.
Munchausen!: - скрафтить любой фейерверк из плагина Munchausen Fireworks.
Steep miner!: - быть в 5 блоках от взрывающегося TNT и не смотреть на взрыв.
Может быть чуть позже добавлю обычные команды (/customachievement give...)
 
Назад
Верх