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

Помогите в создании датапака


DDlight

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

В теме 3 сообщения

Как создать датапак который бы изменил бесконечный генератор булыжника. То есть если появившийся булыжник касается какого то блока он бы заменялся на другой. 

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

  • 3 недели спустя...

https://www.planetminecraft.com/data-pack/ore-generator-1-13-datapack/

вот тут ↑↑↑ готовый датапак

Честно говоря я не пробовал понять как он работает, но в тебя я верю)

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

  • 1 год спустя...

1. Обзор подхода (улучшенный):

Вместо циклов, которые могут негативно сказаться на производительности, мы будем использовать более эффективный подход:

  1. Отслеживание выпавшего камня (касается земли).
  2. Проверка соседних блоков.
  3. Замена при соблюдении условий.

2. Структура датапака:

 
my_datapack/
├── data/
│   └── minecraft/
│       ├── functions/
│       │   ├── replace_stone.mcfunction      # Основная функция замены
│       │   └── helper_functions/  # Папка с вспомогательными функциями
│       │       └── get_block_below.mcfunction # Получить блок под предметом
│       └── tags/
│           └── functions/
│               └── tick.json                 # Запускает replace_stone.mcfunction каждый тик

3. Код датапака:

  • data/minecraft/functions/replace_stone.mcfunction (Основная функция):
mcфункция
# replace_stone.mcfunction

# 1. Отслеживаем камень (предмет) на земле:
execute as @e[type=minecraft:item,nbt={Item:{id:"minecraft:stone",Count:1b}},distance=..0.2] at @s run { # Проверяем нахождение камня рядом с землёй
  execute if block ~ ~-0.1 ~ minecraft:stone run { # Проверяем наличие камня под ним
    execute as @s run function my_datapack:helper_functions/get_block_below # Узнаем блок
    execute if score #block_below my_datapack:block_type matches <ID_BLOCK> run {
       setblock ~ ~-0.1 ~ minecraft:deepslate # Заменяем камень на выбранный
       kill @s # Удаляем предмет
    }
  }
}
  • data/minecraft/functions/helper_functions/get_block_below.mcfunction (Вспомогательная функция):
mcфункция
# get_block_below.mcfunction
scoreboard players set #block_below my_datapack:block_type 0 # Сбрасываем счётчик
execute store result score #block_below my_datapack:block_type run data get block ~ ~-1 ~ Name # Определяем тип блока
  • data/minecraft/tags/functions/tick.json (Триггер):
json
{
  "values": [
    "my_datapack:replace_stone"
  ]
}

4. Объяснение и настройка:

  • replace_stone.mcfunction:
    • execute as @e[type=minecraft:item,nbt={Item:{id:"minecraft:stone",Count:1b}},distance=..0.2] at @s run { ... }: Находим выпадающий камень и центрируемся на нём.
    • execute if block ~ ~-0.1 ~ minecraft:stone run { ... }: Проверяем, не касается ли он земли.
    • execute as @s run function my_datapack:helper_functions/get_block_below: Запускаем вспомогательную функцию для определения блока.
    • execute if score #block_below my_datapack:block_type matches <ID_BLOCK> run {: Проверяет является ли выбранный блок нужным для замены.
    • setblock ~ ~-0.1 ~ minecraft:deepslate: Заменяет камень на выбранный.
    • kill @s: Удаляет предмет.
  • get_block_below.mcfunction:
    • scoreboard players set #block_below my_datapack:block_type 0: Обнуляет переменную.
    • execute store result score #block_below my_datapack:block_type run data get block ~ ~-1 ~ Name: Получаем ID блока, на который находится булыжник.
  • tick.json: Запускает replace_stone.mcfunction каждый тик.

5. Настройка (Важно!):

  • <ID_BLOCK>Ключевой момент: : В replace_stone.mcfunction замените <ID_BLOCK> на правильный тег для блока, с которым должен взаимодействовать ваш булыжник:
    • Для конкретного блока: Если вам нужен один конкретный блок (например, блок травы), используйте строку: execute if score #block_below my_datapack:block_type matches "minecraft:grass_block"
    • Для нескольких блоков: Для большего удобства, вы можете использовать:
      1. scoreboard objectives add blocks_for_replace dummy Создайте еще один scoreboard.
      2. Выполните команду: /scoreboard players set #grass blocks_for_replace 1
      3. И в коде replace_stone.mcfunction используйте:
      • execute if score #block_below my_datapack:block_type matches "minecraft:grass_block" run execute scoreboard players set #block_below my_datapack:block_type 1
      • execute if score #block_below my_datapack:block_type matches "minecraft:dirt" run execute scoreboard players set #block_below my_datapack:block_type 1
      • execute if score #block_below my_datapack:block_type matches "minecraft:sand" run execute scoreboard players set #block_below my_datapack:block_type 1
      • И потом в коде replace_stone.mcfunction используйте: execute if score #block_below my_datapack:block_type matches 1 run
  • Целевой блок: Убедитесь, что вы используете правильный идентификатор блока (например, minecraft:dirt, minecraft:grass_block, и т.д.) в команде setblock.

6. Как использовать:

  1. Создайте структуру каталогов датапака, как указано выше.
  2. Вставьте код в соответствующие файлы.
  3. Загрузите датапак в свой мир (поместите папку my_datapack в папку datapacks вашего мира).
  4. Выполните команду /reload.
  5. Создайте бесконечный генератор булыжников и разместите целевые блоки рядом с ним.
  6. Подождите, пока сгенерированный булыжник коснется целевого блока.
  7. Проверьте, происходит ли замена.

Преимущества этого подхода:

  • Производительность: этот метод, в отличие от перебора блоков, гораздо более эффективен.
  • Гибкость: легко изменить целевой блок, просто отредактировав строку if block ....
  • Более надежно: Меньше вероятности ошибок.

Дополнительные улучшения:

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

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

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

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

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

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

Войти

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

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

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