PSEUDO Опубликовано 1 апреля, 2024 Поделиться Опубликовано 1 апреля, 2024 Расскажу, а главное покажу, как можно создать свой верстак используя только КБ (командные блоки) Для реализации нам понадобится любой блок-сущность (сундук, воронка, печка и т.д) со слотами, в которые можно складывать предметы. В моём случаё, я буду использовать обычный сундук. Для начала расскажу про команду /data. С её помощью, вы можете получать, задавать, изменять и удалять NBT-данные сущностей и блоков-сущностей (у игрока можно только получать данные). В текущем гайде, мы будем обращаться к массиву хранилищу предметов. Спойлер [ПРИМЕР] Получение данных инвентаря игрока и сундука: Спойлер Пропишем команду в [КОНСОЛЬ]: /data get entity @s Inventory get - получить entity - сущность @s - таргет текущего исполнителя (так как команду исполняем мы, вводя её в консоль, таргет указывает на нас) Inventory - массив предметов игрока Мы получаем всю nbt-информацию в слоте (задействующие слоты; предметы в них: кол-во предметов; их теги): Если мы хотим считать информацию (например кол-во предметов во втором слоте): /data get entity @s Inventory[{Slot:1b}].Count Если такова информация есть, мы получим ответ: Аналогичным образом можно получить у сундука. Чтобы получить координаты сундука, достаточно просто смотреть на него во время набора команды, через F3 - target block или если вы хотите получить всю информацию блока, наведитесь на него и нажмите F3+I: /data get block <"координаты блока-сущности"> Items Items - массив предметов хранилища Для начала, решим, как и что мы собираемся крафтить в нашем сундуке. Для примера, я буду создавать каменную кирку из булыжника (мрамора итальянского) и палок: Спойлер Планируется крафт в таком виде: Создадим счетчик крафта и проверим наличие булыжника и палок в данных ячейках, если ВСЕ на месте, выведем в счетчик крафта 0 (-1 - крафт не готов; 0 - крафт готов; 1 - крафт окончен): [КОНСОЛЬ]: /scoreboard objectives add craft dummy /scoreboard objectives setdisplay sidebar craft /scoreboard players set @s craft -1 счётчик крафта [КОМАНДА ДЛЯ ЦИКЛА №1]: execute as @p[scores={craft=-1}] if data block <"координаты сундука"> Items[{Slot:12b, id:"minecraft:stick"}] run execute if data block <"координаты сундука"> Items[{Slot:21b, id:"minecraft:stick"}] run execute if data block <"координаты сундука"> Items[{Slot:2b, id:"minecraft:cobblestone"}] run execute if data block <"координаты сундука"> Items[{Slot:3b, id:"minecraft:cobblestone"}] run execute if data block <"координаты сундука"> Items[{Slot:4b, id:"minecraft:cobblestone"}] run execute unless data block <"координаты сундука"> Items[{Slot:11b}] run execute unless data block <"координаты сундука"> Items[{Slot:13b}] run execute unless data block <"координаты сундука"> Items[{Slot:20b}] run execute unless data block <"координаты сундука"> Items[{Slot:22b}] run scoreboard players set @s craft 0 проверка готовности крафта @p[scores={craft=-1}] - ближайший игрок с неготовым крафтом if data block <"координаты сундука"> Items[{Slot:<"номер слота">, id:"<"предмет">"}] - продолжить, если в слоте нужный предмет unless data block <"координаты сундука"> Items[<"номер слота">] - продолжить, если слот пуст scoreboard players set @s craft 0 - задать счётчику 0 (крафт готов) [КОМАНДА ДЛЯ ЦИКЛА №2] Если крафт готов, показываем нашу кирку: data modify block <"координаты блока"> Items append value {Slot:15b, id:"minecraft:stone_pickaxe", Count:1b} добавляем в массив предметов данные кирки [КОМАНДЫ №3] Если хотя-бы одного предмета не хватает или в пустых ячейках есть лишние предметы, то крафт не должен быть готовым (счетчик: -1): /проверка булыжника execute as @p[scores={craft=0}] unless data block <"координаты блока"> Items[{Slot:2b, id:"minecraft:cobblestone"}] run scoreboard players set @s craft -1 execute as @p[scores={craft=0}] unless data block <"координаты блока"> Items[{Slot:3b, id:"minecraft:cobblestone"}] run scoreboard players set @s craft -1 execute as @p[scores={craft=0}] unless data block <"координаты блока"> Items[{Slot:4b, id:"minecraft:cobblestone"}] run scoreboard players set @s craft -1 /проверка палок execute as @p[scores={craft=0}] unless data block <"координаты блока"> Items[{Slot:12b, id:"minecraft:stick"}] run scoreboard players set @s craft -1 execute as @p[scores={craft=0}] unless data block <"координаты блока"> Items[{Slot:21b, id:"minecraft:stick"}] run scoreboard players set @s craft -1 /проверка пустых слотов execute as @p[scores={craft=0}] if data block <"координаты блока"> Items[{Slot:11b}] run scoreboard players set @s craft -1 execute as @p[scores={craft=0}] if data block <"координаты блока"> Items[{Slot:13b}] run scoreboard players set @s craft -1 execute as @p[scores={craft=0}] if data block <"координаты блока"> Items[{Slot:20b}] run scoreboard players set @s craft -1 execute as @p[scores={craft=0}] if data block <"координаты блока"> Items[{Slot:22b}] run scoreboard players set @s craft -1 [КОМАНДА №4] Если крафт не готов, не отображаем кирку (счётчик: -1): execute as @p[scores={craft=-1}] run data remove block <"координаты блока"> Items[{Slot:15b}] удаляем кирку из слота [КОМАНДА ДЛЯ ЦИКЛА №5] Если мы забираем кирку, то крафт закончен (счётчик: 1): execute as @p[scores={craft=0}] at @s unless data block <"координаты блока"> Items[{Slot:15b, id:"minecraft:stone_pickaxe"}] run scoreboard players set @s craft 1 если кирка пропадает из слота, после готовности крафта, крафт завершается (счётчик равен 1) [КОМАНДА ДЛЯ ЦИКЛА №6] Сбрасываем счетчик после завершения крафта (счётчик: -1): scoreboard players set @p[scores={craft=1}] craft -1 [СХЕМА КБ]: Спойлер Теперь осталось вычитать по одному предмету из ячеек, после того, как крафт был завершен (счётчик: 1). В КБ математические операции возможны, только для задач /scoreboard (другие я не знаю). Поэтому, нам придётся создать еще дополнительные счетчики для слотов, в которые мы будем помещать данные предметов (количество), а затем вычитать из них наш счётчик крафта (именно для этого, я подобрал такие параметры для него (-1; 0; 1), чтобы вычиталась единица, когда крафт завершен): Спойлер Создадим счетчики предметов в ячейках и присвоим им данные кол-ва предметов. [КОНСОЛЬ]: /scoreboard objectives add slotCount_1 dummy /scoreboard objectives add slotCount_2 dummy /scoreboard objectives add slotCount_3 dummy /scoreboard objectives add slotCount_5 dummy /scoreboard objectives add slotCount_8 dummy /scoreboard players set @s slotCount_1 0 /scoreboard players set @s slotCount_2 0 /scoreboard players set @s slotCount_3 0 /scoreboard players set @s slotCount_5 0 /scoreboard players set @s slotCount_8 0 [КОМАНДЫ ДЛЯ ЦИКЛА №1]: Присваиваем счётчикам данные слотов, а именно кол-во предметов в них: execute as @p[scores={craft=-1..}] at @s store result score @s slotCount_1 run data get block <"координаты блока"> Items[{Slot:2b}].Count execute as @p[scores={craft=-1..}] at @s store result score @s slotCount_2 run data get block <"координаты блока"> Items[{Slot:3b}].Count execute as @p[scores={craft=-1..}] at @s store result score @s slotCount_3 run data get block <"координаты блока"> Items[{Slot:4b}].Count execute as @p[scores={craft=-1..}] at @s store result score @s slotCount_5 run data get block <"координаты блока"> Items[{Slot:12b}].Count execute as @p[scores={craft=-1..}] at @s store result score @s slotCount_8 run data get block <"координаты блока"> Items[{Slot:21b}].Count [КОМАНДЫ ДЛЯ ЦИКЛА №2]: Если крафт завершен, вычесть из счётчиков кол-ва предметов единицу из счётчика крафта: execute as @p[scores={craft=1}] at @s store result block <"координаты блока"> Items[{Slot:2b}].Count int 1 run scoreboard players operation @s slotCount_1 -= @s craft execute as @p[scores={craft=1}] at @s store result block <"координаты блока"> Items[{Slot:3b}].Count int 1 run scoreboard players operation @s slotCount_2 -= @s craft execute as @p[scores={craft=1}] at @s store result block <"координаты блока"> Items[{Slot:4b}].Count int 1 run scoreboard players operation @s slotCount_3 -= @s craft execute as @p[scores={craft=1}] at @s store result block <"координаты блока"> Items[{Slot:12b}].Count int 1 run scoreboard players operation @s slotCount_5 -= @s craft execute as @p[scores={craft=1}] at @s store result block <"координаты блока"> Items[{Slot:21b}].Count int 1 run scoreboard players operation @s slotCount_8 -= @s craft [СХЕМА КБ]: Спойлер На этом всё, ваш "ВЕРСТАК-СУНДУК" готов! Спойлер Цитата Если у вас остались вопросы, не стесняйтесь, задавайте, с радостью отвечу. Спасибо за внимание! PhoenixTechu 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
В теме 1 сообщение
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти