From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: granny Date: Sun, 27 Aug 2023 02:09:51 -0700 Subject: [PATCH] lightning transforms 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..6036a6fba66bec97ac46f2984356e2d1d6d94994 100644 --- a/src/main/java/net/minecraft/world/entity/LightningBolt.java +++ b/src/main/java/net/minecraft/world/entity/LightningBolt.java @@ -83,6 +83,51 @@ public class LightningBolt extends Entity { } + // Purpur start + private void transformBlocks() { + if (!level().purpurConfig.lightningTransformsBlocks) return; + + BlockPos blockposition = this.getStrikePosition(); + BlockState iblockdata = this.level().getBlockState(blockposition); + BlockPos blockposition2; + BlockState iblockdata2; + + if (iblockdata.is(Blocks.LIGHTNING_ROD)) { + blockposition2 = blockposition.below(); + iblockdata2 = this.level().getBlockState(blockposition2); + } else { + iblockdata2 = iblockdata; + blockposition2 = blockposition; + } + + if (level().purpurConfig.lightningTurnsSandIntoGlass && iblockdata2.is(Blocks.SAND)) { + level().setBlock(blockposition2, Blocks.GLASS.defaultBlockState(), 2); + } else if (level().purpurConfig.lightningTurnsStoneIntoObsidian && iblockdata2.is(Blocks.STONE)) { + level().setBlock(blockposition2, Blocks.OBSIDIAN.defaultBlockState(), 2); + } else if (level().purpurConfig.lightningTurnsWaterIntoStone && iblockdata2.is(Blocks.WATER)) { + level().setBlock(blockposition2, Blocks.STONE.defaultBlockState(), 2); + } else if (!level().purpurConfig.lightningTurnsNearbySandIntoGlass) { + return; + } + + org.bukkit.craftbukkit.util.BlockStateListPopulator blockList = new org.bukkit.craftbukkit.util.BlockStateListPopulator(level()); + net.minecraft.world.level.block.SpongeBlock.removeBlocksBreadthFirstSearch(level(), blockposition2, level().purpurConfig.lightningTurnsNearbySandIntoGlassMaxDepth, level().purpurConfig.lightningTurnsNearbySandIntoGlassMaxIterations, blockList, (blockposition1) -> { + if (blockposition1.equals(blockposition2)) { + return true; + } else { + BlockState iblockdata3 = blockList.getBlockState(blockposition1); + + if (!iblockdata3.is(Blocks.SAND)) { // Purpur + return false; + } else { + blockList.setBlock(blockposition1, Blocks.GLASS.defaultBlockState(), 3); + return true; + } + } + }); + } + // Purpur end + @Override public void tick() { super.tick(); @@ -98,6 +143,7 @@ public class LightningBolt extends Entity { } this.powerLightningRod(); + if (level().purpurConfig.lightningTransformsBlocks) this.transformBlocks(); // Purpur LightningBolt.clearCopperOnLightningStrike(this.level(), this.getStrikePosition(), this); // Paper - transmit LightningBolt instance to call EntityChangeBlockEvent this.gameEvent(GameEvent.LIGHTNING_STRIKE); } diff --git a/src/main/java/net/minecraft/world/level/block/SpongeBlock.java b/src/main/java/net/minecraft/world/level/block/SpongeBlock.java index 2276fed1feb4fea59b5bd49b5e4586d49478b3cc..bd1edc58a863673491a2935af4dc92996d1edb4c 100644 --- a/src/main/java/net/minecraft/world/level/block/SpongeBlock.java +++ b/src/main/java/net/minecraft/world/level/block/SpongeBlock.java @@ -47,8 +47,12 @@ public class SpongeBlock extends Block { } private boolean removeWaterBreadthFirstSearch(Level world, BlockPos pos) { - BlockStateListPopulator blockList = new BlockStateListPopulator(world); // CraftBukkit - Use BlockStateListPopulator - BlockPos.breadthFirstTraversal(pos, world.purpurConfig.spongeAbsorptionRadius, world.purpurConfig.spongeAbsorptionArea, (blockposition1, consumer) -> { // Purpur + // Purpur start + return removeBlocksBreadthFirstSearch(world, pos, world.purpurConfig.spongeAbsorptionRadius, world.purpurConfig.spongeAbsorptionArea, new BlockStateListPopulator(world), null); + } + public static boolean removeBlocksBreadthFirstSearch(Level world, BlockPos pos, int maxDepth, int maxIterations, BlockStateListPopulator blockList, @org.jetbrains.annotations.Nullable java.util.function.Predicate customCallback) { + BlockPos.breadthFirstTraversal(pos, maxDepth, maxIterations, (blockposition1, consumer) -> { // Purpur + // Purpur end Direction[] aenumdirection = SpongeBlock.ALL_DIRECTIONS; int i = aenumdirection.length; @@ -58,7 +62,7 @@ public class SpongeBlock extends Block { consumer.accept(blockposition1.relative(enumdirection)); } - }, (blockposition1) -> { + }, customCallback == null ? (blockposition1) -> { // Purpur if (blockposition1.equals(pos)) { return true; } else { @@ -102,17 +106,19 @@ public class SpongeBlock extends Block { return true; } } - }); + } : customCallback); // Purpur // CraftBukkit start List blocks = blockList.getList(); // Is a clone if (!blocks.isEmpty()) { final org.bukkit.block.Block bblock = world.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ()); + if (customCallback != null) { // Purpur - TODO: custom event that extends spongeabsorbevent?? or use a pre-existing block event? or leave it as is.. SpongeAbsorbEvent event = new SpongeAbsorbEvent(bblock, (List) (List) blocks); world.getCraftServer().getPluginManager().callEvent(event); if (event.isCancelled()) { return false; + } // Purpur } for (CraftBlockState block : blocks) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java index 078102e636803f38facc049952813ff2f8b63594..36ec3a3d830aab562bfe9e8d657fa3232360f0cb 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -145,6 +145,13 @@ public class PurpurWorldConfig { public boolean rainStopsAfterSleep = true; public boolean thunderStopsAfterSleep = true; public int mobLastHurtByPlayerTime = 100; + public boolean lightningTransformsBlocks = false; + public boolean lightningTurnsNearbySandIntoGlass = true; + public int lightningTurnsNearbySandIntoGlassMaxDepth = 3; + public int lightningTurnsNearbySandIntoGlassMaxIterations = 6; + public boolean lightningTurnsSandIntoGlass = true; + public boolean lightningTurnsWaterIntoStone = true; + public boolean lightningTurnsStoneIntoObsidian = true; private void miscGameplayMechanicsSettings() { useBetterMending = getBoolean("gameplay-mechanics.use-better-mending", useBetterMending); mendingMultiplier = getDouble("gameplay-mechanics.mending-multiplier", mendingMultiplier); @@ -173,6 +180,13 @@ public class PurpurWorldConfig { rainStopsAfterSleep = getBoolean("gameplay-mechanics.rain-stops-after-sleep", rainStopsAfterSleep); thunderStopsAfterSleep = getBoolean("gameplay-mechanics.thunder-stops-after-sleep", thunderStopsAfterSleep); mobLastHurtByPlayerTime = getInt("gameplay-mechanics.mob-last-hurt-by-player-time", mobLastHurtByPlayerTime); + lightningTransformsBlocks = getBoolean("gameplay-mechanics.lightning-transforms-blocks.enabled", lightningTransformsBlocks); + lightningTurnsNearbySandIntoGlass = getBoolean("gameplay-mechanics.lightning-transforms-blocks.nearby-sand-into-glass.enabled", lightningTurnsNearbySandIntoGlass); + lightningTurnsNearbySandIntoGlassMaxDepth = getInt("gameplay-mechanics.lightning-transforms-blocks.nearby-sand-into-glass.max-depth", lightningTurnsNearbySandIntoGlassMaxDepth); + lightningTurnsNearbySandIntoGlassMaxIterations = getInt("gameplay-mechanics.lightning-transforms-blocks.nearby-sand-into-glass.max-iteration", lightningTurnsNearbySandIntoGlassMaxIterations); + lightningTurnsSandIntoGlass = getBoolean("gameplay-mechanics.lightning-transforms-blocks.sand-into-glass", lightningTurnsSandIntoGlass); + lightningTurnsWaterIntoStone = getBoolean("gameplay-mechanics.lightning-transforms-blocks.water-into-stone", lightningTurnsWaterIntoStone); + lightningTurnsStoneIntoObsidian = getBoolean("gameplay-mechanics.lightning-transforms-blocks.stone-into-obsidian", lightningTurnsStoneIntoObsidian); } public int daytimeTicks = 12000;