From 4db6274dc38edacc79a58bbb4d0a5813c51f9b3a Mon Sep 17 00:00:00 2001 From: EpicKnarvik97 Date: Mon, 8 Nov 2021 01:34:18 +0100 Subject: [PATCH] Fixes underwater signs and buttons being replaced with AIR instead of water --- README.md | 1 + .../stargate/listener/BlockEventListener.java | 4 +- .../stargate/utility/PortalFileHelper.java | 43 +++++++++++++++++-- 3 files changed, 44 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 69727d4..5cbd010 100644 --- a/README.md +++ b/README.md @@ -389,6 +389,7 @@ bungeeSign=Teleport to - Adds another default gate to show that it's possible to use any number of materials for a stargate's border - Adds an option for stargates without a sign. Right-clicking such a stargate will display gate information - Fixes a bug causing signs to be re-drawn after they're broken +- Makes buttons and signs be replaced by water instead of air when underwater #### \[Version 0.9.0.5] EpicKnarvik97 fork diff --git a/src/main/java/net/knarcraft/stargate/listener/BlockEventListener.java b/src/main/java/net/knarcraft/stargate/listener/BlockEventListener.java index d61ed84..1fa29a8 100644 --- a/src/main/java/net/knarcraft/stargate/listener/BlockEventListener.java +++ b/src/main/java/net/knarcraft/stargate/listener/BlockEventListener.java @@ -10,6 +10,7 @@ import net.knarcraft.stargate.portal.PortalRegistry; import net.knarcraft.stargate.utility.EconomyHelper; import net.knarcraft.stargate.utility.MaterialHelper; import net.knarcraft.stargate.utility.PermissionHelper; +import net.knarcraft.stargate.utility.PortalFileHelper; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.data.type.WallSign; @@ -84,7 +85,8 @@ public class BlockEventListener implements Listener { //Remove the sign if the no sign option is enabled if (portal.getOptions().hasNoSign()) { - BlockChangeRequest request = new BlockChangeRequest(portal.getSignLocation(), Material.AIR, null); + Material replaceMaterial = PortalFileHelper.decideRemovalMaterial(portal.getSignLocation(), portal); + BlockChangeRequest request = new BlockChangeRequest(portal.getSignLocation(), replaceMaterial, null); Stargate.addBlockChangeRequest(request); } diff --git a/src/main/java/net/knarcraft/stargate/utility/PortalFileHelper.java b/src/main/java/net/knarcraft/stargate/utility/PortalFileHelper.java index 73d933b..088a5a1 100644 --- a/src/main/java/net/knarcraft/stargate/utility/PortalFileHelper.java +++ b/src/main/java/net/knarcraft/stargate/utility/PortalFileHelper.java @@ -13,11 +13,13 @@ import net.knarcraft.stargate.portal.property.PortalOwner; import net.knarcraft.stargate.portal.property.gate.Gate; import net.knarcraft.stargate.portal.property.gate.GateHandler; import org.bukkit.Bukkit; +import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.World; import org.bukkit.block.BlockFace; import org.bukkit.block.data.BlockData; import org.bukkit.block.data.Directional; +import org.bukkit.block.data.Waterlogged; import java.io.BufferedWriter; import java.io.File; @@ -292,9 +294,10 @@ public final class PortalFileHelper { BlockLocation buttonLocation = getButtonLocation(portal); BlockData buttonData = buttonLocation.getBlock().getBlockData(); if (portal.getOptions().isAlwaysOn()) { - //Clear button if not already air - if (buttonData.getMaterial() != Material.AIR) { - Stargate.addBlockChangeRequest(new BlockChangeRequest(buttonLocation, Material.AIR, null)); + //Clear button if not already air or water + if (buttonData.getMaterial() != Material.AIR && buttonData.getMaterial() != Material.WATER) { + Material newMaterial = decideRemovalMaterial(buttonLocation, portal); + Stargate.addBlockChangeRequest(new BlockChangeRequest(buttonLocation, newMaterial, null)); } } else { //Replace button if the material does not match @@ -304,6 +307,40 @@ public final class PortalFileHelper { } } + /** + * Decides the material to use for removing a portal's button/sign + * + * @param location

The location of the button/sign to replace

+ * @param portal

The portal the button/sign belongs to

+ * @return

The material to use for removing the button/sign

+ */ + public static Material decideRemovalMaterial(BlockLocation location, Portal portal) { + //Get the blocks to each side of the location + Location leftLocation = location.getRelativeLocation(-1, 0, 0, portal.getYaw()); + Location rightLocation = location.getRelativeLocation(1, 0, 0, portal.getYaw()); + + //If the block is water or is waterlogged, assume the portal is underwater + if (isUnderwater(leftLocation) || isUnderwater(rightLocation)) { + return Material.WATER; + } else { + return Material.AIR; + } + } + + /** + * Checks whether the given location is underwater + * + *

If the location has a water block, or a block which is waterlogged, it will be considered underwater.

+ * + * @param location

The location to check

+ * @return

True if the location is underwater

+ */ + private static boolean isUnderwater(Location location) { + BlockData blockData = location.getBlock().getBlockData(); + return blockData.getMaterial() == Material.WATER || + (blockData instanceof Waterlogged waterlogged && waterlogged.isWaterlogged()); + } + /** * Updates the button vector for the given portal *