Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

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

[Aктуально]
@fromgate, Как отключить меседж?? Обычные методы, на кшталт закоментировать строку, не работают. Если беру в 'скобки', отсылает пустую строку.
Ни удалить, ни разукрасить...
Попробуй использовать MessageFilter. Он убирает сообщение, а не отсылает пустое.
- 'COMPARE=param:<Параметр> value1:<Значение1> vaule2:<Значение2>'
-- Сравнивает параметр со списком предоставленных значений. Если есть хоть одно совпадение - флаг отрабатывает успешно.

Не понимаю откуду брать эти параметры и значения для сравнения !?
Можна хотя бы один пример, как это использовать ??
Флаг сравнивает указанные параметры (может быть и плейсхолдер, и переменная) со списком значений. Если хоть одно значение совпало - флаг сработает успешно.
У меня нет доступа к компьютеру, не могу привести точный работающий пример. Надеюсь, ты поймёшь, как это работает. Примерно так, если не ошибаюсь (пример):
Есть 3 команды. Первую можно использовать только если параметр com равен 2 или 3, а при использовании ставит его в com=1. Вторую можно использовать только при com=1 или 3, а при выполнении команды ставит com в значение 2. Аналогично и с третьей командой.
При помощи этого флага можно проверить значение переменной com, при этом может быть несколько вариантов.
Т.е. для первой команды: - 'COMPARE=param:com value1:2 vaule2:3' .
 
Здравствуй, @fromgate нужна твоя помощь. Вообще не получается настроить флаг region_players. Подробного описания ввода флагов с несколькими параметрами я так и не нашёл. Нужно настроить флаг на 2 игроков - то есть когда в рг 2 игрока, 3 будет телепортировать обратно. Очень нужно, помогите пожалуйста!
 
Предложение: добавить флаг на проверку кол-ва блоков в выделенной области. Очень бы пригодилась!
отвечаю внатуре

Назовем этот флаг RG_SELECTOR.
Если RG_SELECTOR=1000, то для того что бы флаг вернул true, игрок должен иметь минимум 1000 выделенных блоков на момент срабатывания активатора.
'!RG_SELECTOR=1000' - максимум 1000 выделенных блоков.

Так же в связке с этим флагом отлично пойдет аргумент
[distance:<дистанция к выделенной области>]

Если
- 'RG_SELECTOR=count:1000 distance:50' - флаг возвращает true когда у игрока будет выделено 1к блоков и он будет находится не дальше 50-ти блоков от границы этого выделения (или от её центра...)
Ещё один чудотворный аргумент, который отлично сочитался бы в паре с этим замечательным флагом, это filter
Если RG_SELECTOR=filter:46,52,54,169,... - флаг возвращает false (именно false!) если в области, которую выделил игрок, имеются блоки с указаными ID (указывать можна сколько угодно блоков... (в идеале также и Entity)).

В общем уже имеем 3 аргумента:
count, distance и filter. И каждый аргумент опциональный. Главной задачей флага является проверка условий в выделенной области...

Или можна сделать это как 3 отдельных флага:
SELECTED_COUNT
SELECTED_DISTANCE
SELECTED_FILTER
Разницы вроде нет...
 
Последнее редактирование:
Помогите о всемогущие шарящие в этом плагине:D
Задумка:

Игрок доходит скажем до опр. точки, там он автоматом сохраняется и теперь при смерти, он попадает на эту точку. От этой точки игрок доходит до другой, и при смерти он уже телепортируется на новую точку и так далее.
Но при прописке команды /home или /spawn, то все его точки обнуляются, т.е. при смерте он уже не телепортируется на последнею точку.
 
Помогите о всемогущие шарящие в этом плагине:D
Задумка:

Игрок доходит скажем до опр. точки, там он автоматом сохраняется и теперь при смерти, он попадает на эту точку. От этой точки игрок доходит до другой, и при смерти он уже телепортируется на новую точку и так далее.
Но при прописке команды /home или /spawn, то все его точки обнуляются, т.е. при смерте он уже не телепортируется на последнею точку.

Код:
#примеры активаторов сохранения
#плита
PLATE:
  checkp1:
    x: x
    y: y
    z: z
    actions:
    - var_player_set=id:CheckP value:%player_loc%
#вход в Рг
REGION_ENTER:
  checkp2:
    region: ThisRg
    actions:
    - var_player_set=id:CheckP value:%player_loc%
#нахождение в Рг(может не сработать вовремя)
REGION:
  checkp3:
    region: ThisRg
    actions:
    - var_player_set=id:CheckP value:%player_loc%

#респавн на чекпоинт. В любом случае сначала телепортирует к стандартному спавну игрока
PLAYER_RESPAWN:
  AfterCheck:
    cause: ANY
    flags:
    - var_player_exist=id:CheckP
    actions:
    tp=%var:checkp%
#снос чекпоинта
COMMAND:
  UnCheck1:
    override: false
    regex: false
    command: home
    flags:
    - var_player_exist=id:CheckP
    actions:
    - var_player_clear=id:CheckP
  UnCheck2:
    override: false
    regex: false
    command: spawn
    flags:
    - var_player_exist=id:CheckP
    actions:
    - var_player_clear=id:CheckP
 
Ребят..
Хочу боссов сделать
Должен быть дроп 1 золотое яблоко и 1 алмаз
Падает только яблоко
Код:
BUTTON:
  lite:
    world: world
    x: -1083
    y: 2
    z: 2771
    actions:
    - mob_spawn=type:zombie loc:world,-1085.492,1.0,2777.382,-114.117,19.199 health:300 dmg:2 weapon:{type:iron_sword enchantments:damage_all:1} helm:298 chest:299 leg:301 boot:302 name:LiteBoss num:3 drop:set1:{item1:{type:322 name:{&6Яблоко Эдема} lore:{&7Говорят, что из-за того, что\n&7давно-давно в далекой стране\n&7кто-то сорвал это яблоко\n&7появилась жизнь на Земле}}} set2:{item1:{type:264 name:{&bЗаряженный кристал} lore:{&7Каждый хочет получить эти кристалы\n&7из-за них были воины\n&7ходят слухи, что их энергии хватит для того\n&7чтоб создать самую мощную и крепкую броню}}}
 
Ребят..
Хочу боссов сделать
Должен быть дроп 1 золотое яблоко и 1 алмаз
Падает только яблоко
Код:
BUTTON:
  lite:
    world: world
    x: -1083
    y: 2
    z: 2771
    actions:
    - mob_spawn=type:zombie loc:world,-1085.492,1.0,2777.382,-114.117,19.199 health:300 dmg:2 weapon:{type:iron_sword enchantments:damage_all:1} helm:298 chest:299 leg:301 boot:302 name:LiteBoss num:3 drop:set1:{item1:{type:322 name:{&6Яблоко Эдема} lore:{&7Говорят, что из-за того, что\n&7давно-давно в далекой стране\n&7кто-то сорвал это яблоко\n&7появилась жизнь на Земле}}} set2:{item1:{type:264 name:{&bЗаряженный кристал} lore:{&7Каждый хочет получить эти кристалы\n&7из-за них были воины\n&7ходят слухи, что их энергии хватит для того\n&7чтоб создать самую мощную и крепкую броню}}}

Похоже, что не хватает шанса в наборе предметов.
Я бы сделал так:

... set1:{item1:{...} chance:50} set2:{item1:{...} chance:50}

Есть даже лучше способ:
... set1:{item1:{...} item2:{...}}
И без шанса (chance) будет работать
 
Последнее редактирование:
fromgate, версию для sponge можно ждать?

Ждать-то можно. Просто из спортивного интереса просто делать версию для sponge не буду. Жалко времени.
У меня есть планы по "универсиализации" (а может даже мультиплатформенности) ReActions. Вот тогда можно добавить поддержку Sponge. Наравне со всеми прочими.
 
Последнее редактирование:
Вопрос к автору.

Не очень корректно работает действие ITEM_SLOT. Если слот пустой, то поместить в него ничего нельзя, вылетает ошибка.
С Java только начал знакомится, но с Вашего разрешения, я взглянул на код в файле ActionItems.java, там есть вот такая строчка (101):
ItemStack oldItem = p.getInventory().getItem(slotNum).clone();

Здесь, если getItem(slotNum) возвратит null, то метод clone() будет генерировать исключение, что собственно и происходит, если указанный слот пустой.

Нельзя ли как-нибудь это исправить?

Спасибо.
 
Сделал активатор ITEM_CLICK:
Код:
ITEM_CLICK:
  vip:
    item: type:chest
    item-str: 'name:{&8[&6&lVIP&8]} lore:{&7Активатор привилегии}'
    flags:
    - PERM=essentials.kits.vip
    actions:
    - MESSAGE=&c [Ошибка] &fУ вас уже есть эта привилегия
    reactions:
    - ITEM_REMOVE_INVENTORY=type:chest name:{&8[&6&lVIP&8]} lore:{&7Активатор привилегии}
    - CMD_CONSOLE=pex user %player% group add vip
    - MESSAGE=&a [Информация] &fПривилегия &LVIP &fуспешно активирована!
В консоли выводится при нажатии на любой предмет в руке:

[ReActions] Failed to parse item: type:chest

Раньше все делал точно также - все работало, а сейчас пишет ошибку..
 
Сделал активатор ITEM_CLICK:
Код:
ITEM_CLICK:
  vip:
    item: type:chest
    item-str: 'name:{&8[&6&lVIP&8]} lore:{&7Активатор привилегии}'
    flags:
    - PERM=essentials.kits.vip
    actions:
    - MESSAGE=&c [Ошибка] &fУ вас уже есть эта привилегия
    reactions:
    - ITEM_REMOVE_INVENTORY=type:chest name:{&8[&6&lVIP&8]} lore:{&7Активатор привилегии}
    - CMD_CONSOLE=pex user %player% group add vip
    - MESSAGE=&a [Информация] &fПривилегия &LVIP &fуспешно активирована!
В консоли выводится при нажатии на любой предмет в руке:

[ReActions] Failed to parse item: type:chest

Раньше все делал точно также - все работало, а сейчас пишет ошибку..

Попробуй так что-ль

Код:
ITEM_CLICK:
  vip:
    item: type:chest name:{&8[&6&lVIP&8]} lore:{&7Активатор привилегии}
    flags:
    - PERM=essentials.kits.vip
    actions:
    - MESSAGE=&c [Ошибка] &fУ вас уже есть эта привилегия
    reactions:
    - ITEM_REMOVE_INVENTORY=type:chest name:{&8[&6&lVIP&8]} lore:{&7Активатор привилегии}
    - CMD_CONSOLE=pex user %player% group add vip
    - MESSAGE=&a [Информация] &fПривилегия &LVIP &fуспешно активирована!

[ReActions] Failed to parse item: type:chest

У меня это пишет на каждый активатор с предметами, но по странному стечению обстоятельств - все работает.
 
@BukkitProfi @imDaniX
Это не баг. Сообщение делал для себя (просто проверка предмета производилась разными алгоритмами). Руки не дойдут убрать...
Выключил сообщение, скачать можно тут:
https://circleci.com/gh/fromgate/ReActions
 
Замечание автору.

Нашёл одну неточность в действии HEAL.
В файле ActionHeal.java есть такой кусок кода:

double health = BukkitCompatibilityFix.getEntityHealth(player);
double healthMax = BukkitCompatibilityFix.getEntityMaxHealth(player);
if ((hp > 0) && (health < healthMax))
BukkitCompatibilityFix.setEntityHealth(player, Math.max(hp + health, healthMax));


Если hp = 0, то игрок не исцелится, т.к. условие не будет выполнено, хотя в описании этого действия сказано, что если параметр hp не указывать, то будет полное выздоровление (по умолчанию hp = 0).
Это первая ситуация, но есть и не очень хорошая ситуация, когда, например, health=19, а hp =2. В этом случае функция Math.max(hp + health, healthMax) возвратит максимум hp + health=21, т.к. healthMax=20.
Но в функцию setEntityHealth нельзя устанавливать значение превышающее healthMax, иначе выскакивает предупреждение типа:
Caused by: java.lang.IllegalArgumentException: Health must be between 0 and 20.0

Есть ещё и 3-я ситуация, когда, например, health=5, а hp =2. В этом случае функция Math.max(hp + health, healthMax) возвратит опять же максимум, который равен healthMax=20. Т.е. нельзя поднять хп на одно сердечко, вам сразу установиться полное здоровье.

Поэтому предлагаю изменить код на следующий:

double health = BukkitCompatibilityFix.getEntityHealth(player);
double healthMax = BukkitCompatibilityFix.getEntityMaxHealth(player);
if ((hp >= 0) && (health < healthMax))
{
double hp_new = hp + health;
if (hp_new > healthMax || hp == 0) hp_new = healthMax;
BukkitCompatibilityFix.setEntityHealth(player, hp_new);
}

При этом значение устанавливаемого ХП не будет превышать healthMax, можно будет поднимать здоровье на необходимое значение, а также в действии не нужно будет указывать параметр hp, чтобы полностью исцелиться.

Может быть, предлагаемый мной код не ахти, но, думаю, заслуживает внимания.

Спасибо.
 
Сделал команду /me:
Код:
  me1:
    override: true
    regex: false
    command: cmd:me
    actions:
    - 'message=&7 Использование: /me <текст>'
  me2:
    override: true
    regex: false
    command: me *.
    actions:
    - 'message=player:{loc:%PLAYER_LOC% radius:8} &7 * &f%player% &f%arg1%'

Что мне нужно еще дописать, чтобы команда была полностью поверх стандартной команды bukkit /me?
Проблема в том, что при вводе /me в чат распознаются сразу две команды: /me из баккита и /me из reactions, в итоге выводятся две одинаковые строки в чат.
 

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

Назад
Верх