diff --git a/pom.xml b/pom.xml index f8f23e8..5e2548c 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ LWC LWC jar - 3.53 + 3.54 UTF-8 @@ -35,7 +35,7 @@ BOSEconomy 1.0 system - ${project.basedir}/lib/BOSEConomy.jar + ${project.basedir}/lib/BOSEconomy.jar com.earth2me.essentials @@ -157,4 +157,4 @@ - \ No newline at end of file + diff --git a/src/main/java/com/griefcraft/listeners/LWCBlockListener.java b/src/main/java/com/griefcraft/listeners/LWCBlockListener.java index 932c98d..570d500 100644 --- a/src/main/java/com/griefcraft/listeners/LWCBlockListener.java +++ b/src/main/java/com/griefcraft/listeners/LWCBlockListener.java @@ -15,21 +15,48 @@ import org.bukkit.block.BlockFace; import org.bukkit.block.BlockState; import org.bukkit.entity.Player; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockListener; -import org.bukkit.event.block.BlockPistonExtendEvent; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.block.BlockRedstoneEvent; -import org.bukkit.event.block.SignChangeEvent; +import org.bukkit.event.block.*; +import org.bukkit.material.Attachable; import org.bukkit.material.MaterialData; import org.bukkit.material.PistonBaseMaterial; +import java.util.*; + public class LWCBlockListener extends BlockListener { /** * The plugin instance */ private LWCPlugin plugin; + private Set attachmentsTopToCheck = new HashSet<>( + Arrays.asList( + Material.SAPLING, + Material.POWERED_RAIL, + Material.DETECTOR_RAIL, + Material.LONG_GRASS, + Material.DEAD_BUSH, + Material.YELLOW_FLOWER, + Material.RED_ROSE, + Material.BROWN_MUSHROOM, + Material.RED_MUSHROOM, + Material.TORCH, + Material.FIRE, + Material.REDSTONE_WIRE, + Material.SIGN_POST, + Material.WOODEN_DOOR, + Material.RAILS, + Material.LEVER, + Material.STONE_PLATE, + Material.IRON_DOOR_BLOCK, + Material.WOOD_PLATE, + Material.REDSTONE_TORCH_OFF, + Material.REDSTONE_TORCH_ON, + Material.SNOW, + Material.CACTUS, + Material.SUGAR_CANE_BLOCK, + Material.CAKE_BLOCK + ) + ); public LWCBlockListener(LWCPlugin plugin) { this.plugin = plugin; @@ -135,6 +162,47 @@ public void onBlockBreak(BlockBreakEvent event) { } } + @Override + public void onBlockPhysics(BlockPhysicsEvent event) { + if (event.isCancelled()) { + return; + } + + if (!LWC.ENABLED) { + return; + } + + if (event.getBlock().getType() != Material.SAND && event.getBlock().getType() != Material.GRAVEL) { + return; + } + + LWC lwc = plugin.getLWC(); + Block upNeighbor = event.getBlock().getRelative(BlockFace.UP); + if (attachmentsTopToCheck.contains(upNeighbor.getType()) && lwc.findProtection(upNeighbor) != null) { + event.setCancelled(true); + + return; + } + + List horizontals = Arrays.asList( + BlockFace.NORTH, + BlockFace.EAST, + BlockFace.SOUTH, + BlockFace.WEST + ); + for (BlockFace face: horizontals) { + Block neighbor = event.getBlock().getRelative(face); + if (neighbor.getState() != null && (neighbor.getState().getData() instanceof Attachable)) { + Attachable data = (Attachable) neighbor.getState().getData(); + if (data.getAttachedFace() == face.getOppositeFace() && lwc.findProtection(neighbor) != null) { + event.setCancelled(true); + + return; + } + } + } + } + @Override public void onBlockPistonExtend(BlockPistonExtendEvent event) { if (!LWC.ENABLED) { diff --git a/src/main/java/com/griefcraft/listeners/LWCPlayerListener.java b/src/main/java/com/griefcraft/listeners/LWCPlayerListener.java index 18f3e79..0dd5b84 100644 --- a/src/main/java/com/griefcraft/listeners/LWCPlayerListener.java +++ b/src/main/java/com/griefcraft/listeners/LWCPlayerListener.java @@ -12,6 +12,7 @@ import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; import org.bukkit.block.ContainerBlock; import org.bukkit.craftbukkit.CraftChunk; import org.bukkit.craftbukkit.CraftWorld; @@ -26,9 +27,21 @@ import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.inventory.ItemStack; +import java.util.Arrays; +import java.util.HashSet; import java.util.List; +import java.util.Set; public class LWCPlayerListener extends PlayerListener { + private final Set invalidPrivates = new HashSet<>(Arrays.asList( + Material.AIR, + Material.WATER, + Material.STATIONARY_WATER, + Material.LAVA, + Material.STATIONARY_LAVA, + Material.SNOW, + Material.FIRE + )); /** * The plugin instance @@ -76,15 +89,32 @@ public void onPlayerChat(PlayerChatEvent event) { @Override public void onPlayerInteract(PlayerInteractEvent event) { - if (event.getAction() != Action.LEFT_CLICK_BLOCK && event.getAction() != Action.RIGHT_CLICK_BLOCK) { + if (event.isCancelled()) { return; } + LWC lwc = plugin.getLWC(); + if (!LWC.ENABLED) { return; } - LWC lwc = plugin.getLWC(); + BlockFace face = event.getBlockFace(); + Block target = event.getClickedBlock(); + if (face != null) { + target = event.getClickedBlock().getRelative(face); + } + if (invalidPrivates.contains(target.getType())) { + Protection protection = lwc.findProtection(target); + if (protection != null) { + protection.remove(); + } + } + + if (event.getAction() != Action.LEFT_CLICK_BLOCK && event.getAction() != Action.RIGHT_CLICK_BLOCK) { + return; + } + Player player = event.getPlayer(); Block clickedBlock = event.getClickedBlock(); Location location = clickedBlock.getLocation(); diff --git a/src/main/java/com/griefcraft/lwc/LWCPlugin.java b/src/main/java/com/griefcraft/lwc/LWCPlugin.java index 126066d..84fc85c 100644 --- a/src/main/java/com/griefcraft/lwc/LWCPlugin.java +++ b/src/main/java/com/griefcraft/lwc/LWCPlugin.java @@ -399,6 +399,7 @@ private void registerEvents() { registerEvent(blockListener, Type.REDSTONE_CHANGE); registerEvent(blockListener, Type.SIGN_CHANGE); registerEvent(blockListener, Type.BLOCK_PISTON_EXTEND); + registerEvent(blockListener, Type.BLOCK_PHYSICS); /* Server events */ registerEvent(serverListener, Type.PLUGIN_DISABLE);