Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Плагин [MECH/FUN] ReActions - Что? Тогда? Иначе! [BukkitDev]

fromgate

Старожил
Пользователь
Баллы
173
Имя в Minecraft
fromgate
ReActions

Плагин ReActions представляет собой инструмент обработки событий. Он позволяет проверять выполнение условий и, в зависимости от результата проверки, выполнять разные действия.

Скачать плагин
BukkitDev

Последний dev-build

Подробности о ищите читайте на последних страницах темы

Инструкция к плагину (на английском)


О разработке плагина (и участии в проекте)

В настоящее время в разработке плагина участвуют:
Исходные коды размещены на GitHub'е и, соответственно, каждый желающий может принять участие в развитии плагина.

При этом не обязательно программировать — мы будем признательны и за помощь с документацией.


Что такое ReActions
ReActions – инструмент добавления новых свойств предметам, кнопкам и... событиям. Можно задать действия, выполняемые при нажатии на кнопку или сундук. Можно изменить положение рычага или телепортировать игрока в другое место. Можно проверить, в каком месте находится игрок, и выдать ему зачарованный предмет в награду за убийство босса. Ах да! И босса-моба тоже можно заспавнить... ReActions может взаимодействовать со сторонними плагинами (Vault, Factions, Town и т.д.), чтобы привнести возможность нестандартного использования их возможностей или дать вам более гибко и полно настраивать параметры игрока. К примеру, можно настроить оплату за проход по территории или открытие сундуков и дёргание рычагов. Можно выполнять какие-то дополнительные действия при смене игроком фракции (из плагина Factions) или установить игроку принадлежность к какому-то городу (из плагина Towny).

И всё это без необходимости изучения скриптовых языков. Нужно лишь несколько минут, чтобы понять принцип действия ReActions, чтобы затем остаться ограниченным лишь своей фантазией.

Функционал
  • Возможность проверки множества различных условий (флагов): разрешения (permissions) или группы, количество денег у игрока, наличие предмета в инвентаре, в руке, на игроке и т.п.
  • Выполнение различных действий. Можно применить к игроку эффект зелья, отобразить визуальный эффект, телепортировать игрока куда-то, выполнить команду другого плагина и т.д.
  • Можно подписать активатор на различные виды событий. Нажатие кнопки или использование рычага, вход и выход из региона WorldGuard и т.д.
  • Встроенный планировщик (таймеры), выполняющий активаторы в определённое время по часам сервера или игрового мира однажды или периодически.
  • Поддержка MySQL, благодаря чему вы сможете максимально плотно связать игровой мир с сайтом, приложениями или другими плагинами.
Что я могу сделать используя ReActions?
Вот простые примеры:
  • Систему платных телепортов (причем платой могут выступать как предметы так и деньги), поддерживающую время отправления и пермишены игрока. Например, можно сделать телепорт который будет работать только днём и в качестве платы будет принимать алмазы.
  • Простейшие магазины для продажи предметов (или наборов). Например можно продавать полный набор алмазной брони простым нажатием на кнопку.
  • Создание ветвлений в квестах. Например, игрок прошедший через регион с мечом в руках попадает в локацию где ему надо сражаться с монстрами, а без меча телепортируется куда-то в другое место.
  • Выполнение команд других плагинов значительно расширяет возможности. Посмотрите видео с плагином ScLoad: при нажатии а кнопку можно возводить целые строения.
  • Вообще, как всегда главное проявить фантазию. Я уже встречал такое применеие ReActions, о котором просто не мог помыслить.
Видео-демонстрация
Видео, которое бы демонстрировало, все возможности ReActions создать невозможно. Поэтому по мере сил я снимаю небольшие ролики, которые демонстрируют те или иные функции.


Взаимодействие с другими плагинами
ReActions может взаимодействовать со следующими плагинами:
  • Vault- групповые политики прав и экономика.
  • WorldGuard - необходим для использования регионально привязанных активаторов.
  • Towny - можно перемещать игроков между городами, проверять принадлежность игрока к городу.
  • Factions - можно подписывать активаторы на события изменения фракций, изменять принадлежность игрока к фракциям.
  • RacesAndClasses - можно проверять принадлежность игрока к расам и кланам и изменять её.
  • PlayEffect - воспроизведение эффектов частиц.
  • Craftconomy3 - продвинутые возможности экономики, многовалютность.
Metrics и проверка обновлений
ReActions включает в себя две функции, которые предполагают доступ к внешним интернет-узлам.

Во-первых, это сервис Metrics, который используется для сбора статистики (версия плагина, ОС, Java и т.п.).
Во-вторых, это проверка обновлений ReActions, которая производится после запуска плагина, и в дальнейшем каждые полчаса. Эта функция основана на стандартном API dev.bukkit.org.
Обе эти функции можно отключить. Проверка обновлений отключается прямо в файле config.yml - "version-check" (false - для отключения). Узнать больше о Metrics и том, как отключить этот сервис, можно тут.

Древняя история
Этот плагин переписывался полностью два раза. Изначально он разрабатывался как замена плагину VoxelPort (был необходим плагин реализующий платную транспортную систему), но в процессе я понял, что расширять функционал плагина можно практически бесконечно.

Благодарности
  • ValeraSTK — за истинную приверженность к ReActions, за "боевое тестирование" и множество идей, без которых ReActions был бы маленьким и глупым ;)
  • КириллН — за безумно огромную работу по приведению документации в человеческий вид, за свежие и интересные идеи.
  • Разработчикам на RuBukkit и BukkitDev, за советы, идеи и подсказки. Имён называть не буду — их очень много (но Galaran, DPOH-VAR, Ission должны понимать, что это относится в первую очередь к ним).
  • @Lyosha12 — за огромную помощь в тестировании и множество идей (пусть не все удается реализовать ;))


Плагин понравился?
По старинной русской традиции принимаю донат шоколодками. Ну или на PayPal ;)



Или посредством Яндекс.Денег или пластиковых карт:



ReActions разрабатывается с использованием Jetbrains IntelliJ IDEA

 
Последнее редактирование:
Наконец-то у меня дошли руки сделать подробную инструкцию. Возможности форума (и BukkitDev) не позволяют опубликовать её "не отходя от кассы".

Поэтому я решил сделать отдельную веб-страницу, где можно было бы прочитать как пользоваться ReActions.

Инструкция на русском (перевод пока ещё не полный):
http://reactions.fromgate.ru/

Инструкция на английском:
http://reactions.fromgate.me/

 
Последнее редактирование:
Быстрые, невидимые зомби:

Перезаряжаем TNT-пушку

Настенные часы:

Регенерация шахты:
 
Последнее редактирование:
Определенно сей лакомый кодовый тортик попадет на мой нубосервер! По идее, облегчит некоторую работу на сервере в разы. Спасибо.
 
Ещё один шедевр от fromgate. Даже название темы как название книги великих писателей, просто невозможно пройти мимо.
Конечно не varscript от dpohvar, но зато работает.
 
Спасибо, конечно :)

Небольшое обновление:
  • Добавлено действие снятия эффекта зелья - rmvpotion в качестве параметра указываем через запятую все эффекты которые хотим снять или пишем "all" для снятия всех эффектов.
  • Расширена команда /react remove - теперь можно удалять отдельный флаг, действие или реакцию по номеру в списке. Т.е. /react info <активатор> смотрим, допустим номер действия msg в группе actions. И удаляем его /react remove <активатор> a <номер>

Ну и небольшая демонстрация региона в пределах которого действуют эффекты blindness и jump. При выходе - эффекты удаляются:

В файле настроек эти активаторы выглядят так:
Код:
rgleave:
  jout:
    region: jumper
    flags: []
    actions:
    - rmvpot=ALL
    - msg=&4OUT!
    reactions: []
rgenter:
  jin:
    region: jumper
    flags: []
    actions:
    - potion=blindness/100000/10
    - potion=JUMP/100000/10
    - msg=&2IN!
    reactions: []
 
fromgate О!! Как раз этого мне сейчас не хватает в варскрипте :D
Принимаются предложения по:
  • Типам активаторов
  • Флагам
  • Действиям
Охх.. сейчас засыплю идеями)
Активаторы:
  1. Предмет. чтобы можно было создать некий "кристалл телепортации"
  2. Entity. то есть мы кликаем по NPC и что-то происходит
  3. button, plate ... почему бы не сделать один универсальный? просто block. Или даже leftclickblock, rightclickblock
Флаги:
  1. inregion (если добавишь предметы)
Действия:
  1. сброс PotionEffects (опоздал постом)
  2. наоборот, добавить какой-либо
  3. setVelocity (встал на платформу, подбросило вверх или на верхний этаж)
  4. еще супер-огромная куча) Не буду заваливать
Не будет ли баг при использовании:
/ra add<название активатора> f item MAP:127
/ra add<название активатора> f item STONE
т.е. карту уже забрали за оплату, потом ищем камень... не нашли. %противодействие%


PS: А в целом - очень даже интересный способ обработки событий (копаюсь в коде ;))
 
Предмет. чтобы можно было создать некий "кристалл телепортации"..........
Это в TODO уже года полтора ;) У меня была идея написать плагин на свитки - карта с определённой картинкой вызывает действия. Не стал писать плагин, когда понял, что это будет функцией ReActions :)

Дополнение: Уже реализовано в виде активатора ITEM_HOLD

Entity - тоже продумывал. Возможно даже буду добавлять отдельные флаги на стукнутого игрока и т.п. ;)
Я даже приятелю описывал потенциал плагина так: "стукнуть в полночь крипера деревянным мечом в глаз...." ;)

Button и Plate разные - это временно. Просто всё начиналось c button :)
А вот клик блока блок добавлять буду однозначно отдельно — хочу потом добавить действие на отмену (или включение) события.

inregion - про это не думал, но однозначно пригодится :)

Попытка проверки двух предметов в руке однозначно даст ошибку. Точнее это всегда будет false, т.е. отработает reaction.
соответственно можно комбинировать. Группа флагов item MAP:127 invitem STONE*64 invitem WOOL:5*20 сработает если есть в руке карта №127, а шерсть (нужного цвета и количества) и камни (стак) - в инвентаре.
 
Последнее редактирование:
Я гдето видал буржуйский аналог, и очч давно.
Но надеюсь это тоже достойная работа, буду тестить
 
  • spawnmob <моб>/<локация>
вот так неплохо было бы сделать. Моба предлагаю читать из заранее созданной nbt-свертки, или просто по имени
  • setblock <blockdata>/<локация/регион>
опять же, blockdata можно читать из свертки, чтобы можно было ставить абсолютно кастомные блоки.
  • wait <секунды/тики>
(если возможно) задержка на выполнение всех последующих действий.
actions:
- msg=&4Телепортация через 5 секунд!
- wait=100t
- tp=location
 
@DPOH-VAR,
Ага, мобов точно буду спавнить. Единственное хочу это сделать после того как немного допилю доп.параметры для локации, чтобы можно было задавать рэндомный радиус вокруг точки.
Кроме того, хочу команду на "заполнение" региона мобами до заданного количества (хотя возможно для таких целей лучше сделать отдельный плагин и просто вызывать по команде). Т.е. к примеру в регионе ходит 10 криперов, а надо 20 - спавнится только 10. Если регион пуст - спавнятся все 20.

setblock... возможно.. Мы когда квесты мучали использовали rgfill (начинал плагин я, но там уже наш Galaran много натворил, моего кода наверное и не осталось ;))

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

Если вспомните — давайте ссылку или название, с удовольствием опробую.
Я пока встречал только скриптовые: VariableTriggers ну и VarScript, естественно. А именно скриптовости я хотел избежать. Чтобы всё было просто как на бейсике или паскале: IF THEN ELSE и никаких гвоздей ;) Т.е. я даже не стал пытаться впихнуть в структуру подобие OR, даже NOT (которое можно получить подставив перед именем флага восклицательный знак) изначально не планировалось. Но оказалось, что без этого сложно обойтись.
 
fromgate
Нужно добавить if , while , return , goto , подобие переменных , рефлексии ...
да будет FromgateScript! :D
Наверное две самые важные команды:
  • chat=/home
  • command=/kick player
первая исполняет команду от имени игрока. вторая - от имени сервера.
Можно еще придумать - от имени игрока, но с наивысшими правами.
Если добавишь что-нибудь новое, сразу публикуй.
 
там уже есть cmdplr, cmdsrv и cmdop :) вообще в ближайшее время особо нового ничего не будет — буду переводить описание плагина на английский.
v0.1.0
  • Релиз. По сравнению с предыдущим билдом: добавлена проверка версий и Metrics.
Итак, я решился-таки выложить на BukkitDev
http://dev.bukkit.org/bukkit-plugins/reactions/
http://dev.bukkit.org/media/files/719/524/ReActions.jar
 
Высер при отсутствии Vault:

2013-07-19 19:19:25 [SEVERE] Error occurred while enabling ReActions v0.1.0 (Is it up to date?)
java.lang.NoClassDefFoundError: net/milkbowl/vault/permission/Permission
at me.fromgate.reactions.ReActions.setupPermissions(ReActions.java:122)
at me.fromgate.reactions.ReActions.onEnable(ReActions.java:99)
at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:217)
at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:396)
at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:383)
at org.bukkit.craftbukkit.v1_5_R3.CraftServer.loadPlugin(CraftServer.java:314)
at org.bukkit.craftbukkit.v1_5_R3.CraftServer.enablePlugins(CraftServer.java:296)
at net.minecraft.server.MinecraftServer.func_71243_i(MinecraftServer.java:465)
at net.minecraft.server.MinecraftServer.func_71222_d(MinecraftServer.java:431)
at net.minecraft.server.MinecraftServer.func_71247_a(MinecraftServer.java:382)
at net.minecraft.server.dedicated.DedicatedServer.func_71197_b(DedicatedServer.java:214)
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:574)
at net.minecraft.server.ThreadMinecraftServer.run(SourceFile:573)
 
@Sirse, О! Спасибо! Исправлю. Честно говоря, даже не пробовал без Vault'а запускать :)
 
Ещё порция дебага:
Происходит при нажатию на кнопку, на которую повешан тп на локацию в другом мире из ModifyWorld.

2013-07-21 08:06:05 [SEVERE] Could not pass event RAButtonEvent to ReActions v0.1.0
org.bukkit.event.EventException
at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:363)
at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62)
at org.bukkit.plugin.TimedRegisteredListener.callEvent(TimedRegisteredListener.java:47)
at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:479)
at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:464)
at me.fromgate.reactions.EventManager.raiseButtonEvent(EventManager.java:53)
at me.fromgate.reactions.RAListener.onPlayerInteract(RAListener.java:83)
at sun.reflect.GeneratedMethodAccessor43.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:361)
at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62)
at org.bukkit.plugin.TimedRegisteredListener.callEvent(TimedRegisteredListener.java:47)
at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:479)
at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:464)
at org.bukkit.craftbukkit.v1_5_R3.event.CraftEventFactory.callPlayerInteractEvent(CraftEventFactory.java:189)
at net.minecraft.item.ItemInWorldManager.func_73078_a(ItemInWorldManager.java:541)
at net.minecraft.network.NetServerHandler.func_72472_a(NetServerHandler.java:874)
at net.minecraft.network.packet.Packet15Place.func_73279_a(SourceFile:58)
at net.minecraft.network.TcpConnection.func_74428_b(TcpConnection.java:442)
at net.minecraft.network.NetServerHandler.func_72570_d(NetServerHandler.java:222)
at net.minecraft.network.NetworkListenThread.func_71747_b(NetworkListenThread.java:53)
at net.minecraft.server.dedicated.DedicatedServerListenThread.func_71747_b(SourceFile:30)
at net.minecraft.server.MinecraftServer.func_71190_q(MinecraftServer.java:847)
at net.minecraft.server.dedicated.DedicatedServer.func_71190_q(DedicatedServer.java:320)
at net.minecraft.server.MinecraftServer.func_71217_p(MinecraftServer.java:716)
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:600)
at net.minecraft.server.ThreadMinecraftServer.run(SourceFile:573)
Caused by: java.lang.NullPointerException
at me.fromgate.reactions.RALoc.locactionToStringFormated(RALoc.java:96)
at me.fromgate.reactions.Actions.performAction(Actions.java:81)
at me.fromgate.reactions.Actions.executeActivator(Actions.java:62)
at me.fromgate.reactions.activators.ButtonActivator.activate(ButtonActivator.java:68)
at me.fromgate.reactions.activators.Activators.activate(Activators.java:272)
at me.fromgate.reactions.RAListener.onButton(RAListener.java:111)
at sun.reflect.GeneratedMethodAccessor148.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:361)
... 27 more

Ядро MCPC+ Legacy (1.5.2), тестирую без Vault и прочих зависимостей (WG нет в том числе)

Так же небольшая проблема в переводе - например, я добавляю сообщение игроку красного цвета. В результате, уведомление выглядит так:
Действие добавлено: msg ("Добро пожаловать в WOD!")
(Перед закрывающими кавычками пропущен цветовой код)
Аналогичная проблема и в уведомлений, приходящему цели после выполнения действия:

"Добро пожаловать в WOD!"
 
скорее всего не отрабатывает метод Bukkit.getWorld(имя) вечером скомпилирую версию для теста
@Sirse, попробуйте пожалуйста эту версию:
https://dl.dropboxusercontent.com/u/64799811/ReActions/003/ReActions.jar

- Не должно ругаться на отсутствие Vault
- По идее должно телепортировать без ошибок (скажите только, что будет писать в чат - как выведутся координаты точки телепортации)
 

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

Назад
Верх