Вопрос Как сделать запрет на чарку уже зачарованного меча в Deluxe Menus? Сервер Майнкрафт

Ядро
Paper

Ethan_winterzz2000

Пользователь
Сообщения
149
Плагин
Deluxe Menus
Ядро сервера
  1. Paper
Версия сервера
  1. 1.16.5
Ссылка
https://www.spigotmc.org/resources/deluxemenus.11734/
Всем здравствуйте! Я хотел бы узнать как убрать этот нюанс. Т.е. Я задал два предмета: если в инвентаре присутствуют все два нужных предмета(один из них железный меч), то меч чаруется. Однако это работает и с зачарованным железным мечом? Я понимаю что у них один материал. Но есть ли способ сделать запрет на чарку уже зачарованной вещи? Через Executable items не работает кста
 
Офф. документация по добавлению проверки наличия предмета:

В общем если перейдешь по ссылке в документацию можешь заметить поля modeldata: # и data: #. Как раз с помощью них можно проверять наличие зачарования(й) и много чего ещё. Далее делаешь проверку на наличие обычного железного меча, второго предмета и отсутствия меча с определённым modeldata или data (т.е зачарованного)

Всё просто..


UPD: modeldata это практически те же NBT-теги. Ориентируйся на него. И вообще вроде через data не выйдет сделать проверку наличия зачарований. ЭКСПЕРЕМЕНТИРУЙ, Я НЕ ПРОВЕРЯЛ
 
Последнее редактирование:
Офф. документация по добавлению проверки наличия предмета:

В общем если перейдешь по ссылке в документацию можешь заметить поля modeldata: # и data: #. Как раз с помощью них можно проверять наличие зачарования(й) и много чего ещё. Далее делаешь проверку на наличие обычного железного меча, второго предмета и отсутствия меча с определённым modeldata или data (т.е зачарованного)

Всё просто..


UPD: modeldata это практически те же NBT-теги. Ориентируйся на него. И вообще вроде через data не выйдет сделать проверку наличия зачарований. ЭКСПЕРЕМЕНТИРУЙ, Я НЕ ПРОВЕРЯЛ
а что собственно писать в modeldata? Название зачарования? В документации не сказано об этом
Объединено

а что собственно писать в modeldata? Название зачарования? В документации не сказано об этом
UPD: Вроде понял. Вы сказали про NBT-теги. Т.е. это доложно выглядеть так:
Код:
modeldata: minecraft:iron_sword{Enchantments:[{lvl:1,id:smite}]}
 
Последнее редактирование:
а что собственно писать в modeldata? Название зачарования? В документации не сказано об этом
Объединено


UPD: Вроде понял. Вы сказали про NBT-теги. Т.е. это доложно выглядеть так:
Код:
modeldata: minecraft:iron_sword{Enchantments:[{lvl:1,id:smite}]}
Modeldata это же вообще другое, он состоит из цифр и нужен для ресурспаков
 
а что собственно писать в modeldata? Название зачарования? В документации не сказано об этом
Объединено


UPD: Вроде понял. Вы сказали про NBT-теги. Т.е. это доложно выглядеть так:
Код:
modeldata: minecraft:iron_sword{Enchantments:[{lvl:1,id:smite}]}
Скорее data, чем modeldata
 
Скорее data, чем modeldata
Зарешал

upd: А нет. Теперь я не могу даже обычный железный меч отдать. Он проверяет на наличие железного меча но не зачарованного. Предлагаю скинуть код, чтобы легче было разобраться, в чём дело:
Код:
'it_enchantment_iron':
    material: IRON_SWORD
    hide_attributes: true
    slot: 11
    priority: 0
    display_name: '&7 &6Железный меч: '
    lore:
    - '&7 &dВыберите зачарование: '
    - ''
    - '&2 Острота I '
    - '&f Небесная кара I'
    - '&f Заговор огня I'
    - ''
    
    view_requirement:
      requirements:
        perm_check:
          type: '!has permission'
          permission: select.iron
    right_click_commands:
    - '[console] lp user %player_name% permission set select.iron '
    - '[sound] BLOCK_LEVER_CLICK'
    - '[refresh]'
          
    left_click_requirement:
      requirements:
        balance:
          type: '!has item'
          material: IRON_SWORD
          data: {Enchantments:[{lvl:1,id:sharpness}]}
          deny_commands:
          - '[message]'
          - '[message] &7(Кузнец)&c Этот меч не подлежит улучшению! '
          - '[message]'
          - '[sound] BLOCK_NOTE_BLOCK_BASS'
        balance2:
          type: has item
          material: IRON_SWORD
          deny_commands:
          - '[message]'
          - '[message] &7(Кузнец)&c Данный предмет(ы) отсутствует в инвентаре! '
          - '[message]'
          - '[sound] BLOCK_NOTE_BLOCK_BASS'
        balance3:
          type: has item
          material: KNOWLEDGE_BOOK
          deny_commands:
          - '[message]'
          - '[message] &7(Кузнец)&c Данный предмет(ы) отсутствует в инвентаре! '
          - '[message]'
          - '[sound] BLOCK_NOTE_BLOCK_BASS'
          
    left_click_commands:
    - '[console] clear %player_name% iron_sword 1'
    - '[console] minecraft:give %player_name% minecraft:iron_sword{Enchantments:[{lvl:1,id:sharpness}]} '
    - '[sound] BLOCK_ENCHANTMENT_TABLE_USE '
    - '[console] clear %player_name% knowledge_book 1'
 
Последнее редактирование:
Зарешал

upd: А нет. Теперь я не могу даже обычный железный меч отдать. Он проверяет на наличие железного меча но не зачарованного. Предлагаю скинуть код, чтобы легче было разобраться, в чём дело:
Код:
'it_enchantment_iron':
    material: IRON_SWORD
    hide_attributes: true
    slot: 11
    priority: 0
    display_name: '&7 &6Железный меч: '
    lore:
    - '&7 &dВыберите зачарование: '
    - ''
    - '&2 Острота I '
    - '&f Небесная кара I'
    - '&f Заговор огня I'
    - ''
 
    view_requirement:
      requirements:
        perm_check:
          type: '!has permission'
          permission: select.iron
    right_click_commands:
    - '[console] lp user %player_name% permission set select.iron '
    - '[sound] BLOCK_LEVER_CLICK'
    - '[refresh]'
    
    left_click_requirement:
      requirements:
        balance:
          type: '!has item'
          material: IRON_SWORD
          data: {Enchantments:[{lvl:1,id:sharpness}]}
          deny_commands:
          - '[message]'
          - '[message] &7(Кузнец)&c Этот меч не подлежит улучшению! '
          - '[message]'
          - '[sound] BLOCK_NOTE_BLOCK_BASS'
        balance2:
          type: has item
          material: IRON_SWORD
          deny_commands:
          - '[message]'
          - '[message] &7(Кузнец)&c Данный предмет(ы) отсутствует в инвентаре! '
          - '[message]'
          - '[sound] BLOCK_NOTE_BLOCK_BASS'
        balance3:
          type: has item
          material: KNOWLEDGE_BOOK
          deny_commands:
          - '[message]'
          - '[message] &7(Кузнец)&c Данный предмет(ы) отсутствует в инвентаре! '
          - '[message]'
          - '[sound] BLOCK_NOTE_BLOCK_BASS'
    
    left_click_commands:
    - '[console] clear %player_name% iron_sword 1'
    - '[console] minecraft:give %player_name% minecraft:iron_sword{Enchantments:[{lvl:1,id:sharpness}]} '
    - '[sound] BLOCK_ENCHANTMENT_TABLE_USE '
    - '[console] clear %player_name% knowledge_book 1'

У тебя есть Discord? Если да, можешь ли ты мне отправить его для связи с тобой. Или самостоятельно отправь мне заявку в друзья: klesjh
 
Последнее редактирование:
Короче, я нашёл способ сделать это гораздо проще. Я взял твой конфиг для работы и, о боже, кто его писал? Сам господин Дьявол? Мне пришлось много чего переписывать и дорабатывать. Вот что у меня получилось:

YAML:
items:
  "it_enchantment_iron":
    material: IRON_SWORD
    hide_attributes: true
    slot: 0
    display_name: "&7 &6Железный меч: "
    lore:
    - "&7 &dВыберите зачарование: "
    - ""
    - "&2 Острота I "
    - "&f Небесная кара I"
    - "&f Заговор огня I"
    - ""
view_requirement:
  requirements:
    perm_check:
      type: has permission
      permission: select.iron
 
right_click_commands:
  - "[console] lp user %player_name% permission set select.iron"
  - "[sound] BLOCK_LEVER_CLICK"
  - "[refresh]"
 
left_click_requirement:
  requirements:
    balance:
      type: has item
      material: IRON_SWORD
      amount: 2
      deny_commands:
      - "[message]"
      - "[message] &7(Кузнец)&c Данный предмет(ы) отсутствует в инвентаре!"
      - "[message]"
      - "[sound] BLOCK_NOTE_BLOCK_BASS"
    balance2:
      type: has item
      material: KNOWLEDGE_BOOK
      deny_commands:
      - "[message]"
      - "[message] &7(Кузнец)&c Данный предмет(ы) отсутствует в инвентаре!"
      - "[message]"
      - "[sound] BLOCK_NOTE_BLOCK_BASS"
    balance3:
      type: "!has item"
      material: IRON_SWORD
      enchantments:
        - sharpness;1
        - smite;1
        - fire_aspect;1
      deny_commands:
      - "[message]"
      - "[message] &7(Кузнец)&c Этот меч не подлежит улучшению!"
      - "[message]"
      - "[sound] BLOCK_NOTE_BLOCK_BASS"
 
left_click_commands:
- "[console] clear %player_name% knowledge_book 1"
- "[console] clear %player_name% iron_sword 1"
- "[console] minecraft:give %player_name% minecraft:iron_sword[enchantments={levels:{sharpness:1}}]"
- "[sound] BLOCK_ENCHANTMENT_TABLE_USE "

Как ты видишь, я заменил большинство твоих апострофов (') на "ёлочки" ("), так как из-за апострофов ни одно меню не будет работать. Обязательно используй "ёлочки" ("). Ещё ты зачем-то понаставил свои апострофы в type, хотя они там не нужны. И более того, из-за них опять-же ничего не работало. А ещё я немного изменил последовательность действий в блоке left_click_commands. До моих изменений в случае успеха меч выдавался в следующий слот, так как удаление книги знаний было в конце. И самое главное - я добавил проверку на наличие зачарований. Как оказалось, сделать это легко, нужен всего лишь параметр enchantments. Подробнее про него можешь прочитать на офф. док.:


Работает он по такому принципу:
  • В начале где-то в item, например, после material пишем "enchantments:". Да-да, с двоеточием.
  • Далее на следующей строке делаем отступ и ставим тире (-)
  • В конце-концов указываем id зачарования и уровень в формате enchantmentid;level. Например "sharpness;1". Sharpness - острота, 1 - уровень зачарования. Знак ; должен обязательно присутствовать.

(Почти) все enchantmentid можешь найти, например, на

Прошу заметить, что я тестировал всё на версии 1.21. Команда на выдачу меча с зачарованием остроты 1, которую ты указал, у меня не работала, поэтому я сделал свою. Для генерации команд выдачи предметов с зачарованиями и прочими параметрами можешь использовать этот сайт: (<- КЛИК)

Кстати, при настройки я столкнулся с одной проблемой: у нас ведь открывается инвентарь игроку, в котором уже есть меч (или любой другой предмет), верно? Так вот этот меч (или любой другой предмет) учитывается при поиске предмета в требовании, поэтому для получения зачарованного железного меча было достаточно одной лишь книги знаний. Меч брался прямо из открытого меню. Я пофиксил это тем, что поставил требование наличия минимум 2-х мечей в инвентаре. То есть 1 меч - менюшный, а второго в меню нет (по крайне мере если брать код, который ты дал. А так, на сколько я понимаю, ты собираешься добавить ещё железных мечей). Достать второй можно только добыв его самостоятельно. Учти данный момент
 
Последнее редактирование:
Короче, я нашёл способ сделать это гораздо проще. Я взял твой конфиг для работы и, о боже, кто его писал? Сам господин Дьявол? Мне пришлось много чего переписывать и дорабатывать. Вот что у меня получилось:

YAML:
items:
  "it_enchantment_iron":
    material: IRON_SWORD
    hide_attributes: true
    slot: 0
    display_name: "&7 &6Железный меч: "
    lore:
    - "&7 &dВыберите зачарование: "
    - ""
    - "&2 Острота I "
    - "&f Небесная кара I"
    - "&f Заговор огня I"
    - ""
view_requirement:
  requirements:
    perm_check:
      type: has permission
      permission: select.iron
 
right_click_commands:
  - "[console] lp user %player_name% permission set select.iron"
  - "[sound] BLOCK_LEVER_CLICK"
  - "[refresh]"
 
left_click_requirement:
  requirements:
    balance:
      type: has item
      material: IRON_SWORD
      amount: 2
      deny_commands:
      - "[message]"
      - "[message] &7(Кузнец)&c Данный предмет(ы) отсутствует в инвентаре!"
      - "[message]"
      - "[sound] BLOCK_NOTE_BLOCK_BASS"
    balance2:
      type: has item
      material: KNOWLEDGE_BOOK
      deny_commands:
      - "[message]"
      - "[message] &7(Кузнец)&c Данный предмет(ы) отсутствует в инвентаре!"
      - "[message]"
      - "[sound] BLOCK_NOTE_BLOCK_BASS"
    balance3:
      type: "!has item"
      material: IRON_SWORD
      enchantments:
        - sharpness;1
        - smite;1
        - fire_aspect;1
      deny_commands:
      - "[message]"
      - "[message] &7(Кузнец)&c Этот меч не подлежит улучшению!"
      - "[message]"
      - "[sound] BLOCK_NOTE_BLOCK_BASS"
 
left_click_commands:
- "[console] clear %player_name% knowledge_book 1"
- "[console] clear %player_name% iron_sword 1"
- "[console] minecraft:give %player_name% minecraft:iron_sword[enchantments={levels:{sharpness:1}}]"
- "[sound] BLOCK_ENCHANTMENT_TABLE_USE "

Как ты видишь, я заменил большинство твоих апострофов (') на "ёлочки" ("), так как из-за апострофов ни одно меню не будет работать. Обязательно используй "ёлочки" ("). Ещё ты зачем-то понаставил свои апострофы в type, хотя они там не нужны. И более того, из-за них опять-же ничего не работало. А ещё я немного изменил последовательность действий в блоке left_click_commands. До моих изменений в случае успеха меч выдавался в следующий слот, так как удаление книги знаний было в конце. И самое главное - я добавил проверку на наличие зачарований. Как оказалось, сделать это легко, нужен всего лишь параметр enchantments. Подробнее про него можешь прочитать на офф. док.:


Работает он по такому принципу:
  • В начале где-то в item, например, после material пишем "enchantments:". Да-да, с двоеточием.
  • Далее на следующей строке делаем отступ и ставим тире (-)
  • В конце-концов указываем id зачарования и уровень в формате enchantmentid;level. Например "sharpness;1". Sharpness - острота, 1 - уровень зачарования. Знак ; должен обязательно присутствовать.

(Почти) все enchantmentid можешь найти, например, на

Прошу заметить, что я тестировал всё на версии 1.21. Команда на выдачу меча с зачарованием остроты 1, которую ты указал, у меня не работала, поэтому я сделал свою. Для генерации команд выдачи предметов с зачарованиями и прочими параметрами можешь использовать этот сайт: (<- КЛИК)

Кстати, при настройки я столкнулся с одной проблемой: у нас ведь открывается инвентарь игроку, в котором уже есть меч (или любой другой предмет), верно? Так вот этот меч (или любой другой предмет) учитывается при поиске предмета в требовании, поэтому для получения зачарованного железного меча было достаточно одной лишь книги знаний. Меч брался прямо из открытого меню. Я пофиксил это тем, что поставил требование наличия минимум 2-х мечей в инвентаре. То есть 1 меч - менюшный, а второго в меню нет (по крайне мере если брать код, который ты дал. А так, на сколько я понимаю, ты собираешься добавить ещё железных мечей). Достать второй можно только добыв его самостоятельно. Учти данный момент
Этот господин я). Я благодарен вам! Я проверил, всё работает как надо. Но хочу уточнить две вещи: т.е. между апострофами и ёлочками есть различия? Я просто считал что они сходны и просто можно использовать какой удобнее. Касаемо двух мечей в инвентаре не очень понял. Я проверил без требования наличия 2-х мечей и всё работает корректно.
 
Этот господин я). Я благодарен вам! Я проверил, всё работает как надо. Но хочу уточнить две вещи: т.е. между апострофами и ёлочками есть различия? Я просто считал что они сходны и просто можно использовать какой удобнее. Касаемо двух мечей в инвентаре не очень понял. Я проверил без требования наличия 2-х мечей и всё работает корректно.
UPD: Теперь не чарит предмет вообще, я проверил дело в balance3:
Почему-то у меня этот зачарованный меч засчитывает как за обычный железный меч. Попробовал ввести в материал: iron_sword[enchantments={levels:{sharpness:1}}] и убедился в том как это глупо
 
Поехали..

Этот господин я). Я благодарен вам! Я проверил, всё работает как надо. Но хочу уточнить две вещи: т.е. между апострофами и ёлочками есть различия? Я просто считал что они сходны и просто можно использовать какой удобнее. Касаемо двух мечей в инвентаре не очень понял. Я проверил без требования наличия 2-х мечей и всё работает корректно.
Да. Между "ёлочками" и апострофами есть разница. Конкретно этот плагин требует ставить именно "ёлочки". И не где попало, например, как ты в type. Хотя стоп.. Если ты посмотришь на мой type в balance, то увидишь, что там стоят апострофы. Попробуй убрать их и получишь ошибку. Я не знаю как это работает, но видимо в клике при проверке ОТСУТСВИЯ предмета они нужны


UPD: Теперь не чарит предмет вообще, я проверил дело в balance3:
Почему-то у меня этот зачарованный меч засчитывает как за обычный железный меч. Попробовал ввести в материал: iron_sword[enchantments={levels:{sharpness:1}}] и убедился в том как это глупо
Дублирую то, что ты почему-то не прочитал в моём предыдущем сообщении. Я даже специально выделил этот текст. Будь внимательнее:


Прошу заметить, что я тестировал всё на версии 1.21. Команда на выдачу меча с зачарованием остроты 1, которую ты указал, у меня не работала, поэтому я сделал свою. Для генерации команд выдачи предметов с зачарованиями и прочими параметрами можешь использовать этот сайт: (<- КЛИК)

Кстати, при настройки я столкнулся с одной проблемой: у нас ведь открывается инвентарь игроку, в котором уже есть меч (или любой другой предмет), верно? Так вот этот меч (или любой другой предмет) учитывается при поиске предмета в требовании, поэтому для получения зачарованного железного меча было достаточно одной лишь книги знаний. Меч брался прямо из открытого меню. Я пофиксил это тем, что поставил требование наличия минимум 2-х мечей в инвентаре. То есть 1 меч - менюшный, а второго в меню нет (по крайне мере если брать код, который ты дал. А так, на сколько я понимаю, ты собираешься добавить ещё железных мечей). Достать второй можно только добыв его самостоятельно. Учти данный момент
 
Последнее редактирование:
Кстати, при настройки я столкнулся с одной проблемой: у нас ведь открывается инвентарь игроку, в котором уже есть меч (или любой другой предмет), верно? Так вот этот меч (или любой другой предмет) учитывается при поиске предмета в требовании, поэтому для получения зачарованного железного меча было достаточно одной лишь книги знаний. Меч брался прямо из открытого меню. Я пофиксил это тем, что поставил требование наличия минимум 2-х мечей в инвентаре. То есть 1 меч - менюшный, а второго в меню нет (по крайне мере если брать код, который ты дал. А так, на сколько я понимаю, ты собираешься добавить ещё железных мечей). Достать второй можно только добыв его самостоятельно. Учти данный момент
Вообще странно, вроде автор должен учитывать данный момент и считать только мечи в инвентаре игрока

P.S. Вот код этого требования

Java:
public class HasItemRequirement extends Requirement {

  private final ItemWrapper wrapper;
  private final boolean invert;

  public HasItemRequirement(ItemWrapper wrapper, boolean invert) {
    this.wrapper = wrapper;
    this.invert = invert;
  }

  @Override
  public boolean evaluate(MenuHolder holder) {
    String materialName = holder.setPlaceholdersAndArguments(wrapper.getMaterial()).toUpperCase();
    Material material = DeluxeMenus.MATERIALS.get(materialName);
    if (material == null) {
      return invert;
    }

    if (material == Material.AIR) return invert == (holder.getViewer().getInventory().firstEmpty() == -1);

    ItemStack[] armor = wrapper.checkArmor() ? holder.getViewer().getInventory().getArmorContents() : null;
    ItemStack[] offHand = wrapper.checkOffhand() ? holder.getViewer().getInventory().getExtraContents() : null;
    ItemStack[] inventory = holder.getViewer().getInventory().getStorageContents();

    int total = 0;
    for (ItemStack itemToCheck: inventory) {
      if (!isRequiredItem(itemToCheck, holder, material)) continue;
      total += itemToCheck.getAmount();
    }

    if (offHand != null) {
      for (ItemStack itemToCheck: offHand) {
        if (!isRequiredItem(itemToCheck, holder, material)) continue;
        total += itemToCheck.getAmount();
      }
    }

    if (armor != null) {
      for (ItemStack itemToCheck: armor) {
        if (!isRequiredItem(itemToCheck, holder, material)) continue;
        total += itemToCheck.getAmount();
      }
    }

    return invert == (total < wrapper.getAmount());
  }

  private boolean isRequiredItem(ItemStack itemToCheck, MenuHolder holder, Material material) {
    if (itemToCheck == null || itemToCheck.getType() == Material.AIR) return false;
    if (wrapper.getMaterial() != null && itemToCheck.getType() != material) return false;
    if (wrapper.hasData() && itemToCheck.getDurability() != wrapper.getData()) return false;

    ItemMeta metaToCheck = itemToCheck.getItemMeta();
    if (wrapper.isStrict()) {
      if (metaToCheck != null) {
        if (VersionHelper.IS_CUSTOM_MODEL_DATA) {
          if (metaToCheck.hasCustomModelData()) return false;
        }
        if (metaToCheck.hasLore()) return false;
        return !metaToCheck.hasDisplayName();
      }

    } else {
      if ((wrapper.getCustomData() != 0 || wrapper.getName() != null || wrapper.getLore() != null) && metaToCheck == null)
        return false;

      if (wrapper.getCustomData() != 0) {
        if (VersionHelper.IS_CUSTOM_MODEL_DATA) {
          if (!metaToCheck.hasCustomModelData()) return false;
          if (metaToCheck.getCustomModelData() != wrapper.getCustomData()) return false;
        }
      }

      if (wrapper.getName() != null) {
        if (!metaToCheck.hasDisplayName()) return false;

        String name = StringUtils.color(holder.setPlaceholdersAndArguments(wrapper.getName()));
        String nameToCheck = StringUtils.color(holder.setPlaceholdersAndArguments(metaToCheck.getDisplayName()));

        if (wrapper.checkNameContains() && wrapper.checkNameIgnoreCase()) {
          if (!org.apache.commons.lang3.StringUtils.containsIgnoreCase(nameToCheck, name)) return false;
        }
        else if (wrapper.checkNameContains()) {
          if (!nameToCheck.contains(name)) return false;
        }
        else if (wrapper.checkNameIgnoreCase()) {
          if (!nameToCheck.equalsIgnoreCase(name)) return false;
        }
        else if (!nameToCheck.equals(name)) {
          return false;
        }
      }

      if (wrapper.getLoreList() != null) {
        List<String> loreX = metaToCheck.getLore();
        if (loreX == null) return false;

        String lore = wrapper.getLoreList().stream().map(holder::setPlaceholdersAndArguments).map(StringUtils::color).collect(Collectors.joining("&&"));
        String loreToCheck = loreX.stream().map(holder::setPlaceholdersAndArguments).map(StringUtils::color).collect(Collectors.joining("&&"));

        if (wrapper.checkLoreContains() && wrapper.checkLoreIgnoreCase()) {
          if (!org.apache.commons.lang3.StringUtils.containsIgnoreCase(loreToCheck, lore)) return false;
        }
        else if (wrapper.checkLoreContains()) {
          if (!loreToCheck.contains(lore)) return false;
        }
        else if (wrapper.checkLoreIgnoreCase()) {
          if (!loreToCheck.equalsIgnoreCase(lore)) return false;
        }
        else if (!loreToCheck.equals(lore)) {
          return false;
        }
      }

      if (wrapper.getLore() != null) {
        List<String> loreX = metaToCheck.getLore();
        if (loreX == null) return false;

        String lore = StringUtils.color(holder.setPlaceholdersAndArguments(wrapper.getLore()));
        String loreToCheck = loreX.stream().map(holder::setPlaceholdersAndArguments).map(StringUtils::color).collect(Collectors.joining("&&"));

        if (wrapper.checkLoreContains() && wrapper.checkLoreIgnoreCase()) {
          return org.apache.commons.lang3.StringUtils.containsIgnoreCase(loreToCheck, lore);
        }
        else if (wrapper.checkLoreContains()) {
          return loreToCheck.contains(lore);
        }
        else if (wrapper.checkLoreIgnoreCase()) {
          return loreToCheck.equalsIgnoreCase(lore);
        }
        else return loreToCheck.equals(lore);
      }
    }
    return true;
  }
}
 
Последнее редактирование:
Вообще странно, вроде автор должен учитывать данный момент и считать только мечи в инвентаре игрока

P.S. Вот код этого требования

Java:
public class HasItemRequirement extends Requirement {

  private final ItemWrapper wrapper;
  private final boolean invert;

  public HasItemRequirement(ItemWrapper wrapper, boolean invert) {
    this.wrapper = wrapper;
    this.invert = invert;
  }

  @Override
  public boolean evaluate(MenuHolder holder) {
    String materialName = holder.setPlaceholdersAndArguments(wrapper.getMaterial()).toUpperCase();
    Material material = DeluxeMenus.MATERIALS.get(materialName);
    if (material == null) {
      return invert;
    }

    if (material == Material.AIR) return invert == (holder.getViewer().getInventory().firstEmpty() == -1);

    ItemStack[] armor = wrapper.checkArmor() ? holder.getViewer().getInventory().getArmorContents() : null;
    ItemStack[] offHand = wrapper.checkOffhand() ? holder.getViewer().getInventory().getExtraContents() : null;
    ItemStack[] inventory = holder.getViewer().getInventory().getStorageContents();

    int total = 0;
    for (ItemStack itemToCheck: inventory) {
      if (!isRequiredItem(itemToCheck, holder, material)) continue;
      total += itemToCheck.getAmount();
    }

    if (offHand != null) {
      for (ItemStack itemToCheck: offHand) {
        if (!isRequiredItem(itemToCheck, holder, material)) continue;
        total += itemToCheck.getAmount();
      }
    }

    if (armor != null) {
      for (ItemStack itemToCheck: armor) {
        if (!isRequiredItem(itemToCheck, holder, material)) continue;
        total += itemToCheck.getAmount();
      }
    }

    return invert == (total < wrapper.getAmount());
  }

  private boolean isRequiredItem(ItemStack itemToCheck, MenuHolder holder, Material material) {
    if (itemToCheck == null || itemToCheck.getType() == Material.AIR) return false;
    if (wrapper.getMaterial() != null && itemToCheck.getType() != material) return false;
    if (wrapper.hasData() && itemToCheck.getDurability() != wrapper.getData()) return false;

    ItemMeta metaToCheck = itemToCheck.getItemMeta();
    if (wrapper.isStrict()) {
      if (metaToCheck != null) {
        if (VersionHelper.IS_CUSTOM_MODEL_DATA) {
          if (metaToCheck.hasCustomModelData()) return false;
        }
        if (metaToCheck.hasLore()) return false;
        return !metaToCheck.hasDisplayName();
      }

    } else {
      if ((wrapper.getCustomData() != 0 || wrapper.getName() != null || wrapper.getLore() != null) && metaToCheck == null)
        return false;

      if (wrapper.getCustomData() != 0) {
        if (VersionHelper.IS_CUSTOM_MODEL_DATA) {
          if (!metaToCheck.hasCustomModelData()) return false;
          if (metaToCheck.getCustomModelData() != wrapper.getCustomData()) return false;
        }
      }

      if (wrapper.getName() != null) {
        if (!metaToCheck.hasDisplayName()) return false;

        String name = StringUtils.color(holder.setPlaceholdersAndArguments(wrapper.getName()));
        String nameToCheck = StringUtils.color(holder.setPlaceholdersAndArguments(metaToCheck.getDisplayName()));

        if (wrapper.checkNameContains() && wrapper.checkNameIgnoreCase()) {
          if (!org.apache.commons.lang3.StringUtils.containsIgnoreCase(nameToCheck, name)) return false;
        }
        else if (wrapper.checkNameContains()) {
          if (!nameToCheck.contains(name)) return false;
        }
        else if (wrapper.checkNameIgnoreCase()) {
          if (!nameToCheck.equalsIgnoreCase(name)) return false;
        }
        else if (!nameToCheck.equals(name)) {
          return false;
        }
      }

      if (wrapper.getLoreList() != null) {
        List<String> loreX = metaToCheck.getLore();
        if (loreX == null) return false;

        String lore = wrapper.getLoreList().stream().map(holder::setPlaceholdersAndArguments).map(StringUtils::color).collect(Collectors.joining("&&"));
        String loreToCheck = loreX.stream().map(holder::setPlaceholdersAndArguments).map(StringUtils::color).collect(Collectors.joining("&&"));

        if (wrapper.checkLoreContains() && wrapper.checkLoreIgnoreCase()) {
          if (!org.apache.commons.lang3.StringUtils.containsIgnoreCase(loreToCheck, lore)) return false;
        }
        else if (wrapper.checkLoreContains()) {
          if (!loreToCheck.contains(lore)) return false;
        }
        else if (wrapper.checkLoreIgnoreCase()) {
          if (!loreToCheck.equalsIgnoreCase(lore)) return false;
        }
        else if (!loreToCheck.equals(lore)) {
          return false;
        }
      }

      if (wrapper.getLore() != null) {
        List<String> loreX = metaToCheck.getLore();
        if (loreX == null) return false;

        String lore = StringUtils.color(holder.setPlaceholdersAndArguments(wrapper.getLore()));
        String loreToCheck = loreX.stream().map(holder::setPlaceholdersAndArguments).map(StringUtils::color).collect(Collectors.joining("&&"));

        if (wrapper.checkLoreContains() && wrapper.checkLoreIgnoreCase()) {
          return org.apache.commons.lang3.StringUtils.containsIgnoreCase(loreToCheck, lore);
        }
        else if (wrapper.checkLoreContains()) {
          return loreToCheck.contains(lore);
        }
        else if (wrapper.checkLoreIgnoreCase()) {
          return loreToCheck.equalsIgnoreCase(lore);
        }
        else return loreToCheck.equals(lore);
      }
    }
    return true;
  }
}
И как его вставить в меню? Т.е. под left_click_commands писать: "[json] <код, что вы мне скинули>". Я просто в джаве нулёвый. Исхожу из моих знаний документации плагина
 
И как его вставить в меню? Т.е. под left_click_commands писать: "[json] <код, что вы мне скинули>". Я просто в джаве нулёвый. Исхожу из моих знаний документации плагина
Никуда не нужно. Я просто предоставил код работы этого requirement'а плагина, чтобы показать, что он проверяет только инвентарь игрока
 
Поехали..


Да. Между "ёлочками" и апострофами есть разница. Конкретно этот плагин требует ставить именно "ёлочки". И не где попало, например, как ты в type. Хотя стоп.. Если ты посмотришь на мой type в balance, то увидишь, что там стоят апострофы. Попробуй убрать их и получишь ошибку. Я не знаю как это работает, но видимо в клике при проверке ОТСУТСВИЯ предмета они нужны



Дублирую то, что ты почему-то не прочитал в моём предыдущем сообщении. Я даже специально выделил этот текст. Будь внимательнее:


Прошу заметить, что я тестировал всё на версии 1.21. Команда на выдачу меча с зачарованием остроты 1, которую ты указал, у меня не работала, поэтому я сделал свою. Для генерации команд выдачи предметов с зачарованиями и прочими параметрами можешь использовать этот сайт: (<- КЛИК)

Кстати, при настройки я столкнулся с одной проблемой: у нас ведь открывается инвентарь игроку, в котором уже есть меч (или любой другой предмет), верно? Так вот этот меч (или любой другой предмет) учитывается при поиске предмета в требовании, поэтому для получения зачарованного железного меча было достаточно одной лишь книги знаний. Меч брался прямо из открытого меню. Я пофиксил это тем, что поставил требование наличия минимум 2-х мечей в инвентаре. То есть 1 меч - менюшный, а второго в меню нет (по крайне мере если брать код, который ты дал. А так, на сколько я понимаю, ты собираешься добавить ещё железных мечей). Достать второй можно только добыв его самостоятельно. Учти данный момент
Я не до конца понял о чём вы. В инвентаре должно быть два железных меча? Так это могут быть два зачарованных железных меча и нюанс остаётся по прежнему
Объединено

Никуда не нужно. Я просто предоставил код работы этого requirement'а плагина, чтобы показать, что он проверяет только инвентарь игрока
Ясно. Однако, я всё равно мало что пойму). Я в джаве нулёвый
 
Последнее редактирование:
Поехали..


Да. Между "ёлочками" и апострофами есть разница. Конкретно этот плагин требует ставить именно "ёлочки". И не где попало, например, как ты в type. Хотя стоп.. Если ты посмотришь на мой type в balance, то увидишь, что там стоят апострофы. Попробуй убрать их и получишь ошибку. Я не знаю как это работает, но видимо в клике при проверке ОТСУТСВИЯ предмета они нужны



Дублирую то, что ты почему-то не прочитал в моём предыдущем сообщении. Я даже специально выделил этот текст. Будь внимательнее:


Прошу заметить, что я тестировал всё на версии 1.21. Команда на выдачу меча с зачарованием остроты 1, которую ты указал, у меня не работала, поэтому я сделал свою. Для генерации команд выдачи предметов с зачарованиями и прочими параметрами можешь использовать этот сайт: (<- КЛИК)

Кстати, при настройки я столкнулся с одной проблемой: у нас ведь открывается инвентарь игроку, в котором уже есть меч (или любой другой предмет), верно? Так вот этот меч (или любой другой предмет) учитывается при поиске предмета в требовании, поэтому для получения зачарованного железного меча было достаточно одной лишь книги знаний. Меч брался прямо из открытого меню. Я пофиксил это тем, что поставил требование наличия минимум 2-х мечей в инвентаре. То есть 1 меч - менюшный, а второго в меню нет (по крайне мере если брать код, который ты дал. А так, на сколько я понимаю, ты собираешься добавить ещё железных мечей). Достать второй можно только добыв его самостоятельно. Учти данный момент
Можете наглядно показать, как у вас выглядет данное требование?
 
Назад
Сверху Снизу