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

а что на счет дыхания под водой?
Создать задачу, которая исполняется, например, с периодом в 20 тиков\\
Она сканирует всех игроков.\\
для каждого игрока:\\
{\\
если у него стекло на голове\\
и у этого стекла имя = "скафандр"\\
установить кол-во пузырьков в максимум\\
}\\
Можно не беспокоиться о быстродействии и сделать период даже в 1 тик. Но это лишнее. Пойдет и 20.\\
 
когда будет порт на 1,4,6?
В конце этой недели возьмусь.
Сейчас хвосты надо сдавать, а я бездельник, тунеядец и пофигист :D
Если не терпится, то сразу как сяду за него, выпущу фикс (версию 0.4.0.1) - для работы на новом CB. функционал отличаться не будет.
А вообще надеюсь в этом году выпустить полноценный 0.4.1 (с блекджеком и nbt-редактором), где-нибудь 31го числа.. В крайнем случае он будет после новогодних праздников.
 
Как и обещал.
Вот ссылка
https://docs.google.com/open?id=0B50fBoyxANzsUzJTaS1kQnhIaHM
Версия 0.4.1
Точнее это порт старой версии на CB 1.4.6
Я решил не заморачиваться, и просто удалил функции из за которых плагин не запускался.
  • Не работают команды с предметами (/vsitemsave /vsitemload /vsitem />fi и т.д.)
  • Отключен встроенный NBT редактор
  • Отключены функции переименования предметов, изменения книг, черепов.
Остальной функционал в порядке.

Дальнейшие планы:
Глобальное обновление для версий 0.5.х
Как всегда, меня не устраивает текущий вариант, если можно сделать намного лучше :cool:
Будет общий Runtime для всех программ на сервере, с постраничным выделением памяти
Пытаюсь сделать еще строенный оптимизатор потребляемой памяти (что-то вроде garbage collection)
Из новых фишек будет возможность передавать объекты между программами, делать вызов любых процедур из общей памяти.
Переделаю конвертер типов.
Много фишек в направлении RPG
API
Будут закрытые исходники :D
И еще может сменю название.
 
Скрипт для генерации островов: 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)Остров готов!
 
Скрипт для генерации островов: 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)Остров готов!
Добавлю..
Во первых:
Генерируются только летающие острова. При попытке генерировать остров в воде - скорее всего он уйдет глубоко под землю и выскочит корнем с высоты 256 блоков. При попытке сделать такой невысоко над землей - возможно будет тот же эффект.
Во вторых:
Можно изменить материал для построения острова.
В первом слоте инвентаря - верхний слой острова, во втором - промежуточный (глубина 2-3 блока) и в третьем слоте - основной материал. Ледяные острова или из песка и песчаника - запросто!
И на последок:
Многие любят говорить о "Это какая же аццкая нагрузка на сервер!"...
Генерировать остров скриптом получается в 10-50 раз быстрее, чем скопировать его же ворлдедитом.
Нам удалось сделать остров размером 200x200x500. Примерно секунд за 30 он был готов :). Несколько раз обошел циклично высоту карты. Острова, которые на скриншотах, были сделаны быстрее, чем за секунду.
 
VARSCRIPT: IllegalArgumentException No enum constant me.dpohvar.varscript.utils.event.BukkitListenerFormer.EventType.PlayerInteract
а я только пытался написать >>f island, всё по инструкции
 
VARSCRIPT: IllegalArgumentException No enum constant me.dpohvar.varscript.utils.event.BukkitListenerFormer.EventType.PlayerInteract
а я только пытался написать >>f island, всё по инструкции
версию сервера и плагина плз.
скрипт для varscript 4.1
для 4.0 немного по другому:
нужно
REG(PlayerInteract)
заменить на
REG(INT) или REG(INTERACT)
 
Погорячился я насчет версии 0.5
Возможно заброшу разработку Varscript в пользу этого.
 
Скоро будут незначительные изменения в синтаксисе.
Вот нынешняя идея:

1 Локальная среда исполнения для каждого игрока.​
​
Переменные будут сохраняться в среде, причем независимо от языка (Varscript, JavaScript или любой другой)​
т.е. можно будет прописать:​
/> 10:20:30 "Zombie" SPAWNMOB %mob​
/js mob.setHealth(15);​

2 ООП + прототипное наследование​

В основе языка лежит стек данных, очередь команд и набор переменных. Достаточно сложно будет добавить объекты в его конструкцию. Пример под спойлером
Глупо будет применять такие конструкции для исполнения в чате. Однако в связи с тем, что среда исполнения сохраняется (у нас есть доступ к объекту в любое время) - можно использовать объекты, построенные ранее, например вызовом скрипта из файла или любого объекта, способного содержать скрипт.
Вот наброски:
Код выбирает некоторую платформу из блоков, затем разрушает ее.
Код:
Platform: {
    Blocks: <ARRAY
    Destroy: {
        @Blocks { 0 SETBLOCK DROP } EACH
    }
    THIS
}
ME 5 SPHERE Platform %pl1
ME 6 SPHERE Platform %pl2
@pl1.Blocks %b1
pl1.Destroy
1 WAIT
pl2.Destroy
Platform: { ... } - это конструктор платформы. Точнее, полю "Platform" присваивается новая функция-конструктор
Blocks: <ARRAY - записать в поле Blocks текущего объекта значение из стека, преобразованное в массив
Destroy: { ... } - записать в поле Destroy функцию, которая разрушает блоки
THIS - вернуть объект (а не просто выполнить функцию)
ME 5 SPHERE Platform %pl1 - берется сфера из блоков вокруг игрока (радиус 5 блоков), затем создается объект-платформа и записывается в переменную "pl1". Т.к. поля pl1 нет у данного объекта, значение записывается в глобальную область видимости, доступную всем скриптам и языкам у данного игрока/того кто вызвал код.
ME 5 SPHERE Platform %pl2 - аналогично, платформа радиусом в 6 блоков записывается в "pl2"
@pl1.Blocks %b1 - поле "Blocks" объекта pl1 записывается в переменную b1
pl1.Destroy - вызывается метод Destroy объекта pl1 (блоки платформы уничтожаются)
1 WAIT - ждем секунду
pl2.Destroy - уничтожаем вторую платформу
А суть всё та же:
val %var - запись в переменную (или поле)
@var - чтение переменной
Насчет наследования - пока не решил. И надо ли оно?
 
Генерировать остров скриптом получается в 10-50 раз быстрее, чем скопировать его же ворлдедитом.
Нам удалось сделать остров размером 200x200x500. Примерно секунд за 30 он был готов :). Несколько раз обошел циклично высоту карты. Острова, которые на скриншотах, были сделаны быстрее, чем за секунду.

Поделись навыками! :) Вчера полдня бился: обрабатываю большую территорию.
В цикле надо пройтись по площади 1000х1000 -- все нормально, обрабатывается за 30 секунд. Правда игроков выкидывает с сервера ;)

Тем же циклом (там частично оптимизировано - блоки сгруппированы по чанкам, пока чанк не обработается к другим блокам не перехожу) охватываю территорию 2000х2000 - всё. Вешалка. Сервер виснет минут на 10, после чего переполнение памяти.

Сейчас вот думаю разбиваь на группы, скажем по сотне чанков и обрабатывать последовательно. Но.. как-это ненормально.

Как у тебя обрабатываются массивы чанков? Есть какой-то "секрет"?
 
Поделись навыками! :) Вчера полдня бился: обрабатываю большую территорию.
В цикле надо пройтись по площади 1000х1000 -- все нормально, обрабатывается за 30 секунд. Правда игроков выкидывает с сервера ;)

Тем же циклом (там частично оптимизировано - блоки сгруппированы по чанкам, пока чанк не обработается к другим блокам не перехожу) охватываю территорию 2000х2000 - всё. Вешалка. Сервер виснет минут на 10, после чего переполнение памяти.

Сейчас вот думаю разбиваь на группы, скажем по сотне чанков и обрабатывать последовательно. Но.. как-это ненормально.

Как у тебя обрабатываются массивы чанков? Есть какой-то "секрет"?

Сейчас у меня дела обстоят так:
Цикл проходит по чанкам в основном потоке. Примерно через каждые 2 секунды выполнение останавливается, проходит 10-20 серверных тиков, затем обработка возобновляется. Этот перерыв нужен, чтоб игроки не повылетали с сервера и не очень-то замечали лаги. Можно увеличить время исполнения цикла до 5 секунд - но лаги будет заметно. Больше 15 секунд - грозит вылетом игроков.
Желательно максимально упростить код в цикле. Т.е. не вычислять внутри, какой ID блока нужен, а сразу брать из уже готового массива.

Раньше я использовал асинхронный вариант - т.е. менял блоки в параллельном потоке. Перерыв не требовался, но был огромный риск получить ConcurrentModificationException.

Будет беда, если недалеко находятся игроки) Поэтому ради оптимизации я с помощью скрипта убираю их с территории. Вся проблема в том, что сервер генерирует огромную кучу пакетов (изменения для каждого блока) и передает игрокам. Была идея на самом деле, как сделать замену блока без перессылки пакета (через рефлексии), но провалилась благодаря постоянным крашам буккита.
 
Сейчас у меня дела обстоят так:
Цикл проходит по чанкам в основном потоке. Примерно через каждые 2 секунды выполнение останавливается, проходит 10-20 серверных тиков, затем обработка возобновляется. Этот перерыв нужен, чтоб игроки не повылетали с сервера и не очень-то замечали лаги. Можно увеличить время исполнения цикла до 5 секунд - но лаги будет заметно. Больше 15 секунд - грозит вылетом игроков.
Желательно максимально упростить код в цикле. Т.е. не вычислять внутри, какой ID блока нужен, а сразу брать из уже готового массива.

Понятно. Я вот тоже к этому прихожу. С одной стороны задержка увеличит время выполнения, с другой стороны, чанки которые надо выгрузить - выгрузятся и не будет переполнения памяти.
 
Назад
Верх