Как отключить повреждение блока TNT?

Я делаю карту, и там будет много взрывов, и я не хочу, чтобы они повреждали блоки.

Я сделал /gamerule mobGriefing false, но все равно будет повреждение блоков TNT.

Есть ли способ отключить и это?

Решение

Так что это сложно, но не намного хуже, чем предотвращение создания игроком алмазного меча. Самое большое различие здесь в том, что все должно происходить в один и тот же тик, и это должно происходить каждый тик. Это исключает стратегию, которую я использовал в ответе по ссылке; часы с частотой заполнения 20 Гц практически необходимы, в то время как в другом ответе я мог использовать более медленные и простые часы. Чтобы это работало, вы все равно захотите отключить griefing мобов, так как я использую огненные шары ghast для создания фактического взрыва. Также можно добиться эффекта, но нанести 0 урона игрокам или другим существам, и я добавлю команды для этого в конце.

Первый шаг - установить цель на табло, чтобы отслеживать TNT, который вот-вот взорвется:

/scoreboard objectives add TNTGoBoom dummy

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

fill ~ ~1 ~ ~3 ~1 ~ air

а в верхнем введите следующую команду:

fill ~ ~-1 ~ ~3 ~-1 ~ redstone_block

Поместите блок красного камня между ними, и вы получите часы заполнения. В идеале, он не должен находиться рядом с границей чанка, но у меня он был, и все равно работал нормально. Если часть часов заполнения выгружается из памяти, могут происходить забавные вещи, но если это чанк спавна или вы всегда находитесь рядом с часами, вам не стоит беспокоиться.

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

scoreboard players set @e[type=PrimedTnt] TNTGoBoom 1 {Fuse:0b}
execute @e[type=PrimedTnt,score_TNTGoBoom=1] ~ ~ ~ summon Fireball ~ ~ ~ {direction:[0.0,-1.0,0.0],ExplosionPower:4,Fuse:0,Time:-1,TileEntityData:{CustomName:"TNT"},ActiveEffects:[{Id:14,Duration:10,Amplifier:10,Ambient:1}]}
kill @e[type=PrimedTnt,score_TNTGoBoom=1]

Итак, давайте рассмотрим эти три команды. Первая устанавливает значение на табло для цели TNTGoBoom равным 1 для каждого тротила, готового взорваться на следующем тике. Таким образом мы отслеживаем тротил. Следующая команда вызывает невидимый огненный шар в точном месте расположения тротила, движущийся прямо вниз и обладающий такой же взрывной силой, как и кусок тротила. Это то, что вызовет эффект взрыва и нанесет урон игрокам/объектам, но, так как функция griefing для мобов отключена, она не повредит местность. Наконец, мы "убиваем" (эффективно удаляем) TNT, который вот-вот взорвется, чтобы он не повредил местность.


Теперь, если вы хотите, чтобы эффект взрыва все еще был, не причиняя никакого вреда, то вам нужно заменить команду вызова огненного шара на 2 командных блока (и, следовательно, увеличить время заполнения еще на один блок):

execute @e[type=PrimedTnt,score_TNTGoBoom=1] ~ ~ ~ particle hugeexplosion ~ ~ ~ 0 0 0 1
execute @e[type=PrimedTnt,score_TNTGoBoom=1] ~ ~ ~ playsound random.explode @a ~ ~ ~

Эти две команды создают эффект частиц и звук взрыва TNT, но это все. При использовании этого метода вместо метода огненного шара мир, игроки или сущности не пострадают.


Дополнение: Это действительно испортит такие вещи, как тротиловые пушки. Я запустил это в своем творческом мире, где ранее тестировал бесконечную тротиловую пушку, и хотя она вроде как работает (тротиловый снаряд все еще немного выстреливает), она имеет тенденцию посылать огненный шар в небо. Кроме того, это означает, что каждый блок TNT нужно поджигать отдельно, так как при отключенном мобгрейде огненный шар не будет поджигать другие рядом. Я уверен, что есть способ обойти это, если приложить немного больше командно-блочного мастерства. На самом деле, я знаю, что есть способ сделать это, просто я пока не знаю деталей на 100%.

Комментарии (16)

Это теория, которая у меня была, она немного запутанная, и я все еще работаю над тем, чтобы она работала. Если вы можете сделать так, чтобы командный блок находил TNT (с проверкой команды) и делал так, чтобы он порождал крипера без задержки взрыва, и делал взрыв крипера выключенным (игровое правило "mob griefing off"). После того, как он порожден, сделайте так, чтобы сущность зажженного TNT была убита. Короче говоря, вы поджигаете тротил, тротил исчезает и заменяется крипером, который мгновенно взрывается.

Комментарии (1)

Сделайте устройство, которое заставляет командный блок включаться и выключаться, включаться и выключаться, и т.д. и т.п. сейчас, введите /kill @e[type=PrimedTnt] в командном блоке. Это уничтожит tnt, как только он будет установлен. ПРОСТО!

Комментарии (2)

Не в ванильном Minecraft, нет.

Для этого вам понадобится серверный плагин или мод (предпочтительно WorldGuard).

Здесь есть хороший вопрос, который показывает, как вы можете сделать это с помощью World Guard.


Источник

Комментарии (0)

не используйте тротил, просто используйте мгновенно взрывающегося крипера, используя /summon creeper x y z {Fuse:0} или если вы хотите, чтобы тротил не повреждал ни один блок, используйте

вызовите заряженного крипера в месте нахождения TNT, используя /execute @e[type=PrimedTNT] ~ ~ ~ ~ summon creeper ~ ~ ~ ~ {Fuse:0} в часы, и используйте /kill @e[type=PrimedTNT] тоже в часах.

Комментарии (0)

Когда PrimedTnt вот-вот взорвется (взрыватель равен 1 или 0), замените его невидимым крипером. Я не буду выкладывать команды, но я видел на youtube видео от Sethbling под названием "Zelda Bombs in Minecraft", в котором используется этот механизм, среди прочего

Комментарии (1)

Я не уверен, но попробуйте следующее: /gamerule tntdamage false

Комментарии (1)