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

Ребят, спасайте. Целый день голову ломаю. Сразу на примере: игрок из города N (towny) совершил действие (ткнул на кнопку/наступил на плиту, не важно). Как мне вытащить название города, чтобы далее использовать его как флаг? Первое, что пришло мне в голову это объявить переменную, в которую будет записываться название города, но реализовать у меня это не получается.
Плагином TOWNY никогда не пользовался, поэтому пользы от моего совета будет не много, но может для начала получить название города как плейсхолдер?
Flag-placeholders
In addition all flags are... also could be used as placeholders. For example, placeholder %time% will replaced with values of flag TIME if this flag is used in activator.
А тогда этот плейсхолдер попробовать передать в переменную в качестве <Значения>?
Установка значения переменной (VAR_SET, VAR_PLAYER_SET)
var_set id:<ИмяПеременной> value:<Значение>
Инициализация/изменение глобальной переменной.
var_player_set id:<ИмяПеременной> value:<Значение>
Инициализация/изменение локальной переменной.
Но, повторюсь, сам я такого не пробовал, это только теория)))
 
Эх, флаг TOWN вообще не работает :( Теперь я окончательно зашел в тупик.
 
Эх, флаг TOWN вообще не работает :( Теперь я окончательно зашел в тупик.
Если бы активаторы для этого плагина создавали плейсхолдеры, то, возможно, получилось бы задать разное значение переменной, которому бы соответствовал один... Город? Клан? А потом проверять эту переменную во флагах, если флаг TOWN не работает...
 
Эх, флаг TOWN вообще не работает :( Теперь я окончательно зашел в тупик.

Какая версия TOWNY? Дело в том, что всё что касается TOWNY писалось очень давно и возможно с тех времен у плагина поменялось API.

Есть ли ошибки в логе сервера при проверке флага?

Покажите активатор...
Если бы активаторы для этого плагина создавали плейсхолдеры, то, возможно, получилось бы задать разное значение переменной, которому бы соответствовал один... Город? Клан? А потом проверять эту переменную во флагах, если флаг TOWN не работает...

Добавить временный плейсхолдер при выполнении флага / действия - это очень просто и быстро. Если в этом есть смысл - я это обязательно сделаю.
 
Скажите, а есть ли возможность у всех флагах/активаторах, связанных с item-ами, проверять наличие только по ID или MATERIAL, без названия? Если нет, можно ли такое добавить? А то в некоторых местах иногда нужно запретить все предметы данного типа, например чаренные яблоки, а не отдельное наименование, а взять простое яблоко, запихнуть в наковальню, переименовать и все ограничения обходятся.
также было бы неплохо иметь возможность проверять и/или по Lore, даже только по нему.
 
@Korvinius
Работа с итемами у меня будет сильно переделываться, поэтому сейчас в виде заплаток я добавлять что-либо точно не буду.
Тогда будет и полноценная работа с Lore (я надеюсь ;)) и возможность использовать предметы в виде переменных (Тогда, к примеру, можно будет запоминать предмет в виде переменной, изымать его, а потом выдавать обратно ;))

Сейчас для того, чтобы переименованием нельзя было получить "уникальный" предмет, нужно просто хитрить с цветами: "&1&2&3&4&5&6Супер меч$DIAMOND_SWORD" - выглядит точно так же как и "&6Супер меч$DIAMOND_SWORD", но при сравнении они не спутаются.
 
@Korvinius
Работа с итемами у меня будет сильно переделываться, поэтому сейчас в виде заплаток я добавлять что-либо точно не буду.
Тогда будет и полноценная работа с Lore (я надеюсь ;)) и возможность использовать предметы в виде переменных (Тогда, к примеру, можно будет запоминать предмет в виде переменной, изымать его, а потом выдавать обратно ;))

Сейчас для того, чтобы переименованием нельзя было получить "уникальный" предмет, нужно просто хитрить с цветами: "&1&2&3&4&5&6Супер меч$DIAMOND_SWORD" - выглядит точно так же как и "&6Супер меч$DIAMOND_SWORD", но при сравнении они не спутаются.
будем ждать :) с нетерпением, а по поводу "переименования" я имел ввиду, чтобы добавить возможность проверки только по ID, без названия и Lore...
 
Какая версия TOWNY? Дело в том, что всё что касается TOWNY писалось очень давно и возможно с тех времен у плагина поменялось API.

Есть ли ошибки в логе сервера при проверке флага?

Покажите активатор...
Версия towny: 0.88.0.0 (1.7.2)
Could not pass event ButtonEvent to ReActions v0.9.2
org.bukkit.event.EventException
at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:338) ~[JavaPluginLoader$1.class:git-Cauldron-MCPC-Plus-1.7.2-1.1147.04.196]
at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[RegisteredListener.class:git-Cauldron-MCPC-Plus-1.7.2-1.1147.04.196]
at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:487) [SimplePluginManager.class:git-Cauldron-MCPC-Plus-1.7.2-1.1147.04.196]
at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:472) [SimplePluginManager.class:git-Cauldron-MCPC-Plus-1.7.2-1.1147.04.196]
at me.fromgate.reactions.event.EventManager.raiseButtonEvent(EventManager.java:170) [ReActions.jar:?]
at me.fromgate.reactions.RAListener.onPlayerInteract(RAListener.java:291) [ReActions.jar:?]
at sun.reflect.GeneratedMethodAccessor31.invoke(Unknown Source) ~[?:?]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.7.0_71]
at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.7.0_71]
at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:334) [JavaPluginLoader$1.class:git-Cauldron-MCPC-Plus-1.7.2-1.1147.04.196]
at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) [RegisteredListener.class:git-Cauldron-MCPC-Plus-1.7.2-1.1147.04.196]
at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:487) [SimplePluginManager.class:git-Cauldron-MCPC-Plus-1.7.2-1.1147.04.196]
at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:472) [SimplePluginManager.class:git-Cauldron-MCPC-Plus-1.7.2-1.1147.04.196]
at org.bukkit.craftbukkit.v1_7_R1.event.CraftEventFactory.callPlayerInteractEvent(CraftEventFactory.java:223) [CraftEventFactory.class:git-Cauldron-MCPC-Plus-1.7.2-1.1147.04.196]
at net.minecraft.server.management.ItemInWorldManager.func_73078_a(ItemInWorldManager.java:420) [mn.class:?]
at net.minecraft.network.NetHandlerPlayServer.func_147346_a(NetHandlerPlayServer.java:869) [mx.class:?]
at net.minecraft.network.play.client.C08PacketPlayerBlockPlacement.func_148833_a(SourceFile:60) [jc.class:?]
at net.minecraft.network.play.client.C08PacketPlayerBlockPlacement.func_148833_a(SourceFile:9) [jc.class:?]
at net.minecraft.network.NetworkManager.func_74428_b(NetworkManager.java:206) [ef.class:?]
at net.minecraft.network.NetworkSystem.func_151269_c(NetworkSystem.java:173) [ms.class:?]
at net.minecraft.server.MinecraftServer.func_71190_q(MinecraftServer.java:957) [MinecraftServer.class:?]
at net.minecraft.server.dedicated.DedicatedServer.func_71190_q(DedicatedServer.java:433) [lj.class:?]
at net.minecraft.server.MinecraftServer.func_71217_p(MinecraftServer.java:774) [MinecraftServer.class:?]
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:637) [MinecraftServer.class:?]
at java.lang.Thread.run(Unknown Source) [?:1.7.0_71]
Caused by: java.lang.NullPointerException
at me.fromgate.reactions.externals.RATowny.playerInTown(RATowny.java:123) ~[?:?]
at me.fromgate.reactions.flags.FlagTown.checkFlag(FlagTown.java:34) ~[?:?]
at me.fromgate.reactions.flags.Flags.check(Flags.java:99) ~[?:?]
at me.fromgate.reactions.flags.Flags.checkFlag(Flags.java:125) ~[?:?]
at me.fromgate.reactions.flags.Flags.checkAllFlags(Flags.java:140) ~[?:?]
at me.fromgate.reactions.flags.Flags.checkFlags(Flags.java:133) ~[?:?]
at me.fromgate.reactions.actions.Actions.executeActivator(Actions.java:170) ~[?:?]
at me.fromgate.reactions.activators.ButtonActivator.activate(ButtonActivator.java:67) ~[?:?]
at me.fromgate.reactions.activators.Activator.executeActivator(Activator.java:274) ~[?:?]
at me.fromgate.reactions.activators.Activators.activate(Activators.java:358) ~[?:?]
at me.fromgate.reactions.RAListener.onButton(RAListener.java:329) ~[?:?]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.7.0_71]
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.7.0_71]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.7.0_71]
at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.7.0_71]
at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:334) ~[JavaPluginLoader$1.class:git-Cauldron-MCPC-Plus-1.7.2-1.1147.04.196]
BUTTON:
bt:
world: world
x: 8576
y: 208
z: -2767
flags:
- TOWN=Hard
actions:
- broadcast=test msg
reactions: []

Еще вопрос. Можно ли задействовать активатор pvp_kill только в определенном регионе с помощью loc:region:<название> ?
И еще один. Можно ли заставить block_fill заполнять не только cuboid регионы, но и другие виды, как poly и ellipsoid?
 
Последнее редактирование:
будем ждать :) с нетерпением, а по поводу "переименования" я имел ввиду, чтобы добавить возможность проверки только по ID, без названия и Lore...
Ты просто пишешь ID предмета и проверяется только ID без учёта имени.
Еще вопрос. Можно ли задействовать активатор pvp_kill только в определенном регионе с помощью loc:region:<название> ?
Флаг REGION.
И еще один. Можно ли заставить block_fill заполнять не только cuboid регионы, но и другие виды, как poly и ellipsoid?
Нет, используй SCL.
 
Черт, точно. Есть же флаг:lol:
Хм, а можно чтобы активатор вообще игнорил все, что не в обозначенном регионе? А то с флагом нагрузка то большая будет, если каждое убийство он будет проверять.
Нет, используй SCL.
Ок, спасибо
 
Хм, а можно чтобы активатор вообще игнорил все, что не в обозначенном регионе? А то с флагом нагрузка то большая будет, если каждое убийство он будет проверять.
Нагрузку я заметил только с активаторами региона. Все остальные 300 штук работают отлично при онлайне 40+ и TPS не проседает. Активатор и так не "включается", если не соблюдаются условия. Если нет противодействий, то ничего не происходит.
 
Черт, точно. Есть же флаг:lol:
Хм, а можно чтобы активатор вообще игнорил все, что не в обозначенном регионе? А то с флагом нагрузка то большая будет, если каждое убийство он будет проверять.

Ок, спасибо

Флаг отрабатывает только в момент выполнения активатора. Т.е. если Вы привязали флаг к активатору ITEM_CLICK и проверяете к примеру, что игрок находится в заданном регионе - то тут нагрузки какой-то заметной не будет.

Нагрузка возникает, тогда когда у Вас на сервере куча регионов, куча активаторов REGION и куча игроков.
Тут при переходе каждого игрока из блока в блок происходит проверка регионов.
В версиях WG6x встроен кэш - по идее это должно снижать нагрузку (я там работаю через их кэш). А в WG5x кэша нет.
Я сейчас хочу встроить собственный кэш для этих целей — посмотрим насколько будет заметен эффект.
 
Не подскажите, как правильно установить delay? И так и сяк пробую, всё равно все действия без задержек.
Ага. При попытке поставить delay=10s выдает ошибку
Could not pass event ExecEvent to ReActions v0.9.2
org.bukkit.event.EventException
at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:338) ~[JavaPluginLoader$1.class:git-Cauldron-MCPC-Plus-1.7.2-1.1147.04.196]
at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[RegisteredListener.class:git-Cauldron-MCPC-Plus-1.7.2-1.1147.04.196]
at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:487) [SimplePluginManager.class:git-Cauldron-MCPC-Plus-1.7.2-1.1147.04.196]
at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:472) [SimplePluginManager.class:git-Cauldron-MCPC-Plus-1.7.2-1.1147.04.196]
at me.fromgate.reactions.event.EventManager$1.run(EventManager.java:230) [ReActions.jar:?]
at org.bukkit.craftbukkit.v1_7_R1.scheduler.CraftTask.run(CraftTask.java:71) [CraftTask.class:git-Cauldron-MCPC-Plus-1.7.2-1.1147.04.196]
at org.bukkit.craftbukkit.v1_7_R1.scheduler.CraftScheduler.mainThreadHeartbeat(CraftScheduler.java:346) [CraftScheduler.class:git-Cauldron-MCPC-Plus-1.7.2-1.1147.04.196]
at net.minecraft.server.MinecraftServer.func_71190_q(MinecraftServer.java:838) [MinecraftServer.class:?]
at net.minecraft.server.dedicated.DedicatedServer.func_71190_q(DedicatedServer.java:433) [lj.class:?]
at net.minecraft.server.MinecraftServer.func_71217_p(MinecraftServer.java:774) [MinecraftServer.class:?]
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:637) [MinecraftServer.class:?]
at java.lang.Thread.run(Unknown Source) [?:1.7.0_71]
Caused by: java.lang.NullPointerException
at me.fromgate.reactions.actions.ActionDelay.execute(ActionDelay.java:41) ~[?:?]
at me.fromgate.reactions.actions.Action.executeAction(Action.java:75) ~[?:?]
at me.fromgate.reactions.actions.Actions.performAction(Actions.java:186) ~[?:?]
at me.fromgate.reactions.actions.Actions.executeActivator(Actions.java:178) ~[?:?]
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:358) ~[?:?]
at me.fromgate.reactions.RAListener.onRegionLeave(RAListener.java:355) ~[?:?]
at sun.reflect.GeneratedMethodAccessor103.invoke(Unknown Source) ~[?:?]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.7.0_71]
at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.7.0_71]
at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:334) ~[JavaPluginLoader$1.class:git-Cauldron-MCPC-Plus-1.7.2-1.1147.04.196]
 
Последнее редактирование:
@HardKrab
Пожалуйста, поставьте последнюю версию ReActions, вряд ли это поможет, но я хоть смогу понять где ошибка.
Ну и покажите кода активатора с DELAY
 
@HardKrab
Пожалуйста, поставьте последнюю версию ReActions, вряд ли это поможет, но я хоть смогу понять где ошибка.
Ну и покажите кода активатора с DELAY
Хм, поставил последнюю версию, ошибки больше не наблюдается, но delay все еще не работает.
BUTTON:
b1:
world: world
x: 8574
y: 207
z: -2762
flags: []
actions:
- cmd_op=deop Hard
- DELAY=10
- cmd_op=op Hard
reactions: []
 
@HardKrab, есть действие установки задержки DELAY и флаг проверки окончания этой задержки. Устанавливается глобальная задержка так:
delay=10s/Name
Где 10s - время задержки, а Name - "переменная", в которую закладывается задержка. Далее это Name нужно проверять на окончание задержки во флагах так:
delay=Name
И того, действия будут выполнены, если 10 секунд задержки Name прошли.
 
@HardKrab, есть действие установки задержки DELAY и флаг проверки окончания этой задержки. Устанавливается глобальная задержка так:
delay=10s/Name
Где 10s - время задержки, а Name - "переменная", в которую закладывается задержка. Далее это Name нужно проверять на окончание задержки во флагах так:
delay=Name
И того, действия будут выполнены, если 10 секунд задержки Name прошли.
Воу, я думал все проще. Ладно, спасибо
 
Воу, я думал все проще. Ладно, спасибо
Ну вообще можно, пожалуй, наделить флаг DELAY возможностью устанавливать значение задержки, если она не установлена.
Но вообще, существующий механизм позволяет производить проверку в других активаторах, отличных от того где они задавались.
 
@fromgate, можно как-то в GUI-меню предотвратить закрытие меню при клике на предмет? Вариант с вызовом того же меню при нажатии не найс, так как немного напрягает такое "мигание" ._.

Может, создать ещё один пункт в описании слота - close: deny\allow?
--------------------
Можно ли усовершенствовать описание предмета при его выдаче, добавив эффект, которым обладают зелья? То есть, хотелось бы создавать кастомные колбы с эффектами. Essentials так умеет только командой...
Ещё одна огроменная идея в плане реализации: составление Lore для предмета "на ходу".

Пример: есть три игрока с правами. У первого есть право "1", у второго - "1", "2" и у третьего - "1", "3"
Для, например, третьего игрока должно быть выведено меню с описанием прав на предмете, которыми он обладает в данный момент.

Как я представляю себе это:
Есть БД, в которой перечислены все права и их описания под номерами. Например:
LoreNumber1=perm:1 lore:{@Вы можете@использовать команду /1}
LoreNumber2=perm:2 lore:{@Вы можете@использовать команду /2}
LoreNumber3=perm:3 lore:{@Вы можете@использовать команду /3}

Заметьте, что перед началом каждого описания я написал символ переноса строки. Это по тому, что мы добавляем текст в Lore. Хотя, для удобства здесь можно было бы принять по-умолчанию, что добавляется именно новая строка.

Так же есть БД с предметами. Ну, например:
Код:
ItemNumber1=item:339

Начнём составление "динамичного lore". Для начала, нужно проверять игрока на предмет обладания правом. Это флаг. Значит, будет несколько активаторов в связке, которые на выходе формируют окончательное Lore. Но обо всём по порядку.

Итак, есть первый активатор Exec1, который добавляет к Lore "окончательного" предмета строку 1 при условии, что проверка на присутствие права "1" прошла успешно:
Код:
SetLore=item:ItemNumber1 lore:LoreNumber1

Этим действием мы добавили строку Lore из первой БД к "динамическому предмету". Думаю, его можно назвать так.

Во втором активаторе Exec2 идёт проверка на обладание правом "2", которая выдаёт false, а после третья проверка в активаторе Exec3 на присутствие права "3" соответственно. И, так как право "3" присутствует, выполняется действие:
Код:
SetLore=item:ItemNumber1 lore:LoreNumber3

Далее идёт четвёртый активатор, который запускает долгожданное меню с одним предметом. Будем использовать файл меню. В строке предмета напишем следующее:
Код:
item:ItemNumber1

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

Но, согласитесь, что не очень удобно проверять КАЖДОЕ право. Ведь, игроки и так обладают начальным набором прав? По этому, можно записать все стандартные права в другие предметы, а под новые отвести отдельный предмет. Ещё есть вариант совмещения обычного Lore и "динамического", которое создаём мы.

Делать это можно было бы в той же ITEM-БД. То есть, мы не просто создаём кастомный ID для использования его дальше. Мы можем задать и своё описание предмету в этой БД, к которой будет добавляться новое описание. Например:
Код:
ItemNumber1=item:Имя_Бумаги@Начальное_описание_бумаги$339*12

Интересно, а что же делать с "изменённым" "динамическим предметом"? Он же так и остаётся в памяти, с такими же параметрами. Можно создать отдельное действие, которое бы сбрасывало наше кастомное Lore. Или можно сразу сбрасывать до стандартного Lore, что есть в ITEM-БД

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

В общем, очень интересно было бы поиграться с "динамический описанием" :D
 
Последнее редактирование:
Назад
Верх