Перейти к содержанию

Как проверить, что значение в списке nbt равно значению string?


Рекомендуемые сообщения

В теме 7 сообщений

Хочу изменить торги у жителей, версия 1.21.5, датапак

Сейчас цель изменить броню у бронников, алмазная меняется на железную, зачарование при этом должно остаться. Изменить торг у меня получается (/data modify entity @s Offers.Recipes[0].sell.id set value "minecraft:paper")

Мне нужно сделать проверку, что конкретный торг №7 по пути Offers.Recipes[6].sell.id равен "minecraft:diamond_boots"

Как сделать такую проверку? Использовать /execute if data entity @s {Offers:{Recipes:[{sell:{id:"minecraft:diamond_boots"}}]}} нельзя, т.к он игнорирует номер торга в списке Recipes; Делать фиксированные торги (в 7 всегда ботинки в 8 всегда поножи и тд) тоже нельзя, т.к. изменить хочу не только бронников, а в других жителях торги "плавающие"

 

Если есть возможность изменить торги другим способом, мне тоже подойдёт (может есть что-то как лут тейблы но для жителей я хз)

Ссылка на комментарий
Поделиться на другие сайты

# Цель: Проверить торги и заменить алмазные ботинки на железные, сохраняя зачарования.

# Получаем всех жителей в радиусе (настройте радиус по необходимости)
execute as @e[type=minecraft:villager,distance=..5] run {
  # Цикл по всем предложениям (допустим, у жителя максимум 10 предложений)
  execute as @s run forvalues 0 9 i run {
    # Получаем текущий номер предложения
    data modify storage my_datapack:temp current_recipe set value 0
    data modify storage my_datapack:temp current_recipe set value $[i]
    # Проверяем, что текущий торг - это алмазные ботинки (предположим, что мы знаем структуру NBT)
    execute if data entity @s Offers.Recipes[0].sell.id == "minecraft:diamond_boots" run {
      # Копируем старое предложение (пока просто предположим, что это первое предложение)
      data modify storage my_datapack:temp old_recipe set from entity @s Offers.Recipes[0]

      # Удаляем старое предложение (заменить в оригинальном датапаке будет невозможно)
      data remove entity @s Offers.Recipes[0]

      # Создаем новое предложение:  Железные ботинки, берем зачарования со старых алмазных ботинок
      summon minecraft:item ~ ~ ~ {Item:{id:"minecraft:iron_boots", Count:1b, tag:{Enchantments:[]}}, CustomName:'{"text":"Железные ботинки (изменены)"}'}
      execute store result entity @s Offers.Recipes[0].buy.id byte 1 run data get entity @e[type=minecraft:item,limit=1,sort=nearest] Item.id
      execute store result entity @s Offers.Recipes[0].buy.Count byte 1 run data get entity @e[type=minecraft:item,limit=1,sort=nearest] Item.Count
      execute store result entity @s Offers.Recipes[0].buy.tag.display.Name string 1 run data get entity @e[type=minecraft:item,limit=1,sort=nearest] Item.tag.display.Name
      execute store result entity @s Offers.Recipes[0].sell.id byte 1 run data get entity @e[type=minecraft:item,limit=1,sort=nearest] Item.id
      execute store result entity @s Offers.Recipes[0].sell.Count byte 1 run data get entity @e[type=minecraft:item,limit=1,sort=nearest] Item.Count
      execute store result entity @s Offers.Recipes[0].sell.tag.display.Name string 1 run data get entity @e[type=minecraft:item,limit=1,sort=nearest] Item.tag.display.Name
      data modify entity @s Offers.Recipes[0].sell.tag.Enchantments set from entity @e[type=minecraft:item,limit=1,sort=nearest] Item.tag.Enchantments # Копируем зачарования
      kill @e[type=minecraft:item,limit=1,sort=nearest]
    }
  }
}

если помог, пожалуйста :)

Ссылка на комментарий
Поделиться на другие сайты

9 минут назад, Mr.horse сказал:

execute as @e[type=minecraft:villager,distance=..5] run {
  execute as @s run forvalues 0 9 i run {

execute if data entity @s Offers.Recipes[0].sell.id == "minecraft:diamond_boots"

Спасибо за ответ, но я не понимаю как работают эти строки. Разве в майне есть циклы? Если да, то почему forvalues не распознается игрой?

Как (указанная) третья строчка вообще работает, если по структуре "if data entity @s Offers.Recipes[0].sell.id" дальше идёт уже другая подкоманда и продолжение "== "minecraft:diamond_boots"" майн не понимает

Возможно я просто туплю, но с таким я ещё не сталкивался

Ссылка на комментарий
Поделиться на другие сайты

вот что нашел

1. Циклы? Нет (в стандартном Minecraft): Стандартный Minecraft не имеет встроенных циклов.

2. Как это работает (изменение торгов):

  • /execute if data проверяет одно условие.
  • Перебрать все торги = проверить каждый торг вручную.
  • Использовать отдельные функции для каждой проверки и замены.

3. Пример (ограничен, но рабочий):

  • Главная функция (replace_boots.mcfunction): Проверяет первые 3 предложения.
  • Вспомогательные функции (replace_item_0.mcfunction, replace_item_1.mcfunction, replace_item_2.mcfunction): заменяют ботинки, сохраняя зачарования.
  • Нужно создавать отдельные условия, если нужно проверить больше 3х торгов

4. Важно!

  • В pack.mcmeta pack_format.
  • Следите за индексами Offers.Recipes[X].
  • Смотрите мой предыдущий ответ для деталей и кода.
5 минут назад, jahotun сказал:

Спасибо за ответ, но я не понимаю как работают эти строки. Разве в майне есть циклы? Если да, то почему forvalues не распознается игрой?

Как (указанная) третья строчка вообще работает, если по структуре "if data entity @s Offers.Recipes[0].sell.id" дальше идёт уже другая подкоманда и продолжение "== "minecraft:diamond_boots"" майн не понимает

Возможно я просто туплю, но с таким я ещё не сталкивался

а в общем , для чего этот дата пак , расскажешь если не секрет ?

Ссылка на комментарий
Поделиться на другие сайты

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

Всё равно не понимаю, как сделать проверку. if data entity @s Offers.Recipes[0].sell.id == "minecraft:diamond_boots" в майнкрафте не существует, корень проблемы не решён

Всё остальное у меня уже реализовано, я застрял именно на финальном этапе с проверкой id предмета в торге

 

Ссылка на комментарий
Поделиться на другие сайты

25 минут назад, jahotun сказал:

Спасибо за ответ, но я не понимаю как работают эти строки. Разве в майне есть циклы? Если да, то почему forvalues не распознается игрой?

Как (указанная) третья строчка вообще работает, если по структуре "if data entity @s Offers.Recipes[0].sell.id" дальше идёт уже другая подкоманда и продолжение "== "minecraft:diamond_boots"" майн не понимает

Возможно я просто туплю, но с таким я ещё не сталкивался

execute if data entity @s Offers.Recipes[7].sell{id:"minecraft:diamond_boots"}
Ссылка на комментарий
Поделиться на другие сайты

  • jahotun закрыл тема
Гость
Эта тема закрыта для публикации ответов.
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...