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

А что конкретно мне подвергнуть анализу?
Да я уже сам не знаю ;) Довольно много правок.
В очередной раз подправил плейсхолдеры. Теперь с переменными работа более точная. Числовые переменные принудительно приводятся к "целому" значению - т.е. без ".0" (если они целые естественно).

Подправил ошибки в работе с предметами - делал описание и получал каждый предмет, в результате нашёл несколько недочетов, всё исправил.

Команды теперь регистрируются по аналогии с обычными. Сделано это правда всё через одно место, но цель (чтобы при нажатии на tab - они выводились в списке) достигнута.
Активатор COMMAND теперь оперирует регулярными выражениями (в случае если не задаются команда и параметры явно). Соответственно везде где было написано command:<НазваниеКоманды> нужно обязательно добавить ".*" если предполагается, что у команды могут быть аргументы.
Ещё активатору COMMAND добавлен локальный плейсхолдер %args%. Он представляет собой всю введенную пользователем строку за исключением команды.
Лично для меня это оказалось полезно для реализации команды выдачи предмета:

Код:
COMMAND:
  i:
    command: 'i .*'
    flags: []
    actions:
    - item_give=%args%
    reactions: []

Т.е. если я пишу /i type:BANNER data:13 color:MAGENTA patterns:TRIANGLES_TOP:YELLOW;TRIANGLES_BOTTOM:RED;SKULL:ORANGE то получаю в руки соответствующее знамя. Раньше я для этого пользовался небольшим плагином ;)
https://dl.dropboxusercontent.com/u/64799811/ReActions/ReActions.jar
 
Последнее редактирование:
@fromgate, мою благодарность невозможно выразить словами. Наконец-то я пересмотрю все-все-все логические связи у команд, огромное-преогромное спасибо! :)
---
Всё ещё можно применять плейсхолдеры для каждого аргумента в команде?
 
Последнее редактирование:
Числовые переменные принудительно приводятся к "целому" значению - т.е. без ".0" (если они целые естественно).
Команды теперь регистрируются по аналогии с обычными. Сделано это правда всё через одно место, но цель (чтобы при нажатии на tab - они выводились в списке) достигнута.
Активатор COMMAND теперь оперирует регулярными выражениями (в случае если не задаются команда и параметры явно). Соответственно везде где было написано command:<НазваниеКоманды> нужно обязательно добавить ".*" если предполагается, что у команды могут быть аргументы.
Ещё активатору COMMAND добавлен локальный плейсхолдер %args%. Он представляет собой всю введенную пользователем строку за исключением команды.
Лично для меня это оказалось полезно для реализации команды выдачи предмета:
Спасибо огромное!
 
@fromgate, опять начала донимать старая ошибка с двоеточием в тексте. Когда-то можно было взять строку в одинарные кавычки и эта гадость проходила. Или же поставить после двоеточия цветовой код. Однако, при использовании второго варианта идёт так же сравнение с этим "костылём". Соответственно, предмет не распознаётся как надо. Ошибка, собственно, при выдаче\изъятии\проверке:
Код:
 in "<string>", line 233, column 222:
     ... особности: §6ПКМ\n§5Длительность: §630 секунд\n§5Перезарядка спо ...
                                         ^

2015-06-19 07:06:59 [SEVERE]     at org.yaml.snakeyaml.scanner.ScannerImpl.fetchValue(ScannerImpl.java:733)
2015-06-19 07:06:59 [SEVERE]     at org.yaml.snakeyaml.scanner.ScannerImpl.fetchMoreTokens(ScannerImpl.java:305)
2015-06-19 07:06:59 [SEVERE]     at org.yaml.snakeyaml.scanner.ScannerImpl.checkToken(ScannerImpl.java:179)
2015-06-19 07:06:59 [SEVERE]     at org.yaml.snakeyaml.parser.ParserImpl$ParseBlockMappingKey.produce(ParserImpl.java:563)
2015-06-19 07:06:59 [SEVERE]     at org.yaml.snakeyaml.parser.ParserImpl.peekEvent(ParserImpl.java:161)
2015-06-19 07:06:59 [SEVERE]     at org.yaml.snakeyaml.parser.ParserImpl.checkEvent(ParserImpl.java:146)
2015-06-19 07:06:59 [SEVERE]     at org.yaml.snakeyaml.composer.Composer.composeMappingNode(Composer.java:230)
2015-06-19 07:06:59 [SEVERE]     at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:160)
2015-06-19 07:06:59 [SEVERE]     at org.yaml.snakeyaml.composer.Composer.composeSequenceNode(Composer.java:204)
2015-06-19 07:06:59 [SEVERE]     at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:158)
2015-06-19 07:06:59 [SEVERE]     at org.yaml.snakeyaml.composer.Composer.composeMappingNode(Composer.java:237)
2015-06-19 07:06:59 [SEVERE]     at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:160)
2015-06-19 07:06:59 [SEVERE]     at org.yaml.snakeyaml.composer.Composer.composeMappingNode(Composer.java:237)
2015-06-19 07:06:59 [SEVERE]     at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:160)
2015-06-19 07:06:59 [SEVERE]     at org.yaml.snakeyaml.composer.Composer.composeMappingNode(Composer.java:237)
2015-06-19 07:06:59 [SEVERE]     at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:160)
2015-06-19 07:06:59 [SEVERE]     at org.yaml.snakeyaml.composer.Composer.composeDocument(Composer.java:123)
2015-06-19 07:06:59 [SEVERE]     at org.yaml.snakeyaml.composer.Composer.getSingleNode(Composer.java:106)
2015-06-19 07:06:59 [SEVERE]     at org.yaml.snakeyaml.constructor.BaseConstructor.getSingleData(BaseConstructor.java:121)
2015-06-19 07:06:59 [SEVERE]     at org.yaml.snakeyaml.Yaml.loadFromReader(Yaml.java:480)
2015-06-19 07:06:59 [SEVERE]     at org.yaml.snakeyaml.Yaml.load(Yaml.java:399)
2015-06-19 07:06:59 [SEVERE]     at org.bukkit.configuration.file.YamlConfiguration.loadFromString(YamlConfiguration.java:53)
2015-06-19 07:06:59 [SEVERE]     ... 22 more
Ждать ли фикса в ближайшее время или всегда использовать после двоеточия в описании цветовой код?
 
@fromgate, мою благодарность невозможно выразить словами. Наконец-то я пересмотрю все-все-все логические связи у команд, огромное-преогромное спасибо! :)
---
Всё ещё можно применять плейсхолдеры для каждого аргумента в команде?


Да, плейсхолдеры arg1 ... argN остались. args - это просто дополнительный плейсхолдер.

Кстати, уже после своего сообщения, я подумал и добавил дополнительный параметр "regex" активатору (в файлах он появится), который нужно установить в true для того чтобы включить режим работы с регулярками в данном активаторе (а то полетят все ранее созданные активаторы).

И ещё, там же есть параметр override. Если есть необходимость, чтобы команда не работала, если какие-то сторонние плагины это запрещают, то нужно поставить override:false

@Lyosha12,
Покажи весь активатор пожалуйста. Попробую побороть.
Вообще странно. Двоеточия ну очень часто встречаются в тексте. Почему именно на эти он возмущается :(
 
Покажи весь активатор пожалуйста. Попробую побороть.
Один из связки:
Код:
  Pepel_I_Upgrade_1:
    command: cmd:upgrade arg1:Pepel1
    flags:
    - ITEM=amount:1 name:{§fМеч Пепла §cI} type:DIAMOND_SWORD lore:{§7Меч способен создать психическую\n§7защиту §3I§7. Противник будет наносить\n§7значительно меньше урона.\n§5Активация способности: §6ПКМ\n§5Длительность: §630 секунд\n§5Перезарядка способности: §c2 минуты\n§2Апгрейд: §4$1000 + 40 уровней\n§3Характеристики после апгрейда:\n§bДлительность: §61 минута\n§bПерезарядка: §c4 минуты\n§eНаберите §6/upgrade Pepel1§e,\n§eдержа меч в руках.\n§cАпгрейд снимает все чары\n§cи чинит меч.}
    - MONEY=1000
    - LEVEL=40
    actions: []
    reactions:
    - message=player:%player% &cАпгрейд меча не удался! &3Причины&c:&2
 
@Lyosha12
Ну вот смотри у меня так вгрузилось без ошибки:
Код:
COMMAND:
  Pepel_I_Upgrade_1:
    command: cmd:upgrade arg1:Pepel1
    flags:
    - 'ITEM=amount:1 name:{§fМеч Пепла §cI} type:DIAMOND_SWORD lore:{§7Меч способен создать психическую\n§7защиту §3I§7. Противник будет наносить\n§7значительно меньше урона.\n§5Активация способности: §6ПКМ\n§5Длительность: §630 секунд\n§5Перезарядка способности: §c2 минуты\n§2Апгрейд: §4$1000 + 40 уровней\n§3Характеристики после апгрейда:\n§bДлительность: §61 минута\n§bПерезарядка: §c4 минуты\n§eНаберите §6/upgrade Pepel1§e,\n§eдержа меч в руках.\n§cАпгрейд снимает все чары\n§cи чинит меч.}'
    - MONEY=1000
    - LEVEL=40
    actions: []
    reactions:
    - message=player:%player% &cАпгрейд меча не удался! &3Причины&c:&2

Загрузка осуществляется на уровне API баккита, который соответственно использует библиотеку SnakeYAML. Вообще меня всегда выручил одинарные кавычки (надо только брать всю строку за символом "-" до конца)
 
@Lyosha12
Ну вот смотри у меня так вгрузилось без ошибки:
Код:
COMMAND:
  Pepel_I_Upgrade_1:
    command: cmd:upgrade arg1:Pepel1
    flags:
    - 'ITEM=amount:1 name:{§fМеч Пепла §cI} type:DIAMOND_SWORD lore:{§7Меч способен создать психическую\n§7защиту §3I§7. Противник будет наносить\n§7значительно меньше урона.\n§5Активация способности: §6ПКМ\n§5Длительность: §630 секунд\n§5Перезарядка способности: §c2 минуты\n§2Апгрейд: §4$1000 + 40 уровней\n§3Характеристики после апгрейда:\n§bДлительность: §61 минута\n§bПерезарядка: §c4 минуты\n§eНаберите §6/upgrade Pepel1§e,\n§eдержа меч в руках.\n§cАпгрейд снимает все чары\n§cи чинит меч.}'
    - MONEY=1000
    - LEVEL=40
    actions: []
    reactions:
    - message=player:%player% &cАпгрейд меча не удался! &3Причины&c:&2

Загрузка осуществляется на уровне API баккита, который соответственно использует библиотеку SnakeYAML. Вообще меня всегда выручил одинарные кавычки (надо только брать всю строку за символом "-" до конца)
Действительно... Видимо, не в том месте ставил...
Но почему-то не работает сравнение...
Код:
  Pepel_I:
    item: 'amount:1 type:DIAMOND_SWORD lore:{§7Меч способен создать психическую\n§7защиту §3I§7. Противник будет наносить\n§7значительно меньше урона.\n§5Активация способности: §6ПКМ\n§5Длительность: §630 секунд\n§5Перезарядка способности: §c2 минуты\n§2Апгрейд: §4$1000 + 40 уровней\n§3Характеристики после апгрейда:\n§bДлительность: §61 минута\n§bПерезарядка: §c4 минуты\n§eНаберите §6/upgrade Pepel1§e,\n§eдержа меч в руках.\n§cАпгрейд снимает все чары\n§cи чинит меч.}'
    flags: []
    actions:
    - message=1
    reactions:
    - message=2
Сам меч выдаю из Essentials:
Код:
      - 276 1 name:&fМеч_Пепла_&cI lore:&7Меч_способен_создать_психическую|&7защиту_&3I&7._Противник_будет_наносить|&7значительно_меньше_урона.|&5Активация_способности:_&6ПКМ|&5Длительность:_&630_секунд|&5Перезарядка_способности:_&c2_минуты|&2Апгрейд:_&4$1000_+_40_уровней|&3Характеристики_после_апгрейда:|&bДлительность:_&61_минута|&bПерезарядка:_&c4_минуты|&eНаберите_&6/upgrade_Pepel1&e,|&eдержа_меч_в_руках.|&cАпгрейд_снимает_все_чары|&cи_чинит_меч.
 
@lyosha
Запиши его в переменную и посмотри текст. Может там что-то отличается.

Сравнения сегодня ещё дополнительно потестирую
Вообще если "Меч пепла I" - название уникальное, то опять же в сравнении можно писать только имя - будет достаточно.
 
@lyosha
Запиши его в переменную и посмотри текст. Может там что-то отличается.

Сравнения сегодня ещё дополнительно потестирую
Вообще если "Меч пепла I" - название уникальное, то опять же в сравнении можно писать только имя - будет достаточно.
Прикол в том, что при зачаровании или переименовании русское имя сбивается. А я хочу, чтобы свойства оставались, то есть только по лорке. Вот в переменной:
Код:
  test: 'amount:1 name:{§fМеч Пепла §cI} data:0 type:DIAMOND_SWORD lore:{§7Меч способен
    создать психическую\n§7защиту §3I§7. Противник будет наносить\n§7значительно меньше
    урона.\n§5Активация способности: §6ПКМ\n§5Длительность: §630 секунд\n§5Перезарядка
    способности: §c2 минуты\n§2Апгрейд: §4$1000 + 40 уровней\n§3Характеристики после
    апгрейда:\n§bДлительность: §61 минута\n§bПерезарядка: §c4 минуты\n§eНаберите §6/upgrade
    Pepel1§e,\n§eдержа меч в руках.\n§cАпгрейд снимает все чары\n§cи чинит меч.}'
Параграф? Но даже так не работает...
 
Последнее редактирование:
Странно, что в переменной параграф. Вроде должен на "&" заменяться. Странно.
 
@Lyosha12, я у себя тупо запретил пихать в наковальню уникальные вещи, правда с помощью другого плагинчика.
 
ну, у меня уникальные вещи (я их называю артефактами) это редкие предметы, которые или очень трудно найти или можно приобрести только за деньги, ну или выиграть в лотерею. У них усиленные чары, которые невозможно зачаровать в наковальне, чтобы пользоваться некоторыми нужно иметь "особые" права, вот и поэтому запретил их изменять в наковальне и копировать в креативе.
 
ну, у меня уникальные вещи (я их называю артефактами) это редкие предметы, которые или очень трудно найти или можно приобрести только за деньги, ну или выиграть в лотерею. У них усиленные чары, которые невозможно зачаровать в наковальне, чтобы пользоваться некоторыми нужно иметь "особые" права, вот и поэтому запретил их изменять в наковальне и копировать в креативе.
Ясно. С помощью Креатив-контроля и NBT-тэга, выключающего возможность зачарования?
 
Ясно. С помощью Креатив-контроля и NBT-тэга, выключающего возможность зачарования?
не, свой, самописный плагин
Очередной dev-билд 0.9.4/21
Здесь уже есть плейсхолдер, ник игрока, по которому кликнули?
Еще бы добавить плейсхолдер-ник игрока, на которого смотрим во время ПКМ и ЛКМ, но расстояние больше чем нужно для клика :), ну и в продолжение - плейсхолдер-ник игрока, которого ударили, и плейсхолдер-ник игрока, который ударил))), вместе с активатором "ПВП-урон" :oops:
 
@fromgate, если я укажу ник игрока, которого нет на сервере, и запущу для него активатор EXEC, то он запустится для меня. Так и должно быть?
Кстати, уже после своего сообщения, я подумал и добавил дополнительный параметр "regex" активатору (в файлах он появится), который нужно установить в true для того чтобы включить режим работы с регулярками в данном активаторе (а то полетят все ранее созданные активаторы).

И ещё, там же есть параметр override. Если есть необходимость, чтобы команда не работала, если какие-то сторонние плагины это запрещают, то нужно поставить override:false
Активаторы команд теперь должны выглядеть так?
Код:
  12:
    command: 'gift accept'
    override:false
    regex: false
    flags: []
    actions: []
    reactions: []
 
Здесь уже есть плейсхолдер, ник игрока, по которому кликнули?
Да, уже есть, позднее распишу.

Еще бы добавить плейсхолдер-ник игрока, на которого смотрим во время ПКМ и ЛКМ, но расстояние больше чем нужно для клика :), ну и в продолжение - плейсхолдер-ник игрока, которого ударили, и плейсхолдер-ник игрока, который ударил))), вместе с активатором "ПВП-урон" :oops:
Пока нет. Что-то возможно ещё добавлю.


Но почему-то не работает сравнение...
Код:
  Pepel_I:
    item: 'amount:1 type:DIAMOND_SWORD lore:{§7Меч способен создать психическую\n§7защиту §3I§7. Противник будет наносить\n§7значительно меньше урона.\n§5Активация способности: §6ПКМ\n§5Длительность: §630 секунд\n§5Перезарядка способности: §c2 минуты\n§2Апгрейд: §4$1000 + 40 уровней\n§3Характеристики после апгрейда:\n§bДлительность: §61 минута\n§bПерезарядка: §c4 минуты\n§eНаберите §6/upgrade Pepel1§e,\n§eдержа меч в руках.\n§cАпгрейд снимает все чары\n§cи чинит меч.}'
    flags: []
    actions:
    - message=1
    reactions:
    - message=2
Сам меч выдаю из Essentials:
Код:
      - 276 1 name:&fМеч_Пепла_&cI lore:&7Меч_способен_создать_психическую|&7защиту_&3I&7._Противник_будет_наносить|&7значительно_меньше_урона.|&5Активация_способности:_&6ПКМ|&5Длительность:_&630_секунд|&5Перезарядка_способности:_&c2_минуты|&2Апгрейд:_&4$1000_+_40_уровней|&3Характеристики_после_апгрейда:|&bДлительность:_&61_минута|&bПерезарядка:_&c4_минуты|&eНаберите_&6/upgrade_Pepel1&e,|&eдержа_меч_в_руках.|&cАпгрейд_снимает_все_чары|&cи_чинит_меч.


В общем нашёл ошибку (была путаница с разделителем, помнишь менял "\\n" на "\n" -- вот тут не поменял).
https://dl.dropboxusercontent.com/u/64799811/ReActions/ReActions.jar

И хочу оговорить по поводу сравнения.
В имени и в lore сравнение происходит с использованием регулярных выражений (возможно, позднее я добавлю параметр на выбор режим сравнения - полное соответствие или regex).
Поэтому, в данном примере ( item: 'amount:1 type:DIAMOND_SWORD lore:{§7Меч способен создать психическую\n§7защиту §3I§7. Противник будет наносить\n§7значительно меньше урона.\n§5Активация способности: §6ПКМ\n§5Длительность: §630 секунд\n§5Перезарядка способности: §c2 минуты\n§2Апгрейд: §4$1000 + 40 уровней\n§3Характеристики после апгрейда:\n§bДлительность: §61 минута\n§bПерезарядка: §c4 минуты\n§eНаберите §6/upgrade Pepel1§e,\n§eдержа меч в руках.\n§cАпгрейд снимает все чары\n§cи чинит меч.}') есть символы, которые могут воспринимать неоднозначно. В первую очередь это "$" - т.е. его или над экранировать \$ или же заменять на какой-то другой символ. Я вообще убрал и поставил в той строке ".*" - и всё сразу заработало.

Теперь как происходит сравнение lore.
Во-первых, оно производится построчно.
Т.е. если у Вас есть такое lore:
"Ультрамариновый клинок (1)
Это супер красивый меч,
который выковал кузнец Василий.
Данный меч служит для
выковыривания зубов
из коров и игроков.
Стоимость: $1000"

То сравнивая его с lore:{Ультрамариновый клинок.*Стоимость: \$1000} ничего не выйдет. Нужно будет описать каждую строку. Например так: lore:{Ультрамариновый клинок (\d+)\n.*\n.*\n.*\n.*\n.*\nСтоимость: \$1000}

Если для определения уникальности предмета достаточно нескольких строк, то последние можно опустить:
lore:{Ультрамариновый клинок (\d+)\nЭто супер красивый меч,\nкоторый выковал кузнец Василий\.}

В общем как-то так.
 
Ммм... Просто отлично! Появилось ещё несколько идей дробления предмета с помощью такого построчного сравнения. Сейчас попробую экранировать. Какие ещё символы могут вызвать такой эффект?
Какая-то ересь начала происходить с таймерами и Exec'ами после установки 24 версии. Сейчас буду на локалке разбираться...
 
Какая-то ересь начала происходить с таймерами и Exec'ами после установки 24 версии. Сейчас буду на локалке разбираться...

Не притрагивался к ним очень давно ;) Единственное менялась работа с плейсхолдерами - теоритически что-то могло сломаться по части подстановки (хотя на тестах у меня были вложенные переменные - - VAR_SET=id:effectplay value:%var:effect%var:effect_num%% - работали как надо).
 
Назад
Верх