1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

Тема в разделе "Релизы плагинов", создана пользователем fromgate, 16 июл 2013.

  1. Korvinius

    Korvinius Активный участник Пользователь

    Баллы:
    88
    Плагином TOWNY никогда не пользовался, поэтому пользы от моего совета будет не много, но может для начала получить название города как плейсхолдер?
    А тогда этот плейсхолдер попробовать передать в переменную в качестве <Значения>?
    Но, повторюсь, сам я такого не пробовал, это только теория)))
     
  2. HardKrab

    HardKrab Активный участник Пользователь

    Баллы:
    88
    Эх, флаг TOWN вообще не работает :( Теперь я окончательно зашел в тупик.
     
  3. Lyosha12

    Lyosha12 Активный участник Пользователь

    Баллы:
    98
    Skype:
    alexey_zyuz
    Имя в Minecraft:
    Lyosha12
    Если бы активаторы для этого плагина создавали плейсхолдеры, то, возможно, получилось бы задать разное значение переменной, которому бы соответствовал один... Город? Клан? А потом проверять эту переменную во флагах, если флаг TOWN не работает...
     
  4. Автор темы
    fromgate

    fromgate Старожил Пользователь

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

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

    Покажите активатор...
    Добавить временный плейсхолдер при выполнении флага / действия - это очень просто и быстро. Если в этом есть смысл - я это обязательно сделаю.
     
  5. Korvinius

    Korvinius Активный участник Пользователь

    Баллы:
    88
    Скажите, а есть ли возможность у всех флагах/активаторах, связанных с item-ами, проверять наличие только по ID или MATERIAL, без названия? Если нет, можно ли такое добавить? А то в некоторых местах иногда нужно запретить все предметы данного типа, например чаренные яблоки, а не отдельное наименование, а взять простое яблоко, запихнуть в наковальню, переименовать и все ограничения обходятся.
    также было бы неплохо иметь возможность проверять и/или по Lore, даже только по нему.
     
  6. Автор темы
    fromgate

    fromgate Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    @Korvinius
    Работа с итемами у меня будет сильно переделываться, поэтому сейчас в виде заплаток я добавлять что-либо точно не буду.
    Тогда будет и полноценная работа с Lore (я надеюсь ;)) и возможность использовать предметы в виде переменных (Тогда, к примеру, можно будет запоминать предмет в виде переменной, изымать его, а потом выдавать обратно ;))

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

    Korvinius Активный участник Пользователь

    Баллы:
    88
    будем ждать :) с нетерпением, а по поводу "переименования" я имел ввиду, чтобы добавить возможность проверки только по ID, без названия и Lore...
     
  8. HardKrab

    HardKrab Активный участник Пользователь

    Баллы:
    88
    Версия 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?
     
    Последнее редактирование: 4 янв 2015
  9. Lyosha12

    Lyosha12 Активный участник Пользователь

    Баллы:
    98
    Skype:
    alexey_zyuz
    Имя в Minecraft:
    Lyosha12
    Ты просто пишешь ID предмета и проверяется только ID без учёта имени.
    Флаг REGION.
    Нет, используй SCL.
     
  10. HardKrab

    HardKrab Активный участник Пользователь

    Баллы:
    88
    Черт, точно. Есть же флаг:lol:
    Хм, а можно чтобы активатор вообще игнорил все, что не в обозначенном регионе? А то с флагом нагрузка то большая будет, если каждое убийство он будет проверять.
    Ок, спасибо
     
  11. Lyosha12

    Lyosha12 Активный участник Пользователь

    Баллы:
    98
    Skype:
    alexey_zyuz
    Имя в Minecraft:
    Lyosha12
    Нагрузку я заметил только с активаторами региона. Все остальные 300 штук работают отлично при онлайне 40+ и TPS не проседает. Активатор и так не "включается", если не соблюдаются условия. Если нет противодействий, то ничего не происходит.
     
  12. Автор темы
    fromgate

    fromgate Старожил Пользователь

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

    Нагрузка возникает, тогда когда у Вас на сервере куча регионов, куча активаторов REGION и куча игроков.
    Тут при переходе каждого игрока из блока в блок происходит проверка регионов.
    В версиях WG6x встроен кэш - по идее это должно снижать нагрузку (я там работаю через их кэш). А в WG5x кэша нет.
    Я сейчас хочу встроить собственный кэш для этих целей — посмотрим насколько будет заметен эффект.
     
  13. HardKrab

    HardKrab Активный участник Пользователь

    Баллы:
    88
    Не подскажите, как правильно установить 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]
     
    Последнее редактирование: 4 янв 2015
  14. Автор темы
    fromgate

    fromgate Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    @HardKrab
    Пожалуйста, поставьте последнюю версию ReActions, вряд ли это поможет, но я хоть смогу понять где ошибка.
    Ну и покажите кода активатора с DELAY
     
  15. HardKrab

    HardKrab Активный участник Пользователь

    Баллы:
    88
    Хм, поставил последнюю версию, ошибки больше не наблюдается, но delay все еще не работает.
    BUTTON:
    b1:
    world: world
    x: 8574
    y: 207
    z: -2762
    flags: []
    actions:
    - cmd_op=deop Hard
    - DELAY=10
    - cmd_op=op Hard
    reactions: []
     
  16. Korvinius

    Korvinius Активный участник Пользователь

    Баллы:
    88
    Нет, давно проверил, если бы это работало, сюда бы не писал
     
  17. Lyosha12

    Lyosha12 Активный участник Пользователь

    Баллы:
    98
    Skype:
    alexey_zyuz
    Имя в Minecraft:
    Lyosha12
    @HardKrab, есть действие установки задержки DELAY и флаг проверки окончания этой задержки. Устанавливается глобальная задержка так:
    delay=10s/Name
    Где 10s - время задержки, а Name - "переменная", в которую закладывается задержка. Далее это Name нужно проверять на окончание задержки во флагах так:
    delay=Name
    И того, действия будут выполнены, если 10 секунд задержки Name прошли.
     
  18. HardKrab

    HardKrab Активный участник Пользователь

    Баллы:
    88
    Воу, я думал все проще. Ладно, спасибо
     
  19. Автор темы
    fromgate

    fromgate Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    Ну вообще можно, пожалуй, наделить флаг DELAY возможностью устанавливать значение задержки, если она не установлена.
    Но вообще, существующий механизм позволяет производить проверку в других активаторах, отличных от того где они задавались.
     
  20. Lyosha12

    Lyosha12 Активный участник Пользователь

    Баллы:
    98
    Skype:
    alexey_zyuz
    Имя в Minecraft:
    Lyosha12
    @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
     
    Последнее редактирование: 5 янв 2015

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