Загрузка данных
Подойдёт надёжный вариант без модов/датапаков: кратковременно отключать выпадение блоков (gamerule doTileDrops) только на момент взрыва, а потом сразу включать обратно. Это делается через командные блоки + scoreboard — не нужно ничего дополнительно ставить (только права OP).
Идея: при обнаружении TNT с Fuse почти на 0 или взрывающегося крипера мы ставим doTileDrops false и запускaем таймер (несколько тиков). Таймер считает вниз, затем включаем doTileDrops true обратно. Таким образом блоки ломаются (станут air), но предметы не спавнятся.
Шаги (версия 1.21.1):
1) Создайте objective:
/scoreboard objectives add explRestore dummy
2) Установите начальное значение:
/scoreboard players set #expl explRestore 0
/gamerule doTileDrops true
3) Поставьте 6 командных блоков (тип — Repeating или Chain, см. ниже).
Вариант простой компоновки (все Repeat, Always Active) — можно поставить 6 повторяющихся блоков в ряд:
Командный блок 1 (Repeating, Always Active):
execute as @e[type=minecraft:tnt,nbt={Fuse:1s}] at @s run gamerule doTileDrops false
Командный блок 2 (Repeating, Always Active):
execute as @e[type=minecraft:tnt,nbt={Fuse:1s}] at @s run scoreboard players set #expl explRestore 6
Командный блок 3 (Repeating, Always Active):
execute as @e[type=minecraft:creeper,nbt={Swell:1s}] at @s run gamerule doTileDrops false
Командный блок 4 (Repeating, Always Active):
execute as @e[type=minecraft:creeper,nbt={Swell:1s}] at @s run scoreboard players set #expl explRestore 6
Командный блок 5 (Repeating, Always Active):
scoreboard players remove #expl explRestore 1
Командный блок 6 (Repeating, Always Active):
execute if score #expl explRestore matches 0 run gamerule doTileDrops true
Пояснения:
• Мы детектируем TNT с Fuse:1s (это за 1 тик до взрыва) и крипера с Swell:1s (аналогично, когда он готовится взорваться). В этот момент ставим doTileDrops false и запускаем счётчик #expl = 6.
• Каждый тик блок 5 уменьшает счётчик на 1. Через 6 тиков (≈0.3 с) счётчик дойдёт до 0, и блок 6 снова включит doTileDrops true.
• 6 тиков — с запасом, чтобы гарантировать, что взрыв уже произошёл и дропы не создались. Можно уменьшить или увеличить это число при тестировании.
• doTileDrops влияют глобально, но всего на доли секунды — минимальный побочный эффект. Альтернатива (локально убивать item-энтити) менее надежна из-за тайминга взрыва.
Важные замечания и возможные проблемы:
• Команды используют NBT-поля Fuse и Swell. В стандартной версии эти теги присутствуют (TNT: Fuse, Creeper: Swell). Если у вас какая‑то нестандартная сборка/плагин — теги могут отличаться.
• Во время короткого отключения doTileDrops другие источники выпадений (например, ломание игроком) не будут дропать предметы — но окно очень короткое, так что в большинстве случаев это незаметно.
• Если нужно точечно (только в определённой области) — можно модифицировать команды gamerule → вместо глобального менять локально: перед установкой doTileDrops false можно телепортировать игрока/использовать локальные манипуляции — но vanilla не поддерживает локальный doTileDrops; потому используем глобальный.
• Если вам строго запрещено менять gamerule, можно сделать альтернативный подход: при обнаружении Fuse:1s / Swell:1s сразу же kill @e[type=item,distance=..6] at @s — это убирает уже появившиеся дропы локально (но надо подобрать радиус). Однако отлов тайминга у TNT/крипера менее надежен (лучше ставить doTileDrops отключение).
Если хотите — могу:
• дать готовую схему командных блоков в виде точных шагов (в каком порядке ставить, какие флаги Chain/Conditional и т. п.);
• настроить меньший/больший таймер (количество тиков) и предложить вариант с локальным удалением item-энтити (kill @e[type=item,distance=..X]) вместо gamerule.