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

Допустим, есть regex:{\d+\s} и input:{12 13 14}, тогда %group00% == "12 ", %group10% == "13 ", %group30% == ???. А что тогда 01? %group01% == 12" " == \s?
Всё верно, так и должно быть.
Если бы вы поставили пробел после цифры 14 ( input:{12 13 14 }), тогда бы %group30% =="14"
В общем, я тоже не силён в регулярных выражениях, но действие REGEX я испытывал на этом сайте:
https://regex101.com/
и всё совпадало.

%groupNM%,
N - количество совпадений по маске
M- порядковый номер группы в одном совпадении (индекс группы начинается с 1). Проще говоря, сколько скобок "( )" в маске столько и групп.

Даю маленький пример, как быстро разобраться в REGEX
Допустим, нам необходимо отфильтровать
"a12 b13 c14 a21 b22 c23" по маске: [\d]+
В маске скобок нет, значит и групп тоже нет, т.е результат будет между %group00%...%group50%
Код:
EXEC:
  regex0:
    actions:
    - REGEX=input:{a12 b13 c14 a21 b22 c23} regex:{[\d]+}
    - 'log=group00: %group00%'
    - 'log=group10: %group10%'
    - 'log=group20: %group20%'
    - 'log=group30: %group30%'
    - 'log=group40: %group40%'
    - 'log=group50: %group50%'
Теперь попробуем отфильтровать ту же строку, но так, чтобы мы получили отдельно буквы, как группу. Маска будет следющая: ([^\d+])[\d]+. Как видим, буквы мы загоняем в отдельную группу, тогда результат будет следующим: %groupNM%, N=0..5, M=0..1
Код:
EXEC:
  regex1:
    actions:
    - REGEX=input:{a12 b13 c14 a21 b22 c23} regex:{([^\d+])[\d]+}
    - 'log=group00: %group00%'
    - 'log=group01: %group01%'
    - 'log=group10: %group10%'
    - 'log=group11: %group11%'
    - 'log=group20: %group20%'
    - 'log=group21: %group21%'
    - 'log=group30: %group30%'
    - 'log=group31: %group31%'
    - 'log=group40: %group40%'
    - 'log=group41: %group41%'
    - 'log=group50: %group50%'
    - 'log=group51: %group51%'
И на конец, нам нужно не только буквы занести в группу, но и числа, тогда маска будет следующей:
([^\d])([\d]+) , а результат будет таким: %groupNM%, N=0..5, M=0..2
Код:
EXEC:
  regex2:
    actions:
    - REGEX=input:{a12 b13 c14 a21 b22 c23} regex:{([^\d])([\d]+)}
    - 'log=group00: %group00%'
    - 'log=group01: %group01%'
    - 'log=group02: %group02%'
    - 'log=group10: %group10%'
    - 'log=group11: %group11%'
    - 'log=group12: %group12%'
    - 'log=group20: %group20%'
    - 'log=group21: %group21%'
    - 'log=group22: %group22%'
    - 'log=group30: %group30%'
    - 'log=group31: %group31%'
    - 'log=group32: %group32%'
    - 'log=group40: %group40%'
    - 'log=group41: %group41%'
    - 'log=group42: %group42%'
    - 'log=group50: %group50%'
    - 'log=group51: %group51%'
    - 'log=group52: %group52%'
Надеюсь, тепер вам, да и мне тоже, будет проще разобраться в этом.
P.S. Эти примеры можно испытывать в консоли:
/exec regex0
/exec regex1
/exec regex2
 
Всё верно, так и должно быть.
Если бы вы поставили пробел после цифры 14 ( input:{12 13 14 }), тогда бы %group30% =="14"
В общем, я тоже не силён в регулярных выражениях, но действие REGEX я испытывал на этом сайте:
https://regex101.com/
и всё совпадало.

%groupNM%,
N - количество совпадений по маске
M- порядковый номер группы в одном совпадении (индекс группы начинается с 1). Проще говоря, сколько скобок "( )" в маске столько и групп.

Даю маленький пример, как быстро разобраться в REGEX
Допустим, нам необходимо отфильтровать
"a12 b13 c14 a21 b22 c23" по маске: [\d]+
В маске скобок нет, значит и групп тоже нет, т.е результат будет между %group00%...%group50%
Код:
EXEC:
  regex0:
    actions:
    - REGEX=input:{a12 b13 c14 a21 b22 c23} regex:{[\d]+}
    - 'log=group00: %group00%'
    - 'log=group10: %group10%'
    - 'log=group20: %group20%'
    - 'log=group30: %group30%'
    - 'log=group40: %group40%'
    - 'log=group50: %group50%'
Теперь попробуем отфильтровать ту же строку, но так, чтобы мы получили отдельно буквы, как группу. Маска будет следющая: ([^\d+])[\d]+. Как видим, буквы мы загоняем в отдельную группу, тогда результат будет следующим: %groupNM%, N=0..5, M=0..1
Код:
EXEC:
  regex1:
    actions:
    - REGEX=input:{a12 b13 c14 a21 b22 c23} regex:{([^\d+])[\d]+}
    - 'log=group00: %group00%'
    - 'log=group01: %group01%'
    - 'log=group10: %group10%'
    - 'log=group11: %group11%'
    - 'log=group20: %group20%'
    - 'log=group21: %group21%'
    - 'log=group30: %group30%'
    - 'log=group31: %group31%'
    - 'log=group40: %group40%'
    - 'log=group41: %group41%'
    - 'log=group50: %group50%'
    - 'log=group51: %group51%'
И на конец, нам нужно не только буквы занести в группу, но и числа, тогда маска будет следующей:
([^\d])([\d]+) , а результат будет таким: %groupNM%, N=0..5, M=0..2
Код:
EXEC:
  regex2:
    actions:
    - REGEX=input:{a12 b13 c14 a21 b22 c23} regex:{([^\d])([\d]+)}
    - 'log=group00: %group00%'
    - 'log=group01: %group01%'
    - 'log=group02: %group02%'
    - 'log=group10: %group10%'
    - 'log=group11: %group11%'
    - 'log=group12: %group12%'
    - 'log=group20: %group20%'
    - 'log=group21: %group21%'
    - 'log=group22: %group22%'
    - 'log=group30: %group30%'
    - 'log=group31: %group31%'
    - 'log=group32: %group32%'
    - 'log=group40: %group40%'
    - 'log=group41: %group41%'
    - 'log=group42: %group42%'
    - 'log=group50: %group50%'
    - 'log=group51: %group51%'
    - 'log=group52: %group52%'
Надеюсь, тепер вам, да и мне тоже, будет проще разобраться в этом.
P.S. Эти примеры можно испытывать в консоли:
/exec regex0
/exec regex1
/exec regex2
Может. Что-то не так с %player_display%?
 
Последнее редактирование:
Может. Что-то не так с %player_display%?
С этим плейсхолдером всё в порядке, просто у вас, нет плагина, который меняет эту переменную или не настроен. Например, у меня этим занимается essentials. Я не использую Chat Manager, по причине того, что с чатом замечательно справляется Essentials+EssentialsChat. И не утверждаю, что Chat Manager хуже, просто для решения вашей проблемы, необходимо искать другой путь.
Предлагаю ещё одну схему:
1. Определяем группу игрока%GROUP_FLAG%, используя флаги FLAG_SET и GROUP
2. Запускаем команду: - cmd_console=pex group %GROUP_FLAG%
Это выведет в консоль сообщение типа:
Код:
[08:40:56 INFO]: 'owner' inherits the following groups:
[08:40:56 INFO]: Group "owner"'s permissions:
[08:40:56 INFO]: 1) * (own)
[08:40:56 INFO]: Group "owner"'s Options:
[08:40:56 INFO]:   suffix = "&9"
[08:40:56 INFO]:   prefix = "&6&l[&b&lВладелец&6&l] &9&l"
3. С помощью активатора MESSAGE отловим строку, где указан префикс
(prefix =....).
4. В этом активаторе воспользуемся действием REGEX, где выловим, то что нам нужно

Есть ещё вариант.
1. Импортируем базу PEX в MySQL
2. С помощью действия SQL_SELECT вытащим нужный нам префикс

Есть ещё вариант.
Зная все префиксы, вы просто можете записать их в переменные:
- default: [Игрок]
- vip: [VIP]
...
- owner: &6&l[&b&lВладелец&6&l] &9&l
где default, vip, ...,owner - ваши группы, которые записаны в PEX
[Игрок], [VIP], ... префиксы.
Чтобы получить префикс, достаточно узнать группу игрока и получить по ней уже известную переменную.
 
Надеюсь, тепер вам, да и мне тоже, будет проще разобраться в этом.
Да, вот теперь понятно. Действительно удобно, если нужно сделать что-то и с содержанием вхождения.
 
build #77
  • Добавлен плейсхолдер %raw:<%ДругойПлейсхолдер%>%. Он позволяет предотвратить подстановку значения вложенного плейсхолдера. После обработки этого плейхсолдера он заменится на вложенный (а не на его значений).
 
build #78
  • Добавлен новый флаг REGION_STATE. Проверяет значение флага в регионе
    REGION_STATE = [<Мир>.]<Регион.ИмяФлага.ЗначениеФлага>
  • список WorldGuard флагов: <ИмяФлага>
Пример установки флагов в активаторе:
Код:
- REGION_STATE=world.spawn.use.deny
- REGION_STATE=world.spawn.gamemode.creative
- '!REGION_STATE=world.spawn.game-mode.survival'
- REGION_STATE=spawn.tnt.allow
 
Последнее редактирование:
build #78
  • Добавлен новый флаг REGION_STATE. Проверяет значение флага в регионе
    REGION_STATE = [<Мир>.]<Регион.ИмяФлага.ЗначениеФлага>
  • список WorldGuard флагов: <ИмяФлага>
Пример установки флагов в активаторе:
Код:
- REGION_STATE=world.spawn.use.deny
- REGION_STATE=world.spawn.gamemode.creative
- '!REGION_STATE=world.spawn.game-mode.survival'
- REGION_STATE=spawn.tnt.allow
Отличный флаг!

А возможно ли добавить аргумент для подгруппы игроков, на которых WG флаг ориентирован??
- REGION_STATE=world.spawn.gamemode.creative flagGroup:{NONMEMBERS, NONOWNERS}

У меня есть одна идея, которую я очень давно хотел реализовать. Но не получалось т.к. небыло возможности проверить состояние WG флага и подгруппы игроков.
 
А возможно ли добавить аргумент для подгруппы игроков, на которых WG флаг ориентирован??
build #81
  • Добавлена проверка групп игроков установленного флага в регионе
REGION_STATE = [<Мир>.]<Регион.ИмяФлага.ЗначениеФлага>[/<GroupName>]
<GroupName> : all | members | owners | nonmembers | nonowners
​
 
Последнее редактирование:
build #77
  • Добавлен плейсхолдер %raw:<%ДругойПлейсхолдер%>%. Он позволяет предотвратить подстановку значения вложенного плейсхолдера. После обработки этого плейхсолдера он заменится на вложенный (а не на его значений).
Отлично! Благодарю!
 
build #81
  • Добавлена проверка групп игроков установленного флага в регионе
REGION_STATE = [<Мир>.]<Регион.ИмяФлага.ЗначениеФлага>[/<GroupName>]
<GroupName> : all | members | owners | nonmembers | nonowners
​
Вот... Теперь это топовый флаг!
Чуть-чуть не дотянул до полугода ;) Действительно была ошибка. Вроде бы исправил.

build #85
Но разницы между тактами и секундами в РеАкшнс по сути нет?? Оно всё равно будет переганять их в таймштампы и исполнять, операясь на время системы ? Или оно будет учитывать длительность такта сервера ?? Если к примеру на сервере TPS упал в 2 раза (=10) то и указанные 20 тактов в формате будут интерпретироватся не как 1, а как 2 секунды ?
 
Там где на уровне баккита используются такты, т.е. "выполнить через 5 тактов" - то будут использоваться такты и и скажем, WAIT в случае указания времени в мс может выполниться позднее, потому что задержка выставляется в тактах. Т.е., 1 секунда действительно превратится в 2, если TPS равен 10 на протяжении этих двух секунд.
 
Там где на уровне баккита используются такты, т.е. "выполнить через 5 тактов" - то будут использоваться такты и и скажем, WAIT в случае указания времени в мс может выполниться позднее, потому что задержка выставляется в тактах. Т.е., 1 секунда действительно превратится в 2, если TPS равен 10 на протяжении этих двух секунд.
Чтоже, это хорошо, да!
 
build #95
Этот активатор инициируется, когда игрок выполняет щелчок правой кнопкой мыши по сущности (Entity). С этим активатором вы сможете запретить вставлять в рамку предметы или вращать предметы в рамке. Можно запретить садиться в лодку, minecart и на лошадь.
 
Вопрос: Если в действии SOUND пропустить аргумент [location], то по дефолту там подставятся координаты поточного местонахождения игрока, или же 0, 0, 0 ??

Просто в дефолтной команде /playSound, что бы игрок услишал воспроизводимый звук, он должен либо находится возле координат, на которых воспроизводится звук, либо радиус сферы этого звука должен быть достаточно огромным (999999+) что бы игрок услишал звук в любой точке, даже если он воспроизведен на координатах 0,0,0, а игрок где то на 20000+
/playSound block.anvil.use master @a ~ ~ ~ 9999999999


Ну тоесть каким образом реАкшнс делает так, что бы игрок всегда слишал воспроизводимый звук ??
И ещё: из какиго источника исходит этот звук ??





Что я делаю не так??
Хотел отловить и отменить этот меседж http://prnt.sc/f7x603
с помощью активатора MESSAGE...

И если ловить его так
Код:
  Vanilla-cancelMsg-1:
    source: CHAT_OUTPUT
    type: CONTAINS
    mask: 'sound'
    actions:
    - 'CANCEL_EVENT=true'
то всё ок!


Но если я хочу применить REGEX, что бы уточнить параметры
Код:
  Vanilla-cancelMsg-1:
    source: CHAT_OUTPUT
    type: REGEX
    mask: '^.*Played sound.*$'
    actions:
    - 'CANCEL_EVENT=true'
отловить невозможно...
 
отловить невозможно...

Скорее всего это сообщение шлётся не текстом, а кодом сообщения — это сделано для локализации. Попробуйте фильтровать по подстроке: commands.playsound.success

Не получится, попробуйте отловить сообщение и посмотреть как оно выглядит на самом деле (выведите в этом активаторе значение переменной %message%)
 
Понял, дело в том что в маске нельзя указывать 2 слова через пробел. Но что делать если надо указать ??
 
Ну тоесть каким образом реАкшнс делает так, что бы игрок всегда слишал воспроизводимый звук ??
И ещё: из какиго источника исходит этот звук ??

Как правило, если в активаторе не указаны какие-то конкретные координаты, то подставляются координаты игрока.
 
Скорее всего это сообщение шлётся не текстом, а кодом сообщения — это сделано для локализации. Попробуйте фильтровать по подстроке: commands.playsound.success

Не получится, попробуйте отловить сообщение и посмотреть как оно выглядит на самом деле (выведите в этом активаторе значение переменной %message%)
вот только что попробывал урезать до одного слова в маске (mask: '^.*sound.*$')
и сработало... Но мне надо 2 слова
 
вот только что попробывал урезать до одного слова в маске (mask: '^.*sound.*$')
и сработало... Но мне надо 2 слова

В пакете отправляется сообщение "commands.playsound.success". То есть там нет текст Successfully played sound 'sdhfsj" for 'sakfskf'.
Там отправляется JSON конструкция одним из элементов которой является ключ сообщения commands.playsound.success (возможно другой) и параметры.
Отлавливайте именно этот ключ и всё. Пробелы там не причем. Их там просто нет.
 
Назад
Верх