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

[ГАЙД] Как сделать свой верстак со своим рецептом | JAVA 1.20.4 | КБ


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

В теме 1 сообщение

Расскажу, а главное покажу, как можно создать свой верстак используя только КБ (командные блоки)

      Для реализации нам понадобится любой блок-сущность (сундук, воронка, печка и т.д) со слотами, в которые можно складывать предметы. В моём случаё, я буду использовать обычный сундук.

  1. Для начала расскажу про команду /data. С её помощью, вы можете получать, задавать, изменять и удалять NBT-данные сущностей и блоков-сущностей (у игрока можно только получать данные). В текущем гайде, мы будем обращаться к массиву хранилищу предметов.
    Спойлер
    • [ПРИМЕР] Получение данных инвентаря игрока и сундука:
      Спойлер
      • Пропишем команду в [КОНСОЛЬ]:
      /data get entity @s Inventory
        
      get - получить
      entity - сущность
      @s - таргет текущего исполнителя (так как команду исполняем мы, вводя её в консоль, таргет указывает на нас)
      Inventory - массив предметов игрока
      • Мы получаем всю nbt-информацию в слоте (задействующие слоты; предметы в них: кол-во предметов; их теги)

      image.png.867c43c50948d75e61ff8ffd1eff924c.png

      • Если мы хотим считать информацию (например кол-во предметов во втором слоте):
      /data get entity @s Inventory[{Slot:1b}].Count
      • Если такова информация есть, мы получим ответ:

      image.png.aae93853b93868565d869ae90b39273d.png

      • Аналогичным образом можно получить у сундука. Чтобы получить координаты сундука, достаточно просто смотреть на него во время набора команды, через F3 - target block или если вы хотите получить всю информацию блока, наведитесь на него и нажмите F3+I:
      /data get block <"координаты блока-сущности"> Items
      
      Items - массив предметов хранилища

      image.png.8e41cad4461eb84a6fd7e2bc13a100c3.png

       image.png.ae05c9e93ef8c691fa792a4bfd955f38.png

     
  2. Для начала, решим, как и что мы собираемся крафтить в нашем сундуке. Для примера, я буду создавать каменную кирку из булыжника (мрамора итальянского) и палок:
    Спойлер
    • Планируется крафт в таком виде:

    image.png.c24286db21ea02837e06881f0549e1e0.png

    • Создадим счетчик крафта и проверим наличие булыжника и палок в данных ячейках, если ВСЕ на месте, выведем в счетчик крафта 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
    • [СХЕМА КБ]:
      Спойлер

      image.png.c47ed158fe6dcf3091adcd85cbd6a82d.png

     
  3. Теперь осталось вычитать по одному предмету из ячеек, после того, как крафт был завершен (счётчик: 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
    • [СХЕМА КБ]:
      Спойлер

      image.png.8a753500b1e16c97e5c2a8fc228bf275.png

     
  4. На этом всё, ваш "ВЕРСТАК-СУНДУК" готов!
    Спойлер

    image.thumb.gif.447b532f8a71544a085c1e78cd1e20b9.gif

     

 

Цитата

Если у вас остались вопросы, не стесняйтесь, задавайте, с радостью отвечу.

Спасибо за внимание!

 

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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

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