From d6e9d03a3b1b71ff71f4eff398e8da6789ff0fcb Mon Sep 17 00:00:00 2001 From: Samsuik Date: Wed, 25 Jun 2025 17:59:34 +0100 Subject: [PATCH] Protect blocks above a configured Y-level from explosions --- ...bove-a-configured-Y-level-from-explo.patch | 22 +++++++++++++++++++ .../configuration/WorldConfiguration.java | 14 +++++++++--- 2 files changed, 33 insertions(+), 3 deletions(-) create mode 100644 sakura-server/minecraft-patches/features/0032-Protect-blocks-above-a-configured-Y-level-from-explo.patch diff --git a/sakura-server/minecraft-patches/features/0032-Protect-blocks-above-a-configured-Y-level-from-explo.patch b/sakura-server/minecraft-patches/features/0032-Protect-blocks-above-a-configured-Y-level-from-explo.patch new file mode 100644 index 0000000..9655de2 --- /dev/null +++ b/sakura-server/minecraft-patches/features/0032-Protect-blocks-above-a-configured-Y-level-from-explo.patch @@ -0,0 +1,22 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Samsuik +Date: Wed, 25 Jun 2025 17:57:44 +0100 +Subject: [PATCH] Protect blocks above a configured Y-level from explosions + + +diff --git a/net/minecraft/world/level/ServerExplosion.java b/net/minecraft/world/level/ServerExplosion.java +index 82fdd92a7a8122a9e409db2491a56df0311cad30..1b48793a6472ab015d0f7d7755d77104cccd18c3 100644 +--- a/net/minecraft/world/level/ServerExplosion.java ++++ b/net/minecraft/world/level/ServerExplosion.java +@@ -414,6 +414,11 @@ public class ServerExplosion implements Explosion { + return Optional.of(net.minecraft.world.level.block.Blocks.BARRIER.getExplosionResistance()); + } + // Sakura end - protect scaffolding from creepers ++ // Sakura start - protect blocks above a configured Y-level from explosions ++ if (this.level.sakuraConfig().cannons.explosion.protectBlocksAboveY.test(val -> pos.getY() >= val)) { ++ return Optional.of(net.minecraft.world.level.block.Blocks.BARRIER.getExplosionResistance()); ++ } ++ // Sakura end - protect blocks above a configured Y-level from explosions + } + + return this.damageCalculator.getBlockExplosionResistance(this, this.level, pos, blockState, fluidState); diff --git a/sakura-server/src/main/java/me/samsuik/sakura/configuration/WorldConfiguration.java b/sakura-server/src/main/java/me/samsuik/sakura/configuration/WorldConfiguration.java index 1909baa..efa8465 100644 --- a/sakura-server/src/main/java/me/samsuik/sakura/configuration/WorldConfiguration.java +++ b/sakura-server/src/main/java/me/samsuik/sakura/configuration/WorldConfiguration.java @@ -83,6 +83,10 @@ public final class WorldConfiguration extends ConfigurationPart { public Explosion explosion = new Explosion(); public class Explosion extends ConfigurationPart { + public boolean optimiseProtectedRegions = false; + public boolean avoidRedundantBlockSearches = false; + public boolean useBlockCacheAcrossExplosions = false; + public Map durableMaterials = Util.make(new Reference2ObjectOpenHashMap<>(), map -> { map.put(Blocks.OBSIDIAN, new DurableMaterial(4, Blocks.COBBLESTONE.getExplosionResistance())); map.put(Blocks.ANVIL, new DurableMaterial(3, Blocks.END_STONE.getExplosionResistance())); @@ -92,16 +96,20 @@ public final class WorldConfiguration extends ConfigurationPart { @Comment("When disabled all explosions will be able to damage durable materials.") public boolean requireTntToDamageDurableMaterials = true; - public boolean optimiseProtectedRegions = false; - public boolean avoidRedundantBlockSearches = false; public boolean protectScaffoldingFromCreepers = false; public boolean destroyWaterloggedBlocks = false; public boolean explodeLava = false; public boolean consistentRadius = false; public boolean explosionsHurtPlayers = true; public boolean explosionsDropItems = true; - public boolean useBlockCacheAcrossExplosions = false; public boolean breakBlocksWhenOutsideTheWorldBorder = true; + + @Comment( + "Protects blocks above the configured height from explosions.\n" + + "Can be used to replicate the regen caps found on complexmc, and\n" + + "useful for protecting the nether roof when bedrock is a durable-material." + ) + public IntOr.Disabled protectBlocksAboveY = IntOr.Disabled.DISABLED; } public Mechanics mechanics = new Mechanics();