В Minecraft под заменой обычно понимают одно из трех:
1) заменить блок на сервере командами (мгновенно или по условию),
2) заменить блок при разрушении добычей (loot tables),
3) заменить блок через моддинг на Java (логика в коде блока).

Ниже разберем рабочие способы.

Замена блоков командами (ваниль, без модов)

Заменить блок на другой в области: /fill

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

Пример:

/fill 100 20 100 110 20 110 minecraft:stone replace minecraft:dirt

Если вы хотите заменить только dirt, а остальное не трогать, используйте replace с исходным блоком. Формат такой:
- fill x1 y1 z1 x2 y2 z2 block replace <старый_блок>

Работает для Java- и Bedrock-версий по-разному по синтаксису, поэтому проверьте формат под вашу платформу.

Заменить блок точечно: /setblock

Точечная замена по координатам.

Пример:

/setblock 100 64 100 minecraft:diamond_block

Если нужно заменять только при совпадении старого блока, используют связку с execute if (Java) или повторяемые командные блоки (в зависимости от версии и издания).

Автоматическая замена по условию: /execute

Для Java-версии часто делают так:
- ищут блок по условию,
- выполняют /setblock с новым блоком.

Общий принцип:
1) execute if block ... <старый_блок>
2) run setblock ... <новый_блок>

Формулы зависят от версии, но логика одна: команда делает замену только когда в ячейке действительно стоит нужный блок.

Замена дропа: заменить, что выпадает из блока

Когда вы говорите “заменить блок на другой”, иногда речь о том, чтобы вместо стандартного дропа выдавался другой предмет. Это делается через loot tables.

Идея loot tables

У каждого блока в ресурс-паке есть таблица добычи. Когда игрок ломает блок, игра смотрит таблицу и выбирает, что выпадет.

Это полезно, если вы хотите:
- убрать дроп или сделать другой,
- поменять предметы из одного блока на предметы из мода,
- настроить шанс.

Иногда в сообщениях на форумах фигурирует “дроп с блоков” и вопросы про команды для Bedrock, но для полноценного контроля чаще всего используют loot tables (Java) или поведение/скрипты (Bedrock), в зависимости от версии.

Где менять

Обычно в вашем датапаке/ресурс-паке:
- data/<namespace>/loot_tables/blocks/<имя_блока>.json

Дальше в JSON меняют functions и entries так, чтобы вместо ванильных предметов выдавались нужные.

Если вы делаете замену “один блок - другой предмет”, часто проще начать с таблицы ванильного блока и заменить minecraft:<item> на ваши namespace:<item>.

Замена блока логикой в моде (Forge/Fabric)

Если вы делаете мод и хотите, чтобы блок “превращался” в другой при событии (например, рядом поставили блок), это делается не командой, а обработчиками в коде блока.

Когда вы вызываете события соседей

В коде для блока важны методы, которые срабатывают при изменении соседей. В похожих примерах на форумах разработчики пытаются обрабатывать событие изменения соседнего блока и затем вызывать world.setBlock(...) или “сломать” текущий блок.

На практике ключевые моменты такие:
- менять блок нужно в правильном месте кода и с корректными параметрами состояния (BlockState / IBlockState),
- после изменения не стоит “мешать” стандартной логикой вызовов родителя так, чтобы она отменяла ваши изменения,
- если вы ломаете блок и вызываете drop вручную, убедитесь, что не дублируете логику по нескольким путям.

В примерах по теме изменения модели/поведения при установке соседнего блока часто упираются в то, что вызов super приводит к конфликту: ваш код успевает отработать, но стандартное поведение дальше перезаписывает итог.

Как сделать замену “чисто”

Самый надежный подход в моддинге:
1) детект события (сосед поставили, изменился блок под блоком, появился триггер и т.д.),
2) один раз выполнить world.setBlock на новый блок,
3) при необходимости обновить состояние мира и сохранить нужный BlockState.

Для точных сигнатур методов ориентируйтесь на версию Forge/Fabric и версию Minecraft.

Типичные ошибки

Ошибка Как проявляется Как исправить
Путают “заменить блок” и “заменить дроп” Блок на месте, но предметы другие или наоборот Выберите цель: setblock/fill для замены блока, loot tables для замены дропа
Используют fill, но ожидают замену только одного типа Меняется вся область В команде добавляйте replace <старый_блок>
Делают замену в моде, но стандартная логика всё отменяет В коде меняете, но в игре результат не закрепляется Меняйте блок в одном четком месте и аккуратно относитесь к вызову родителя
На Bedrock пробуют синтаксис Java команд Команды не работают Проверяйте формат именно для вашей версии и издания

Полезные ссылки

  • Minecraft Wiki (официальная справка сообщества по блокам, механикам и техническим нюансам): https://minecraft.fandom.com/ru/wiki/%D0%9F%D0%BE%D0%B8%D1%81%D0%BA
  • Документация по командам Java Edition (команды fill, setblock, execute): https://minecraft.wiki/w/Commands
  • Справка по loot tables (чтобы заменить дроп блока): https://minecraft.wiki/w/Loot_table