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

Сейчас немного переделал принцип выдачи временной опки. По идее будет безопаснее. Единственное где я вижу проблему — если после выдачи полномочий сервер намертво упадёт.
 
Вызывайте активатор EXEC активатор с параметром player:%mobname%
Ничего не выйдет, мы вместо имени получим его тип: PLAYER
Всё из-за того, что мы пытаемся получить имя игрока, используя функцию getCustomName(), но для игрока эта функция игнорируется. А раз мы ничего не получаем от этой функции, то устанавливаем тип моба, т.е. PLAYER.
Аналогично происходило и с %targetname% в действии SHOOT, но я там поправил, указав явное получение имени игрока. Думаю, в этих активаторах (MOB_DAMAGE, MOB_KILL) необходимо также подкорректировать код. Это могу сделать и я :)
 
Не планируете добавлять возможность проверки флагов WorldGuard?
 
Не планируете добавлять возможность проверки флагов WorldGuard?
Вродебы это не тяжело сделать. Флаг назвать REGION_STATE, а проверка будет выполняться следующим образом:
[world.]<region.flag>
пример:
REGION_STATE=world.spawn.use
 
build #76

При выполнении действия EXEC временные переменные, действующие в рамках вызывающего активатора, запоминаются и передаются в активатор EXEC.
 
Последнее редактирование:
Вродебы это не тяжело сделать. Флаг назвать REGION_STATE, а проверка будет выполняться следующим образом:
[world.]<region.flag>
пример:
REGION_STATE=world.spawn.use
Вот бы сделать параметры к флагу GROUP, чтобы он показывал в какой группе находится сейчас игрок, для которого был выполнен активатор
 
Я тут рекламку когда-то обещал запилить. Буду выставлять время от времени. Группа малость закинутая, но всё же... https://vk.com/club.omgcreeper?w=wall-47073014_1952690/all

+ Постер набросал на скорую руку. Может быть кто-то найдет ему применение на какой-то викиСтранице или ещё где...
EN -- http://prnt.sc/f62a75
RU -- http://prnt.sc/f62b11
 
Вот бы сделать параметры к флагу GROUP, чтобы он показывал в какой группе находится сейчас игрок, для которого был выполнен активатор
Есть простой способ, как это узнать, используя FLAG_SET:
Код:
EXEC:
  test_flags:
    flags:
    - FLAG_SET=GROUP:default GROUP:fly GROUP:vip GROUP:vipp GROUP:god GROUP:mvp GROUP:mvpp GROUP:creative GROUP:admin GROUP:owner
    actions:
    - CMD_CONSOLE=say &eИгрок &a%player% &eпринадлежит группе &6&l%GROUP_FLAG%
 
Спасибо, в принципе, я примерно так и думал. Столкнулся с проблемой, получить префикс игрока, который в данный момент установлен, чтобы если изменить на другой, ты как. То смог вернуть который был
Пример: /prefix set - это я знаю
/prefix off - вернуть тот который был до изменения.
Можно как-то наверно сначала получить группу, а после сохранить префикс в переменную
 
сохранить префикс в переменную
Есть плейсхолдер %PLAYER_DISPLAY%, который показывает ник игрока с его префиксом. Нужно просто извлеч префикс из этой переменной, используя действие REGEX. Как пример:
Код:
COMMAND:
  pref:
    override: true
    regex: true
    command: cmd:prefix arg1:set
    actions:
    - CANCEL_EVENT=true
    - REGEX=input:{%PLAYER_DISPLAY%} regex:{(.*)(%player%)(.*)}
    - VAR_PLAYER_SET=id:prefix value:{%group01%}
    - 'MESSAGE=&aМой префикс: &r%varp:prefix%'
Если у вас префикс с пробелами, то в переменную необходимо записывать результат в фигурных скобках:
- VAR_PLAYER_SET=id: prefix value:{%group01%}
 
Последнее редактирование:
build #76

При выполнении действия EXEC временные переменные, действующие в рамках вызывающего активатора, запоминаются и передаются в активатор EXEC.
Что же получается? Принудительно запретить разворачивание плейсхолдера нельзя, а теперь ещё и костыль в виде EXEC'a вызвать будет нельзя? Или это только первый этап внедрения инструмента для экранирования?
Но тогда придётся переписывать всё то, что опиралось на исчезновение в EXEC временных плейсхолдеров...

P.S. После WAIT тогда уж исчезновение локальных плейсхолдеров тоже нужно пофиксить.
 
Есть плейсхолдер %PLAYER_DISPLAY%, который показывает ник игрока с его префиксом. Нужно просто извлеч префикс из этой переменной, используя действие REGEX. Как пример:
Код:
COMMAND:
  pref:
    override: true
    regex: true
    command: cmd:prefix arg1:set
    actions:
    - CANCEL_EVENT=true
    - REGEX=input:{%PLAYER_DISPLAY%} regex:{(.*)(%player%)(.*)}
    - VAR_PLAYER_SET=id:prefix value:{%group01%}
    - 'MESSAGE=&aМой префикс: &r%varp:prefix%'
Если у вас префикс с пробелами, то в переменную необходимо записывать результат в фигурных скобках:
- VAR_PLAYER_SET=id: prefix value:{%group01%}
Как вообще понять регулярные выражения. Что нужно выучить
 
@Lyosha12
Ну создание активаторов на лету, я могу рассматривать исключительно как недокументированная функция ;)

А наследование параметров EXEC'ом у меня планировалось очень давно.
WAIT - посмотрю, можно ли будет там это сделать в принципе.
Как вообще понять регулярные выражения. Что нужно выучить

Для начало надо про них немного прочитать. Погуглите что-нибудь.
В процессе сочинения выражений я часто пользуюсь сервисом: https://regex101.com/
Ну и можно распечатать себе подсказку: https://www.cheatography.com/davechild/cheat-sheets/regular-expressions/
 
@Lyosha12
Ну создание активаторов на лету, я могу рассматривать исключительно как недокументированная функция ;)
Нет, да как же так? Если в EXEC будет хоть что-то разворачиваться, как и в WAIT, но экранирования плейсхолдеров Вы так и не добавите, то мне придётся присматривать альтернативы ReActions, в том числе придётся присмотреться к Spigot API и самому начать писать плагины... Ваш плагин сейчас для меня - единственный удобно инкапсулирующий внутреннее API игры.

Или Вы считаете, что такие решения не очень красивы и эффективны, что действительно следует искать альтернативы для создания подобного поведения?

Код:
EXEC:
  RemoveParkourVariables:
    actions:
    - VAR_PLAYER_CLEAR=id:isInParkour
    - VAR_PLAYER_CLEAR=id:Cur_CheckPoint
    - VAR_PLAYER_CLEAR=id:Lives
    - VAR_PLAYER_CLEAR=id:Parkour-FullWay
  ToCheckPoint:
    flags:
    - VAR_PLAYER_GREATER=id:Lives value:1
    actions:
    - VAR_PLAYER_DEC=id:Lives
    - 'MESSAGE=%var:prefix% &c-1 жизнь. Осталось жизней: &3%varp:Lives%&c.'
    - TP=loc:%varp:Cur_CheckPoint%
    reactions:
    - EXECUTE=activator:RemoveParkourVariables player:%player%
    - MESSAGE=%var:prefix% &cВсе жизни потрачены, увы.
    - TP=loc:Parkour_Start

   
REGION_ENTER:
  Illegal_Enter:
    region: General.parkour
    flags:
    - '!VAR_PLAYER_EXIST=id:isInParkour'
    actions:
    - MESSAGE=%var:prefix% &cНа паркур нужно заходить только через &6/warp parkour&c!
    - CMD_CONSOLE=spawn %player%
  Parkour-jump1:
    region: General.Parkour-Jump1
    actions:
    - VELOCITY=vector:0,0.8,0.5
  Parkour-Jump2:
    region: General.parkour-jump2
    actions:
    - VELOCITY=vector:0.4,1,0
  Parkour-Loser:
    region: General.parkour-lose
    actions:
    - EXECUTE=activator:ToCheckPoint player:%player%
REGION_LEAVE:
  Legal_leave-RGLeave:
    region: General.parkour
    actions:
    - EXECUTE=activator:RemoveParkourVariables player:%player%
    - MESSAGE=%var:prefix% &2Вы покинули паркур.
QUIT:
  Legal_leave-Quit:
    actions:
    - EXECUTE=activator:RemoveParkourVariables player:%player%
REGION:
  Anti-Fly:
    region: General.parkour
    flags:
    - STATE=FLY
    - VAR_PLAYER_GREATER=id:Lives value:1
    - '!GROUP=Authors'
    actions:
    - EXECUTE=activator:ToCheckPoint player:%player%
    - 'MESSAGE=%var:prefix% &cНе-не-не! Никаких полётов, шулер!'
    - CMD_CONSOLE=fly %player% off
  Anti-Effects:
    region: General.parkour
    flags:
    - VAR_PLAYER_GREATER=id:Lives value:1
    actions:
    - POTION_REMOVE=all
  Anti-Glide:
    region: General.parkour
    flags:
    - STATE=GLIDE
    - VAR_PLAYER_GREATER=id:Lives value:1
    actions:
    - GLIDE=glide:false
    - EXECUTE=activator:ToCheckPoint player:%player%
    - 'MESSAGE=%var:prefix% &cПоимей же совесть! Чтобы так мухлевать, я не даже знаю кем нужно быть...'
BUTTON:
  Parkour-End:
    world: General
    x: -192
    y: 101
    z: 148
    actions:
    - CMD_CONSOLE=eco give %player% 3000
    - CMD_CONSOLE=warp parkour %player%
    - BROADCAST=%var:prefix% &3%player% &2прошё паркур! - &a/warp parkour
   
    - VAR_SET=id:Parkour-TOP-8 value:%var:Parkour-TOP-7%
    - VAR_SET=id:Parkour-TOP-7 value:%var:Parkour-TOP-6%
    - VAR_SET=id:Parkour-TOP-6 value:%var:Parkour-TOP-5%
    - VAR_SET=id:Parkour-TOP-5 value:%var:Parkour-TOP-7%
    - VAR_SET=id:Parkour-TOP-4 value:%var:Parkour-TOP-3%
    - VAR_SET=id:Parkour-TOP-3 value:%var:Parkour-TOP-2%
    - VAR_SET=id:Parkour-TOP-2 value:%var:Parkour-TOP-1%
    - VAR_SET=id:Parkour-TOP-1 value:%player%
    - SIGN_SET_LINE=loc:General,-197,88,137 line1:{%var:Parkour-TOP-1%} line2:{%var:Parkour-TOP-2%} line3:{%var:Parkour-TOP-3%} line4:{%var:Parkour-TOP-4%}
    - SIGN_SET_LINE=loc:General,-193,88,137 line1:{%var:Parkour-TOP-5%} line2:{%var:Parkour-TOP-6%} line3:{%var:Parkour-TOP-7%} line4:{%var:Parkour-TOP-8%}
   
COMMAND:
  Warp-Parkour:
    regex: false
    override: false
    command: warp parkour
    actions:
    - VAR_PLAYER_SET=id:isInParkour value:true
  SetCheckPoint:
    regex: false
    override: true
    command: addCheckPoint
    flags:
    - GROUP=Authors
    actions:
    - REGEX=input:{%PLAYER_LOC_VIEW%} regex:{(\d+.\d+)|(-\d+.\d+)}
    - VAR_SET=id:X value:%calc:%group00%-0.5%
    - VAR_SET=id:Y value:%calc:%group10%-0.5%
    - VAR_SET=id:Z value:%calc:%group20%-0.5%
    - MESSAGE=%var:prefix% &2Чек-поинт по координатам (&3%var:X%&2, &3%var:Y%&2, &3%var:Z%&2) успешно создан.
    - 'CMD=ra add PLATE CheckPoint_%var:X%_%var:Y%_%var:Z%'
    - 'CMD_CONSOLE=ra add CheckPoint_%var:X%_%var:Y%_%var:Z% a MESSAGE %var:prefix% &2Чек-поинт! У Вас &b7&2 жизней!'
    - 'CMD_CONSOLE=ra add CheckPoint_%var:X%_%var:Y%_%var:Z% a VAR_PLAYER_SET id:Lives value:7'
    - 'CMD_CONSOLE=ra add CheckPoint_%var:X%_%var:Y%_%var:Z% a VAR_PLAYER_SET id:Cur_CheckPoint value:General,%var:X%,%var:Y%,%var:Z%'
    - 'CMD_CONSOLE=ra add CheckPoint_%var:X%_%var:Y%_%var:Z% a SOUND type:ENTITY_PLAYER_LEVELUP pitch:1 volume:2'
    - 'CMD_CONSOLE=ra add CheckPoint_%var:X%_%var:Y%_%var:Z% f !VAR_PLAYER_COMPARE id:Cur_CheckPoint value:General,%var:X%,%var:Y%,%var:Z%'
    - CMD_CONSOLE=ra group CheckPoint_%var:X%_%var:Y%_%var:Z% Core_Parkour_CheckPoints
    - VAR_CLEAR=id:X
    - VAR_CLEAR=id:Y
    - VAR_CLEAR=id:Z
   
    reactions:
    - MESSAGE=%var:prefix% &cНе-а, тебе нельзя использовать эту команду.

MESSAGE:
  Remove_NoPerm:
    source: CHAT_OUTPUT
    type: REGEX
    flags:
    - REGION=General.parkour
    - '!GROUP=Authors'
    mask: .*Ошибка.*
    actions:
    - CANCEL_EVENT=true
  Remove_LogRemoveEffects:
    source: LOG_OUTPUT
    type: REGEX
    mask: .*Couldn't take any effects from \S+ as they do not have any.*
    actions:
    - CANCEL_EVENT=true
 
Есть плейсхолдер %PLAYER_DISPLAY%, который показывает ник игрока с его префиксом. Нужно просто извлеч префикс из этой переменной, используя действие REGEX. Как пример:
Код:
COMMAND:
  pref:
    override: true
    regex: true
    command: cmd:prefix arg1:set
    actions:
    - CANCEL_EVENT=true
    - REGEX=input:{%PLAYER_DISPLAY%} regex:{(.*)(%player%)(.*)}
    - VAR_PLAYER_SET=id:prefix value:{%group01%}
    - 'MESSAGE=&aМой префикс: &r%varp:prefix%'
Если у вас префикс с пробелами, то в переменную необходимо записывать результат в фигурных скобках:
- VAR_PLAYER_SET=id: prefix value:{%group01%}
Данный код работает частично. Если заменить на %group02% то мой ник выводится.
А вот %group01% не работает
В переменных выводится
Код:
Dmitriy1:
  prefix: §4
general:
  loto_amount: '1.0'
  loto_start: '0'
В игре просто не показывается2017-05-10_18.51.51.png
Вот строчки с permissions.yml
Код:
    options:
      prefix: '&7[&3Хускарл&7] &e'

      default: false

Chat Manager: config.yml
Код:
message-format: '&7(&9L&7)&r %prefix %player %suffix &6> &f%message'

Походу дело в плейсхолдере %PLAYER_DISPLAY% я решил вывести просто его:
Код:
- 'MSG=Проверка: %PLAYER_DISPLAY%'
# Выводится мой ник
 
Последнее редактирование:
@Lyosha12
В принципе с плейсхолдером %raw:...% можно будет что-то придумать.

Или Вы считаете, что такие решения не очень красивы и эффективны, что действительно следует искать альтернативы для создания подобного поведения?
Наоборот. Я считаю, что это довольно круто. Но такие вещи менее предсказуемы. И наверняка имеют право на существование. В любом случае, ReActions оказался гораздо гибче, чем мне это казалось изначально. И динамического создания активаторов я точно себе не представлял изначально ;)
 
@Lyosha12
В принципе с плейсхолдером %raw:...% можно будет что-то придумать.


Наоборот. Я считаю, что это довольно круто. Но такие вещи менее предсказуемы. И наверняка имеют право на существование. В любом случае, ReActions оказался гораздо гибче, чем мне это казалось изначально. И динамического создания активаторов я точно себе не представлял изначально ;)
Рад слышать :)
Мне, как оказывается, предстоит ещё долгая работа с заказчиком сервера, а Ваш плагин, как всегда, лучше всех других. Если бы сейчас Вам не помогал @maxdikiy, то я бы и не реализовал и части из того, что мне заказали.
Можно проверить уровень здоровья игрока? В документации не видно флага.
Данный код работает частично. Если заменить на %group02% то мой ник выводится.
А вот %group01% не работает
Данный код работает частично. Если заменить на %group02% то мой ник выводится.
А вот %group01% не работает
Мне тоже немного не понятен смысл. Одно я понял точно: первое число - это номер вхождения заданного REGEX в тексте. Допустим, есть regex:{\d+\s} и input:{12 13 14}, тогда %group00% == "12 ", %group10% == "13 ", %group30% == ???. А что тогда 01? %group01% == 12" " == \s?
 
Последнее редактирование:
Назад
Верх