From a233be1df85e8edf62cb829cb8a01dae6ffed43c Mon Sep 17 00:00:00 2001 From: wizjany Date: Fri, 15 Feb 2019 16:00:30 -0500 Subject: [PATCH] Sponge simulation now also clears waterlogged blocks. Fixes WORLDGUARD-4011. --- .../com/sk89q/worldguard/util/SpongeUtil.java | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/worldguard-core/src/main/java/com/sk89q/worldguard/util/SpongeUtil.java b/worldguard-core/src/main/java/com/sk89q/worldguard/util/SpongeUtil.java index c4a6dd51..cec3deb4 100644 --- a/worldguard-core/src/main/java/com/sk89q/worldguard/util/SpongeUtil.java +++ b/worldguard-core/src/main/java/com/sk89q/worldguard/util/SpongeUtil.java @@ -19,16 +19,23 @@ package com.sk89q.worldguard.util; +import com.google.common.collect.Maps; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.math.BlockVector3; +import com.sk89q.worldedit.registry.state.Property; import com.sk89q.worldedit.world.World; +import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockType; import com.sk89q.worldedit.world.block.BlockTypes; import com.sk89q.worldguard.WorldGuard; import com.sk89q.worldguard.config.WorldConfiguration; +import java.util.Map; + public final class SpongeUtil { + private static Map> waterloggable = Maps.newHashMap(); + private SpongeUtil() { } @@ -41,7 +48,7 @@ private static boolean isReplacable(BlockType blockType) { /** * Remove water around a sponge. * - * @param world The world the sponge isin + * @param world The world the sponge is in * @param ox The x coordinate of the 'sponge' block * @param oy The y coordinate of the 'sponge' block * @param oz The z coordinate of the 'sponge' block @@ -53,12 +60,25 @@ public static void clearSpongeWater(World world, int ox, int oy, int oz) { for (int cy = -wcfg.spongeRadius; cy <= wcfg.spongeRadius; cy++) { for (int cz = -wcfg.spongeRadius; cz <= wcfg.spongeRadius; cz++) { BlockVector3 vector = BlockVector3.at(ox + cx, oy + cy, oz + cz); - if (isReplacable(world.getBlock(vector).getBlockType())) { + BlockState block = world.getBlock(vector); + BlockType blockType = block.getBlockType(); + if (isReplacable(blockType)) { try { world.setBlock(vector, BlockTypes.AIR.getDefaultState()); } catch (WorldEditException e) { e.printStackTrace(); } + } else { + @SuppressWarnings("unchecked") + Property waterloggedProp = waterloggable.computeIfAbsent(blockType, + (bt -> (Property) bt.getPropertyMap().get("waterlogged"))); + if (waterloggedProp != null) { + try { + world.setBlock(vector, block.with(waterloggedProp, false)); + } catch (WorldEditException e) { + e.printStackTrace(); + } + } } } }