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

Девбилд 0.9.4/18
На мой взгляд, вполне работоспособный, но тесты не помешают.

Изменения:
1. Полностью переработан механизм работы с плейсхолдерами. С точки зрения пользователя плагина - все также, изменения внутренние, направлены на оптимизацию, улучшение распознавания плейсхолдеров (особенно вложенных).
2. Плейсхолеры переменных (VAR и VARP (он же VAR_PLAYER) теперь поддерживают имя игрока. Пример %var:fromgate.variableId%
3. Все флаги и действия связанные с переменными поддерживают параметр player - имя игрока, чья персональная переменная будет использована.
4. Что-то ещё, не помню ;)

https://dl.dropboxusercontent.com/u/64799811/ReActions/ReActions.jar
 
Запускаю команду /ra run activator:e1_mob1 с помощью другого плагина (Quests называется. Я хотел, чтобы exec-активатор срабатывал при выполнении определенной задачи, плагин умеет запускать команды).
Выкидывает такую ошибку:
Код:
[17:15:01 ERROR]: Could not pass event PlayerMoveEvent to Quests v2.5.1-b82
org.bukkit.event.EventException
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.ja
va:310) ~[spigot-1.8.7.jar:git-Spigot-3ccbe77-a6a57a9]
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.jav
a:62) ~[spigot-1.8.7.jar:git-Spigot-3ccbe77-a6a57a9]
        at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.j
ava:502) [spigot-1.8.7.jar:git-Spigot-3ccbe77-a6a57a9]
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.j
ava:487) [spigot-1.8.7.jar:git-Spigot-3ccbe77-a6a57a9]
        at net.minecraft.server.v1_8_R3.PlayerConnection.a(PlayerConnection.java
:269) [spigot-1.8.7.jar:git-Spigot-3ccbe77-a6a57a9]
        at net.minecraft.server.v1_8_R3.PacketPlayInFlying.a(SourceFile:126) [sp
igot-1.8.7.jar:git-Spigot-3ccbe77-a6a57a9]
        at net.minecraft.server.v1_8_R3.PacketPlayInFlying$PacketPlayInPosition.
a(SourceFile:57) [spigot-1.8.7.jar:git-Spigot-3ccbe77-a6a57a9]
        at net.minecraft.server.v1_8_R3.PlayerConnectionUtils$1.run(SourceFile:1
3) [spigot-1.8.7.jar:git-Spigot-3ccbe77-a6a57a9]
        at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) [
?:1.8.0_45]
        at java.util.concurrent.FutureTask.run(Unknown Source) [?:1.8.0_45]
        at net.minecraft.server.v1_8_R3.SystemUtils.a(SystemUtils.java:19) [spig
ot-1.8.7.jar:git-Spigot-3ccbe77-a6a57a9]
        at net.minecraft.server.v1_8_R3.MinecraftServer.B(MinecraftServer.java:7
18) [spigot-1.8.7.jar:git-Spigot-3ccbe77-a6a57a9]
        at net.minecraft.server.v1_8_R3.DedicatedServer.B(DedicatedServer.java:3
67) [spigot-1.8.7.jar:git-Spigot-3ccbe77-a6a57a9]
        at net.minecraft.server.v1_8_R3.MinecraftServer.A(MinecraftServer.java:6
57) [spigot-1.8.7.jar:git-Spigot-3ccbe77-a6a57a9]
        at net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java
:560) [spigot-1.8.7.jar:git-Spigot-3ccbe77-a6a57a9]
        at java.lang.Thread.run(Unknown Source) [?:1.8.0_45]
Caused by: java.lang.NullPointerException
        at me.blackvein.quests.Quester.reachLocation(Quester.java:1212) ~[?:?]
        at me.blackvein.quests.PlayerListener.onPlayerMove(PlayerListener.java:9
75) ~[?:?]
        at sun.reflect.GeneratedMethodAccessor31.invoke(Unknown Source) ~[?:?]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1
.8.0_45]
        at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_45]
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.ja
va:306) ~[spigot-1.8.7.jar:git-Spigot-3ccbe77-a6a57a9]
        ... 15 more
На сколько я понял, ReActions не может понять, КТО запускает активатор (Консоль или игрок? o_O), так как команда прописывается с помощью др. плагина, и поэтому активатор вообще не запускается. Если я неправильно понял ошибку - прошу исправить.

И все же, как это решить?
 
Выкидывает такую ошибку:
Это не ошибка ReActions:
  1. Could not pass event PlayerMoveEvent to Quests v2.5.1-b82
  2. org.bukkit.event.EventException

Девбилд 0.9.4/18
На мой взгляд, вполне работоспособный, но тесты не помешают.

Изменения:
1. Полностью переработан механизм работы с плейсхолдерами. С точки зрения пользователя плагина - все также, изменения внутренние, направлены на оптимизацию, улучшение распознавания плейсхолдеров (особенно вложенных).
2. Плейсхолеры переменных (VAR и VARP (он же VAR_PLAYER) теперь поддерживают имя игрока. Пример %var:fromgate.variableId%
3. Все флаги и действия связанные с переменными поддерживают параметр player - имя игрока, чья персональная переменная будет использована.
4. Что-то ещё, не помню ;)

https://dl.dropboxusercontent.com/u/64799811/ReActions/ReActions.jar
Это ещё включая новый формат описания предмета? Регулярки уже поддерживаются в имени? Сравнение жёсткое или лояльное (можно ли выбирать между ними)?
 
Это не ошибка ReActions
Ой, ошибся. :rolleyes:
@Lyosha12, Теперь понял. я просто не ту ошибку скопировал), ReActions тоже выкидывает:
Код:
[18:04:30 ERROR]: Could not pass event ExecEvent to ReActions v0.9.4/15
org.bukkit.event.EventException
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.ja
va:310) ~[spigot-1.8.7.jar:git-Spigot-3ccbe77-a6a57a9]
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.jav
a:62) ~[spigot-1.8.7.jar:git-Spigot-3ccbe77-a6a57a9]
        at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.j
ava:502) [spigot-1.8.7.jar:git-Spigot-3ccbe77-a6a57a9]
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.j
ava:487) [spigot-1.8.7.jar:git-Spigot-3ccbe77-a6a57a9]
        at me.fromgate.reactions.event.EventManager$1.run(EventManager.java:238)
[ReActions.jar:?]
        at org.bukkit.craftbukkit.v1_8_R3.scheduler.CraftTask.run(CraftTask.java
:71) [spigot-1.8.7.jar:git-Spigot-3ccbe77-a6a57a9]
        at org.bukkit.craftbukkit.v1_8_R3.scheduler.CraftScheduler.mainThreadHea
rtbeat(CraftScheduler.java:350) [spigot-1.8.7.jar:git-Spigot-3ccbe77-a6a57a9]
        at net.minecraft.server.v1_8_R3.MinecraftServer.B(MinecraftServer.java:7
26) [spigot-1.8.7.jar:git-Spigot-3ccbe77-a6a57a9]
        at net.minecraft.server.v1_8_R3.DedicatedServer.B(DedicatedServer.java:3
67) [spigot-1.8.7.jar:git-Spigot-3ccbe77-a6a57a9]
        at net.minecraft.server.v1_8_R3.MinecraftServer.A(MinecraftServer.java:6
57) [spigot-1.8.7.jar:git-Spigot-3ccbe77-a6a57a9]
        at net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java
:560) [spigot-1.8.7.jar:git-Spigot-3ccbe77-a6a57a9]
        at java.lang.Thread.run(Unknown Source) [?:1.8.0_45]
Caused by: java.lang.NullPointerException
        at me.fromgate.reactions.util.MobSpawn.mobSpawn(MobSpawn.java:54) ~[?:?]

        at me.fromgate.reactions.actions.ActionMobSpawn.execute(ActionMobSpawn.j
ava:35) ~[?:?]
        at me.fromgate.reactions.actions.Action.executeAction(Action.java:75) ~[
?:?]
        at me.fromgate.reactions.actions.Actions.performAction(Actions.java:198)
~[?:?]
        at me.fromgate.reactions.actions.Actions.executeActivator(Actions.java:1
90) ~[?:?]
        at me.fromgate.reactions.activators.ExecActivator.activate(ExecActivator
.java:28) ~[?:?]
        at me.fromgate.reactions.activators.Activator.executeActivator(Activator
.java:274) ~[?:?]
        at me.fromgate.reactions.activators.Activators.activate(Activators.java:
291) ~[?:?]
        at me.fromgate.reactions.RAListener.onRegionLeave(RAListener.java:394) ~
[?:?]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0
_45]
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0
_45]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1
.8.0_45]
        at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_45]
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.ja
va:306) ~[spigot-1.8.7.jar:git-Spigot-3ccbe77-a6a57a9]
        ... 11 more
 
@Max_ASimus
Я понял. Там получается, что действие спавна моба требует игрока. Сейчас это можно обойти (при вызове из exec-активатора) если указать при запуске параметр player:<ИмяИгрока>. Например так: /ra run activator:e1_mob1 player:fromgate
В следующем билде эта ошибка будет устранена.

а здесь случайно не добавился:
В следующем билде будет.
 
Последнее редактирование:
@fromgate, новый формат описания предмета задействован? Регулярки уже поддерживаются в имени? Сравнение жёсткое или лояльное (можно ли выбирать между ними)?
 
Это ещё включая новый формат описания предмета? Регулярки уже поддерживаются в имени? Сравнение жёсткое или лояльное (можно ли выбирать между ними)?

Формат новый. Старый поддерживается ограниченно. Т.е. если была просто выдача предмета - будет работать. Но вот сравнение, выдача набора предметов (с поддержкой случайного) - это уже в новом формате.

Сегодня постараюсь сделать нормальное описание с примерами как этим пользоваться.

Сравнение в таком режиме: тип предмета - всегда задается жестко. Остальное сравнивается только если указано явно.
Т.е. если имя не указано - то берётся предмет с любым именем. Если имя указано - работает как регулярное выражение (а тут уже "жесткость" указывается как нужно: "Sword of Power" - это точное требование (с соблюдением регистра) - "Sword of .*" - это всё что начинается на "Sword of" (т.е. и Sword of Power и Sword of Idiot :))
 
Формат новый. Старый поддерживается ограниченно. Т.е. если была просто выдача предмета - будет работать. Но вот сравнение, выдача набора предметов (с поддержкой случайного) - это уже в новом формате.

Сегодня постараюсь сделать нормальное описание с примерами как этим пользоваться.

Сравнение в таком режиме: тип предмета - всегда задается жестко. Остальное сравнивается только если указано явно.
Т.е. если имя не указано - то берётся предмет с любым именем. Если имя указано - работает как регулярное выражение (а тут уже "жесткость" указывается как нужно: "Sword of Power" - это точное требование (с соблюдением регистра) - "Sword of .*" - это всё что начинается на "Sword of" (т.е. и Sword of Power и Sword of Idiot :))
Отлично, приступаю к штудированию :)
 
@fromgate, Теперь ReActions ошибку не выдает, но плагин "Quests" продолжает при каждой попытке. При чем эта ошибка появляется только при использовании ReActions, другие команды отлично проходят. Я понимаю, что обратился "не по адресу", но если не сложно - прошу помочь также с этой ошибкой. Долго вожусь, не могу понять, почему она имеет место быть.
Код:
[17:15:01 ERROR]: Could not pass event PlayerMoveEvent to Quests v2.5.1-b82
org.bukkit.event.EventException
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.ja
va:310) ~[spigot-1.8.7.jar:git-Spigot-3ccbe77-a6a57a9]
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.jav
a:62) ~[spigot-1.8.7.jar:git-Spigot-3ccbe77-a6a57a9]
        at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.j
ava:502) [spigot-1.8.7.jar:git-Spigot-3ccbe77-a6a57a9]
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.j
ava:487) [spigot-1.8.7.jar:git-Spigot-3ccbe77-a6a57a9]
        at net.minecraft.server.v1_8_R3.PlayerConnection.a(PlayerConnection.java
:269) [spigot-1.8.7.jar:git-Spigot-3ccbe77-a6a57a9]
        at net.minecraft.server.v1_8_R3.PacketPlayInFlying.a(SourceFile:126) [sp
igot-1.8.7.jar:git-Spigot-3ccbe77-a6a57a9]
        at net.minecraft.server.v1_8_R3.PacketPlayInFlying$PacketPlayInPosition.
a(SourceFile:57) [spigot-1.8.7.jar:git-Spigot-3ccbe77-a6a57a9]
        at net.minecraft.server.v1_8_R3.PlayerConnectionUtils$1.run(SourceFile:1
3) [spigot-1.8.7.jar:git-Spigot-3ccbe77-a6a57a9]
        at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) [
?:1.8.0_45]
        at java.util.concurrent.FutureTask.run(Unknown Source) [?:1.8.0_45]
        at net.minecraft.server.v1_8_R3.SystemUtils.a(SystemUtils.java:19) [spig
ot-1.8.7.jar:git-Spigot-3ccbe77-a6a57a9]
        at net.minecraft.server.v1_8_R3.MinecraftServer.B(MinecraftServer.java:7
18) [spigot-1.8.7.jar:git-Spigot-3ccbe77-a6a57a9]
        at net.minecraft.server.v1_8_R3.DedicatedServer.B(DedicatedServer.java:3
67) [spigot-1.8.7.jar:git-Spigot-3ccbe77-a6a57a9]
        at net.minecraft.server.v1_8_R3.MinecraftServer.A(MinecraftServer.java:6
57) [spigot-1.8.7.jar:git-Spigot-3ccbe77-a6a57a9]
        at net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java
:560) [spigot-1.8.7.jar:git-Spigot-3ccbe77-a6a57a9]
        at java.lang.Thread.run(Unknown Source) [?:1.8.0_45]
Caused by: java.lang.NullPointerException
        at me.blackvein.quests.Quester.reachLocation(Quester.java:1212) ~[?:?]
        at me.blackvein.quests.PlayerListener.onPlayerMove(PlayerListener.java:9
75) ~[?:?]
        at sun.reflect.GeneratedMethodAccessor31.invoke(Unknown Source) ~[?:?]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1
.8.0_45]
        at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_45]
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.ja
va:306) ~[spigot-1.8.7.jar:git-Spigot-3ccbe77-a6a57a9]
        ... 15 more
 
А можно попросить сделать нестираемые комментарии?
И поддержку каталогов для файлов с активаторами...
И подружить активаторы команд с флагом запрета команд из World Guard...
И добавить автозавершение команд с аргументами из соответствующего активатора...
 
Опять наткнулся на проблему :(.
Активатор REGION_ENTER работает только в стандартном мире. В других мирах - реакции просто нет никакой...
 
Опять наткнулся на проблему :(.
Активатор REGION_ENTER работает только в стандартном мире. В других мирах - реакции просто нет никакой...
мир.регион
Если Вы - поклонник ReActions, то не прочитать всю тему от начала и до конца - позор для Вас :D
@fromgate, после перезапуска сервера:
Код:
2015-06-17 02:00:27 [SEVERE] Could not pass event ExecEvent to ReActions v0.9.4/18
org.bukkit.event.EventException
    at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:427)
    at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62)
    at org.bukkit.plugin.TimedRegisteredListener.callEvent(TimedRegisteredListener.java:30)
    at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:478)
    at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:463)
    at me.fromgate.reactions.event.EventManager$1.run(EventManager.java:236)
    at org.bukkit.craftbukkit.v1_5_R3.scheduler.CraftTask.run(CraftTask.java:58)
    at org.bukkit.craftbukkit.v1_5_R3.scheduler.CraftScheduler.mainThreadHeartbeat(CraftScheduler.java:344)
    at net.minecraft.server.v1_5_R3.MinecraftServer.r(MinecraftServer.java:509)
    at net.minecraft.server.v1_5_R3.DedicatedServer.r(DedicatedServer.java:227)
    at net.minecraft.server.v1_5_R3.MinecraftServer.q(MinecraftServer.java:472)
    at net.minecraft.server.v1_5_R3.MinecraftServer.run(MinecraftServer.java:404)
    at net.minecraft.server.v1_5_R3.ThreadServerApplication.run(SourceFile:573)
Caused by: java.lang.NullPointerException
    at me.fromgate.reactions.flags.FlagVar.checkFlag(FlagVar.java:44)
    at me.fromgate.reactions.flags.Flags.check(Flags.java:110)
    at me.fromgate.reactions.flags.Flags.checkFlag(Flags.java:136)
    at me.fromgate.reactions.flags.Flags.checkAllFlags(Flags.java:151)
    at me.fromgate.reactions.flags.Flags.checkFlags(Flags.java:144)
    at me.fromgate.reactions.actions.Actions.executeActivator(Actions.java:173)
    at me.fromgate.reactions.activators.ExecActivator.activate(ExecActivator.java:28)
    at me.fromgate.reactions.activators.Activator.executeActivator(Activator.java:274)
    at me.fromgate.reactions.activators.Activators.activate(Activators.java:291)
    at me.fromgate.reactions.RAListener.onRegionLeave(RAListener.java:394)
    at sun.reflect.GeneratedMethodAccessor20.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:425)
    ... 12 more
Возможно, проблема в одном из старых форматов? Хотя, переменные же не подвергались полному изменению...?
@fromgate, а можно ли раскладывать часовой формат в аргументе команды на секунды?

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

По этому предлагаю дополнительный аргумент - timef:<s\m\h\d\w\mo\y\none>. Работать это, наверно, должно так: если аргумент содержит только цифры, а после них только символ формата времени, то нужно преобразовать это в то число, формат которого был задан в аргументе timef. Например, 1m = 60, если timef:s; или 1m = 0.6, если timef:h.

Соответственно, вывод значения заносится в плейсхолдер активатора, в котором было преобразование: %argN_timef%. Однако, иногда может требоваться вывести чисто аргумент. В этом случае нужно использовать обычный плейсхолдер, который бы выводил сам аргумент, без изменений как и раньше.

И, если уже понадобиться создать читаемое значение, вроде "1 минута 2 секунды", то для этого, наверно, нужно создать ещё один активатор\действие... Которое бы заменяло отдельные слова-аргументы и учитывало бы связки временных форматов. Например, типа "1h 2m 5s" превращалось бы сразу в "1 час 2 минуты 5 секунд".

Хотя, такое можно провернуть и с обычным активатором-сообщением, используя задержку, чтобы не создать вечный цикл из одинаковых сообщений... Но, я так понимаю, вариант читабельности откладывается далеко в коробку, пока не будут решены проблемы насущные... :)

В общем, пригодиться такое преобразование может во многих ситуациях. Начиная от установки кастомного времени для чего-либо, заканчивая выводом этого времени после окончания чего-либо.
Меня опять начинает беспокоить нагрузка от активаторов, однако это пока что только предположения. Оправданы ли они? Например, если игрок одновременно запускает несколько сотен активаторов? Или же несколько десятков активаторов запускаются для всех игроков каждую секунду или и того чаще? //Плагин занимает памяти 256 метров при трёх игроках... И остаётся всего 800...
 
Последнее редактирование:
@fromgate[/USER], после перезапуска сервера:
Вот так должно быть нормально: https://dl.dropboxusercontent.com/u/64799811/ReActions/ReActions.jar

По поводу нагрузки можно будет попробовать вновь заняться тестированием. Но на память я повлиять вряд ли смогу. Главное чтобы в тик всё укладывалось (с запасом - чтобы остальным плагинам хватало времени работы)
 
Вот так должно быть нормально: https://dl.dropboxusercontent.com/u/64799811/ReActions/ReActions.jar

По поводу нагрузки можно будет попробовать вновь заняться тестированием. Но на память я повлиять вряд ли смогу. Главное чтобы в тик всё укладывалось (с запасом - чтобы остальным плагинам хватало времени работы)
А в чём была ошибка?
 
А в чём была ошибка?

Перепутал глобальную и персональную переменную, пытался при работе с глобальной получить имя игрока (которого не было). Ошибка была исключительно в том билде - до этого там всё было по другому.
 
Если Вы - поклонник ReActions, то не прочитать всю тему от начала и до конца - позор для Вас :D
Блин, я читал, даже видел, что кто-то где-то этот вопрос задавал :). Но решения проблемы я не запомнил, попробовал поискать - тоже не получилось. Ну, теперь буду знать, спасибо)
 
Есть некая задумка по сюжету. Сводится к тому, что надо отслеживать популяцию жителей в определенном регионе. К сожалению всех премудростей плагина не изучил еще (документация не читается, хоть тресни - только заголовки). Подскажите, ув. Fromgate и знающие люди - возможно ли это? Задумка такая: надо построить селение, заселить его жителями, чтобы они жили счастливо и размножались. Как только популяция достигает какого-то нужного предела - задание считать выполненным.
 
Очередной dev-билд 0.9.4/21

Исправлено несколько ошибок и реализована партия идей от @Lyosha12 :)
https://dl.dropboxusercontent.com/u/64799811/ReActions/ReActions.jar
А что конкретно мне подвергнуть анализу?
Есть некая задумка по сюжету. Сводится к тому, что надо отслеживать популяцию жителей в определенном регионе. К сожалению всех премудростей плагина не изучил еще (документация не читается, хоть тресни - только заголовки). Подскажите, ув. Fromgate и знающие люди - возможно ли это? Задумка такая: надо построить селение, заселить его жителями, чтобы они жили счастливо и размножались. Как только популяция достигает какого-то нужного предела - задание считать выполненным.
Жители? Счёт мобов? Активатор-спавн-моба? Нет, мобов нельзя "ловить".
 
Назад
Верх