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

У меня такой вопрос по плагину. Можно ли проверить группу пользователя с помощью него? Мне нужно выполнить несколько действий:

1. Проверить группу пользователя на участие в группе "группа1"
1.1. Если группа совпадает с группой "группа1", то выполнить пункт 2
1.2. Если группа не совпадает то выдать текст: Сначала получите группу "группа1"
2. Проверить наличие предметов (несколько позиций по несколько предметов, возьмём Седло и 32Угля)
2.1. Если предметы в наличии, то забрать указанные предметы, затем установить (set) группу пользователю на %группа2, затем выдать текст: Поздравляем с получением группы "группа2"!
2.2. Если предметов нет в наличии, то выдать текст: У вас недостаточно предметов для получения группы "группа2".


Смогу ли я с помощью этого плагина провести эти операции, или хотя бы их аналоги? Конечный результат должен быть такой: Пользователю был повышена группа с предыдущей на последующую за определённое кол-во предметов.
П.С. Если можно, то для "юзверей" пояснение. Спасибо =)

Советую подтереть комментарии, потому как не знаю, примет ли ReActions "код" с ними
Код:
ВАШ_ТИП_АКТИВАТОРА:
  CheckGroup:
    flags:
    # Проверям, есть ли игрок в group1
    - group=group1
    actions:
    # Если да, запускаем следующий активатор
    - execute=activator:CheckItems
    reactions:
    # Если нет, выдаем сообщение
    - message=&cСначала получите группу &e"Группа1"&c!
EXEC:
  CheckItems:
    flags:
    # Проверяем наличие седла
    - item_inventory=type:SADDLE amount:1
    # Проверяем наличие обычного угля(263:0) в количестве 32 шт.
    - item_inventory=type:COAL amount:32 data:0
    actions:
    # Если оба условия верны, то...
    # Забираем эти предметы
    - item_remove_inventory=type:SADDLE amount:1
    - item_remove_inventory=type:COAL amount:32 data:0
    # От лица консоли прописываем команду установки группы(в данном случае из PeX)
    - cmd_console=pex user %player_name% group set group1
    # Показываем радостное сообщение
    - message=&aПоздравляем с получением группы &e"Группа2"&a!
    reactions:
    # Если проверка провалилась, тогда огорчаем игрока
    - message=&cУ Вас недостаточно предметов для получения группы &e"Группа2"&c!

Можна ли выбрать всех игроков, имеющих конкретный пермишен, но за исключением того, кто спровоцировал активатор ??

Если я правильно понял, что можно передать временную переменную в следующий активатор, то как-нибудь так:
Код:
EXEC:
  MuchPlayers:
    actions:
    - var_temp_set=id:but_not_me value:%player_name%
    - execute=activator:MuchPlayers2 player:all
  MuchPlayers2:
    flags:
    - perm=i.am.super.man
    - '!compare=param:%player_name% value1:%but_not_me%'
    actions:
    - execute=activator:YourActivator
  YourActivator: []
Не уверен с работой 'perm:{}' в селекторе игроков, поэтому сделал проверку в следующем. Под YourActivator вставлять тот активатор, что вам нужен
 
@fromgate
Я тоже сначала подумал что может быть дело в ядре. Поставил KCauldron и поставил туда эту же версию плагина.
Ошибка такая же. 2 автора удалили API ? странно.
Не забывайте, что (цитирую): «Thermos is a fork of KCauldron...». Я вижу ошибку Java, которая говорит, что плагин не видит метода, который есть в обычном Bukkit API.

А теперь смотрим вот этот скриншот:
http://clip2net.com/s/3L8slIE и видим что кнопка создалась спокойно.
Что вас тогда не не устраивает?

Вопрос почему тогда на новой версии не работает??
Кстати в консоле также не каких ошибок от ReActions нету. Хотелось бы новую версию :(

Я не понимаю, где что и когда у вас работает или не работает. Напишите конкретно.
 
Если я правильно понял, что можно передать временную переменную в следующий активатор, то как-нибудь так:
Код:
EXEC:
  MuchPlayers:
    actions:
    - var_temp_set=id:but_not_me value:%player_name%
    - execute=activator:MuchPlayers2 player:all
  MuchPlayers2:
    flags:
    - perm=i.am.super.man
    - '!compare=param:%player_name% value1:%but_not_me%'
    actions:
    - execute=activator:YourActivator
  YourActivator: []
Не уверен с работой 'perm:{}' в селекторе игроков, поэтому сделал проверку в следующем. Под YourActivator вставлять тот активатор, что вам нужен

Да неее... Ну а что дальше то? В следующем YourActivator надо будет указать всё тот же селектор локации, который всё так же выберет тех самых игроков, как если бы указать его просто в MuchPlayers.
Мне вчера теорему Пифагора догнать пришлось, но я придумал как без указания радиуса можна вычислить есть ли в твоей локации игрок, имеющий конкретное право, или нету.
Потом скину. Надо немного доработать...



[upd] В обшем, вот как можна вычислить есть ли в тваем радиусе игрок, обладающий конкретным пермишеном, или нету такого.
P.S. Если кому-то пригодится, надеюсь поможете улучшить этот алгоритм. В нем есть пару недостатков, описаных вконце -- https://pastebin.com/VKp7uuUk

P.S. Я лично использую его что бы отправлять разные форматы сообщений от игроков к модераторам. У меня модераторы видят весь чат, не зависимо локальный он или глобальный, но когда отправляется формат №2, из ключевого действия, модератор понимает что игрока нет в его локальном радиусе. А когда стандартный формат - значит игрок в радиусе.





Тут походу напутано с форматами времени https://github.com/Redolith/ReActions/wiki/Time-Format
Например MM (капсом) это месяца, а не минуты. A SS это милисекунды, а не секунды
Вопрос: А если ктото зайдет под ником "general", все глобальные переменные начнет считать как его персональные ??
 
Последнее редактирование:
[upd] В обшем, вот как можна вычислить есть ли в тваем радиусе игрок, обладающий конкретным пермишеном, или нету такого.
P.S. Если кому-то пригодится, надеюсь поможете улучшить этот алгоритм. В нем есть пару недостатков, описаных вконце -- https://pastebin.com/VKp7uuUk
Это ж как заморочиться надо было :good:. Я всегда по этой схеме работал (проигрываем звук для игроков в радиусе):
Код:
ITEM_CLICK:
  FStaff:
  item: 'type:STICK data:0 enchantments:FIRE_ASPECT:5 name:{&6Элементальный Посох
  &7- &c&oОгонь} lore:{\n&7Элемент: &c&oОгонь} regex:false'
  flags:
  - DELAY_PLAYER=id:fstaff set-time:12s
  - '!GROUP=dev'
  actions:
  - 'EXECUTE=activator:FStaff3 player:{player:null loc:%PLAYER_LOC% radius:10}'               # <—
  - WAIT=500ms
  - ...[куча визуальных эффектов]
  reactions:
  - CMD_CONSOLE=tm amsg %PLAYER_NAME% &b&lПосох охлаждается!
EXEC:
  FStaff3:
  actions:
  - CMD_CONSOLE=openaudio play %PLAYER_NAME% https://www.dropbox.com/s/9ghslx2o9gj1foo/light.ogg?dl=1
Особо не вдумывался, но тоже может сработать. Ловим сообщение игрока, отменяем, выполняем exec. Ставим игрокам в радиусе переменную в значение 1, а игроку, который отправил сообщение, в значение 2. Выполняем ещё один exec. Если переменная =2, то отправляем одно сообщение, если не равна, то выполняем ещё один exec, если переменная равна 1, то отправляем нужное сообщение, если нет, то выполняем ещё один exec, если переменная не равна 1 и 2, то отправляем всем остальным игрокам (модераторам и выше) нужное сообщение и чистим переменные или ставим всем игрокам переменную в значение 0. Как-то так... Не уверен, что будет, если отправить несколько сообщений одновременно (думаю, можно реализовать через IF_ELSE, тогда все проверки через exec будут в одном активаторе). Не отрицаю, что это очень костыльно (и это лишь в теории, на практике не проверял).
 
Ловим сообщение игрока, отменяем, выполняем exec. Ставим игрокам в радиусе переменную в значение 1, а игроку, который отправил сообщение, в значение 2. Выполняем ещё один exec. Если переменная =2, то отправляем одно сообщение, если не равна, то выполняем ещё один exec, если переменная равна 1, то отправляем нужное сообщение, если нет, то выполняем ещё один exec, если переменная не равна 1 и 2, то отправляем всем остальным игрокам (модераторам и выше) нужное сообщение и чистим переменные или ставим всем игрокам переменную в значение 0. Как-то так... Не уверен, что будет, если отправить несколько сообщений одновременно (думаю, можно реализовать через IF_ELSE, тогда все проверки через exec будут в одном активаторе). Не отрицаю, что это очень костыльно (и это лишь в теории, на практике не проверял).

Тоесть
Код:
MESSAGE:
  initiate:
    ...
    actions:
    - cancel_event
    - execute=activator:exe1  player:{loc:%player_loc% radius:30}
    - var_player_set=id:playerMsgSender  value:2

EXEC:
  exe1:
    actions:
    - var_player_set=id:playerInRadius  value:1

А дальше?? С момента "Если переменная =2, то..." не совсем понял. О какой именно переменной идет речь?
 
А дальше?? С момента "Если переменная =2, то..." не совсем понял. О какой именно переменной идет речь?
В этом случае о переменной 'playerInRadius'. Игроку, который запустил активатор, выставляем 2, игрокам в радиусе 1. Потом выводим сообщение в зависимости от значения этой переменной (написавшему одно, игрокам в радиусе другое, модераторам вне радиуса третье). В конце обнуляем эти переменные игрокам.
Можно не заморачиваться со значением 2, но тогда у игрока, который запустил активатор, будет такое же сообщение, как и у других в радиусе.
 
Последнее редактирование:
В этом случае о переменной 'playerInRadius'. Игроку, который запустил активатор, выставляем 2, игрокам в радиусе 1. Потом выводим сообщение в зависимости от значения этой переменной (написавшему одно, игрокам в радиусе другое, модераторам вне радиуса третье). В конце обнуляем эти переменные игрокам.
Можно не заморачиваться со значением 2, но тогда у игрока, который запустил активатор, будет такое же сообщение, как и у других в радиусе.
Блин... Но что значит "в зависимости от значения этой переменной" ?? Если мы выставим этой (playerInRadius) переменной 1 (персонально, каждому игроку что находится в радиусе игрока-инициатора), то оно так и будет 1, не зависимо ни от чего )) Толку нам с неё??
...Или что я не так понял ??
 
Блин... Но что значит "в зависимости от значения этой переменной" ?? Если мы выставим этой (playerInRadius) переменной 1 (персонально, каждому игроку что находится в радиусе игрока-инициатора), то оно так и будет 1, не зависимо ни от чего )) Толку нам с неё??
...Или что я не так понял ??
Не совсем понял. Выставляем переменную в значение 1, выполняем exec всем игрокам, который проверяет значение этой переменной флагом. И в зависимости от значения отправляем нужное сообщение. Выглядит примерно так: 'playerInRadius=1' --> [msg1], 'playerInRadius=2' --> [msg2], 'playerInRadius не равно 1 или 2' --> [выводим сообщение модераторам вне радиуса], --> сброс переменных.
 
Не совсем понял. Выставляем переменную в значение 1, выполняем exec всем игрокам, который проверяет значение этой переменной флагом. И в зависимости от значения отправляем нужное сообщение. Выглядит примерно так: 'playerInRadius=1' --> [msg1], 'playerInRadius=2' --> [msg2], 'playerInRadius не равно 1 или 2' --> [выводим сообщение модераторам вне радиуса], --> сброс переменных.
Я так и не понял в следствии чего 'playerInRadius' должна сменить свае значение с 1 на 2, ну да ладно... Тут только на практике надо тестить. Полюбому есть несостыковки...

Мне сейчас больше интересно, возможно ли вывести под одну переменную список игроков, которых выбрал селектор/к которым применился активатор ??
Например если ты выполняеш - 'EXECUTE=activator:act1 player:{loc:%player_loc% radius:30}'
который выберет всех онлайн игроков в радиусе 30 от инициатора, то как загнать всех их под одну переменную??

Если бы придумать как такое сделать, то этот список "игроков, которые услишали" можна было бы выводить ховерЕвентом при каждом меседже. В результате чего при наведению мышкой на меседж, игроки видели бы кто увидел их сообщение. Помоему очень круто!

Придумал!
Код:
MESSAGE:
  initiate:
    source: CHAT_INPUT
    type: CONTAINS
    mask: ''
    actions:
    - 'VAR_PLAYER_SET=id:countPlayers_in-localRadius  value:initiatorName'
    - 'REGEX=input:{%player%}  regex:{.+}'
    - 'EXECUTE=activator:eachPlayerCounter  player:{loc:%player_loc% radius:30}'


EXEC:
  eachPlayerCounter:
    actions:
    - 'VAR_SET=player:%group:0:0%  id:countPlayers_in-localRadius  value:{%var:%group:0:0%.countPlayers_in-localRadius%, %player%}'

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


Предложение:
1. Сделать возможность сохранять временные плейсхолдеры после действия WAIT.
2. Добавить селектору игроков возможность задавать радиус в диапазоне [от-до], что бы к примеру выбрать всех игроков которые находятся на расстоянии дальше 20-ти блоков, но не больше 30-ти...
Предложение: добавить параметр liveTime к переменным, по истечению которого переменная самоудалится. У меня сотни переменных, которые актуальны лишь на долю секунды. Тут это бы пригодилось.
К liveTime также стоит добавить аргумент, что бы он мог восполнятся/уменьшатся/обновлятся когда это надо.
 
Последнее редактирование:
@fromgate
Окей напишу подробнее. Я пытаюсь создать кнопку которая весит на ванильном блоке с помощью команды
/ra add BUTTON spawnex - к примеру
Если я использую самую новую версию, то вылетает ошибка из моего первого поста.
Далее я использовал версию которая когда-то у меня стояла (в декабре) после этого я не делал не обновлений плагина - она работает корректно и кнопка создалась.

Так же не понятно почему на работает на новой версии /ra add REGION_ENTER test в игровом чате.
Логично можно предположить что не будет работать и в консоле, а там работает.
p.s. Могу показать на стриме.
p.s.s Хотелось бы новую версию.. обновления довольно вкусные......
 
Использую активатор 'MOB_KILL', с его помощью добавляю новый дроп для мобов ('ITEM_DROP'). Проблема в том, что это работает и для мобов из MythicMobs (далее MM). Можно ли добавить поддержку этого плагина? Что-то вроде этого:
Будет ли работать для мобов из MM:
Код:
MOB_KILL: (+ MOB_DAMAGE)
  Mob_1:
    mythic-mobs: true/false
Проверка флагом типа моба из MM:
Код:
    flags:
    - MYTHIC_MOB=Ghost (название моба из MM)
Можно и в активаторы добавить поддержку:
Код:
    actions:
    - MOB_SPAWN=mythic-mob:Ghost
    - ITEM_DROP=mythic-item:GhostSword (название предмета из MM)
Если нет, то придётся убирать ванильных мобов и спавнить точно таких же при помощи MM, новый дроп там же им прописывать :oops:
UP! Это возможно? Нужен точный ответ (да/нет), надо что-то решать с мобами.
 
Как сделать проверку региона на наличие мобов? Т.е. если опр. мобы есть в регионе, то дверь закрыта, если их убили. дверь открывается.
Почему при вводе команды /react add MOB_KILL r1 type:zombie name:&2Защитник
ОН меняет Mob_kill на ob_damage
Да и даже если просто ввожу /react add MOB_KILL <ИмяАктиватора> type:<ТипСущности> [name:<ИмяМоба>]
То меняется на MOB_DAMAGE
 
Привет ребят! Как можно сделать сразу две команды на одну кнопку? Пример: Нажатие > /rg s spleef > //set 80
Спасибо заранее!
 
Не, а как именно сделать две команды в одной кнопке ? Это я пример просто назвал
 
Мне надо, что при вводе определённой команды выполнялась другая команда. Как это можно сделать?
 
Мне надо, что при вводе определённой команды выполнялась другая команда. Как это можно сделать?
Активатор COMMAND туда можно придумать все что угодно /lolkek
И к нему действие CMD
 
Назад
Верх