From df6a35d814e7b0ea791fe5e356f13a98f3a539c9 Mon Sep 17 00:00:00 2001 From: granny Date: Sun, 27 Aug 2023 02:09:51 -0700 Subject: [PATCH] option for turning sand into glass using lightning --- .../0309-lightning-affects-blocks.patch | 146 ++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 patches/server/0309-lightning-affects-blocks.patch diff --git a/patches/server/0309-lightning-affects-blocks.patch b/patches/server/0309-lightning-affects-blocks.patch new file mode 100644 index 000000000..affe1d7ce --- /dev/null +++ b/patches/server/0309-lightning-affects-blocks.patch @@ -0,0 +1,146 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: granny +Date: Sun, 27 Aug 2023 02:08:38 -0700 +Subject: [PATCH] lightning affects blocks + + +diff --git a/src/main/java/net/minecraft/world/entity/LightningBolt.java b/src/main/java/net/minecraft/world/entity/LightningBolt.java +index a01a8ba27534d2b0d544423bc2c48fd29d0a6d64..531538fdce8119aa59f341e50143f2518c914cb4 100644 +--- a/src/main/java/net/minecraft/world/entity/LightningBolt.java ++++ b/src/main/java/net/minecraft/world/entity/LightningBolt.java +@@ -17,19 +17,29 @@ import net.minecraft.server.level.ServerLevel; + import net.minecraft.server.level.ServerPlayer; + import net.minecraft.sounds.SoundEvents; + import net.minecraft.sounds.SoundSource; ++import net.minecraft.tags.FluidTags; + import net.minecraft.world.Difficulty; + import net.minecraft.world.level.GameRules; + import net.minecraft.world.level.Level; + import net.minecraft.world.level.block.BaseFireBlock; ++import net.minecraft.world.level.block.Block; + import net.minecraft.world.level.block.Blocks; ++import net.minecraft.world.level.block.BucketPickup; + import net.minecraft.world.level.block.LightningRodBlock; ++import net.minecraft.world.level.block.LiquidBlock; ++import net.minecraft.world.level.block.SpongeBlock; + import net.minecraft.world.level.block.WeatheringCopper; ++import net.minecraft.world.level.block.entity.BlockEntity; + import net.minecraft.world.level.block.state.BlockState; + import net.minecraft.world.level.gameevent.GameEvent; ++import net.minecraft.world.level.material.FluidState; + import net.minecraft.world.phys.AABB; + import net.minecraft.world.phys.Vec3; + // CraftBukkit start ++import org.bukkit.craftbukkit.block.CraftBlockState; + import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.craftbukkit.util.BlockStateListPopulator; ++import org.bukkit.event.block.SpongeAbsorbEvent; + // CraftBukkit end + + public class LightningBolt extends Entity { +@@ -83,6 +93,95 @@ public class LightningBolt extends Entity { + + } + ++ private void transformSandToGlass() { ++ BlockPos blockposition = this.getStrikePosition(); ++ BlockState iblockdata = this.level().getBlockState(blockposition); ++ ++ if (iblockdata.is(Blocks.LIGHTNING_ROD)) { ++ blockposition = blockposition.below(); ++ iblockdata = this.level().getBlockState(blockposition); ++ } ++ ++ if (iblockdata.is(Blocks.SAND)) { ++ level().setBlock(blockposition, Blocks.GLASS.defaultBlockState(), 2); ++ } else if (iblockdata.is(Blocks.STONE)) { ++ level().setBlock(blockposition, Blocks.OBSIDIAN.defaultBlockState(), 2); ++ } else if (iblockdata.is(Blocks.WATER)) { ++ level().setBlock(blockposition, Blocks.STONE.defaultBlockState(), 2); ++ } else { ++ return; ++ } ++ ++ BlockStateListPopulator blockList = new BlockStateListPopulator(level()); // CraftBukkit - Use BlockStateListPopulator ++ final BlockPos finalBlockposition = blockposition; ++ BlockPos.breadthFirstTraversal(blockposition, 3, 6, (blockposition1, consumer) -> { // Purpur ++ Direction[] aenumdirection = Direction.values(); ++ int i = aenumdirection.length; ++ ++ for (int j = 0; j < i; ++j) { ++ Direction enumdirection = aenumdirection[j]; ++ ++ consumer.accept(blockposition1.relative(enumdirection)); ++ } ++ ++ }, (blockposition1) -> { ++ if (blockposition1.equals(finalBlockposition)) { ++ return true; ++ } else { ++ BlockState iblockdata2 = blockList.getBlockState(blockposition1); ++ FluidState fluid = blockList.getFluidState(blockposition1); ++ ++ if (!iblockdata2.is(Blocks.SAND) && !iblockdata2.is(Blocks.STONE) && !fluid.is(FluidTags.WATER)) { // Purpur ++ return false; ++ } else { ++ if (iblockdata2.is(Blocks.SAND)) { ++ blockList.setBlock(blockposition1, Blocks.GLASS.defaultBlockState(), 3); ++ }// else if (iblockdata2.is(Blocks.STONE)) { ++ // blockList.setBlock(blockposition1, Blocks.OBSIDIAN.defaultBlockState(), 3); ++ // } else if (iblockdata2.is(Blocks.WATER)) { ++ // blockList.setBlock(blockposition1, Blocks.STONE.defaultBlockState(), 3); ++ // } ++ return true; ++ } ++ } ++ }); ++ // CraftBukkit start ++ List blocks = blockList.getList(); // Is a clone ++ if (!blocks.isEmpty()) { ++ final org.bukkit.block.Block bblock = level().getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ ++ SpongeAbsorbEvent event = new SpongeAbsorbEvent(bblock, (List) (List) blocks); ++ level().getCraftServer().getPluginManager().callEvent(event); ++ ++ if (event.isCancelled()) { ++ return; ++ } ++ ++ for (CraftBlockState block : blocks) { ++ BlockPos blockposition1 = block.getPosition(); ++ BlockState iblockdata3 = level().getBlockState(blockposition1); ++ FluidState fluid = level().getFluidState(blockposition1); ++ ++ if (fluid.is(FluidTags.WATER)) { ++ if (iblockdata3.getBlock() instanceof BucketPickup && !((BucketPickup) iblockdata3.getBlock()).pickupBlock(blockList, blockposition1, iblockdata3).isEmpty()) { ++ // NOP ++ } else if (iblockdata3.getBlock() instanceof LiquidBlock) { ++ // NOP ++ } else if (iblockdata3.is(Blocks.KELP) || iblockdata3.is(Blocks.KELP_PLANT) || iblockdata3.is(Blocks.SEAGRASS) || iblockdata3.is(Blocks.TALL_SEAGRASS)) { ++ BlockEntity tileentity = iblockdata3.hasBlockEntity() ? level().getBlockEntity(blockposition1) : null; ++ ++ // Paper start ++ if (block.getHandle().isAir()) { ++ Block.dropResources(iblockdata3, level(), blockposition1, tileentity); ++ } ++ // Paper end ++ } ++ } ++ level().setBlock(blockposition1, block.getHandle(), block.getFlag()); ++ } ++ } ++ } ++ + @Override + public void tick() { + super.tick(); +@@ -97,6 +196,9 @@ public class LightningBolt extends Entity { + this.spawnFire(4); + } + ++ this.transformSandToGlass(); // Purpur ++ // this.transformWaterToGlass(); // Purpur ++ // this.transformSandToGlass(); // Purpur + this.powerLightningRod(); + LightningBolt.clearCopperOnLightningStrike(this.level(), this.getStrikePosition(), this); // Paper - transmit LightningBolt instance to call EntityChangeBlockEvent + this.gameEvent(GameEvent.LIGHTNING_STRIKE);