jahotun Опубликовано 1 мая, 2025 Поделиться Опубликовано 1 мая, 2025 Хочу изменить торги у жителей, версия 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 всегда поножи и тд) тоже нельзя, т.к. изменить хочу не только бронников, а в других жителях торги "плавающие" Если есть возможность изменить торги другим способом, мне тоже подойдёт (может есть что-то как лут тейблы но для жителей я хз) Ссылка на комментарий Поделиться на другие сайты Поделиться
Mr.horse Опубликовано 1 мая, 2025 Поделиться Опубликовано 1 мая, 2025 # Цель: Проверить торги и заменить алмазные ботинки на железные, сохраняя зачарования. # Получаем всех жителей в радиусе (настройте радиус по необходимости) 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] } } } если помог, пожалуйста :) GhostoFBU и PhoenixTechu 1 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
jahotun Опубликовано 1 мая, 2025 Автор Поделиться Опубликовано 1 мая, 2025 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"" майн не понимает Возможно я просто туплю, но с таким я ещё не сталкивался Ссылка на комментарий Поделиться на другие сайты Поделиться
Mr.horse Опубликовано 1 мая, 2025 Поделиться Опубликовано 1 мая, 2025 вот что нашел 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"" майн не понимает Возможно я просто туплю, но с таким я ещё не сталкивался а в общем , для чего этот дата пак , расскажешь если не секрет ? Ссылка на комментарий Поделиться на другие сайты Поделиться
jahotun Опубликовано 1 мая, 2025 Автор Поделиться Опубликовано 1 мая, 2025 Датапак - балансировка торговли жителей, хочу заменить продажу алмазки, топ еды и книг зачарования Всё равно не понимаю, как сделать проверку. if data entity @s Offers.Recipes[0].sell.id == "minecraft:diamond_boots" в майнкрафте не существует, корень проблемы не решён Всё остальное у меня уже реализовано, я застрял именно на финальном этапе с проверкой id предмета в торге Ссылка на комментарий Поделиться на другие сайты Поделиться
Rozy Опубликовано 1 мая, 2025 Поделиться Опубликовано 1 мая, 2025 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 Опубликовано 1 мая, 2025 Автор Поделиться Опубликовано 1 мая, 2025 Работает, спасибо Mr.horse 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
В теме 7 сообщений