diff --git a/src/main/java/net/licks92/WirelessRedstone/Configuration/NewWirelessConfiguration.java b/src/main/java/net/licks92/WirelessRedstone/Configuration/NewWirelessConfiguration.java index 61ac8f31..3865df16 100644 --- a/src/main/java/net/licks92/WirelessRedstone/Configuration/NewWirelessConfiguration.java +++ b/src/main/java/net/licks92/WirelessRedstone/Configuration/NewWirelessConfiguration.java @@ -91,6 +91,11 @@ public int getChunkUnloadRange() return getConfig().getInt("cancelChunkUnloadRange", 4); } + public boolean getSignDrop() + { + return getConfig().getBoolean("DropSignWhenBroken", true); + } + public boolean getDebugMode() { return getConfig().getBoolean("DebugMode", false); diff --git a/src/main/java/net/licks92/WirelessRedstone/Listeners/WirelessBlockListener.java b/src/main/java/net/licks92/WirelessRedstone/Listeners/WirelessBlockListener.java index 6ff48957..d0380a3d 100644 --- a/src/main/java/net/licks92/WirelessRedstone/Listeners/WirelessBlockListener.java +++ b/src/main/java/net/licks92/WirelessRedstone/Listeners/WirelessBlockListener.java @@ -1,10 +1,13 @@ package net.licks92.WirelessRedstone.Listeners; +import org.bukkit.Bukkit; import org.bukkit.ChatColor; +import org.bukkit.Effect; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.Sign; +import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.block.BlockBreakEvent; @@ -283,6 +286,10 @@ public void onBlockBreak(BlockBreakEvent event) Sign signObject = (Sign) event.getBlock().getState(); if (plugin.WireBox.isReceiver(signObject.getLine(0))) { + if(!WirelessRedstone.config.getSignDrop()) + { + cancelEvent(event); + } if (plugin.WireBox.hasAccessToChannel(event.getPlayer(),signObject.getLine(1)) && plugin.permissions.canRemoveReceiver(event.getPlayer())) { @@ -315,6 +322,10 @@ public void onBlockBreak(BlockBreakEvent event) } else if (plugin.WireBox.isTransmitter(signObject.getLine(0))) { + if(!WirelessRedstone.config.getSignDrop()) + { + cancelEvent(event); + } if (plugin.WireBox.hasAccessToChannel(event.getPlayer(),signObject.getLine(1)) && plugin.permissions.canRemoveTransmitter(event.getPlayer())) { @@ -376,6 +387,10 @@ else if (plugin.WireBox.getChannel(signObject.getLine(1)).getTransmitters().size } else if(plugin.WireBox.isScreen(signObject.getLine(0))) { + if(!WirelessRedstone.config.getSignDrop()) + { + cancelEvent(event); + } if (plugin.WireBox.hasAccessToChannel(event.getPlayer(),signObject.getLine(1)) && plugin.permissions.canRemoveScreen(event.getPlayer())) { @@ -427,4 +442,45 @@ public void onBlockFromTo(BlockFromToEvent event) } } } + + private void cancelEvent(BlockBreakEvent event) + { + /* + * Methods cancelEvent and sendBlockBreakParticles, taken from http://www.bukkit.fr/index.php?threads/enlever-le-drop-dun-block.850/page-2#post-11582 + * All credits to richie3366. + */ + + event.setCancelled(true); + + ItemStack is = event.getPlayer().getItemInHand(); + + if(is.getType().getMaxDurability() > 0){ + is.setDurability((short) (is.getDurability() + 1)); + + if(is.getDurability() >= is.getType().getMaxDurability()){ + event.getPlayer().setItemInHand(null); + } + } + + Block b = event.getBlock(); + + int lastType = b.getTypeId(); + + b.setType(Material.AIR); + + sendBlockBreakParticles(b, lastType, event.getPlayer()); + } + + private void sendBlockBreakParticles(Block b, int lastType, Player author) + { + int radius = 64; + radius *= radius; + + for (Player player : b.getWorld().getPlayers()) { + int distance = (int)player.getLocation().distanceSquared(b.getLocation()); + if (distance <= radius && !player.equals(author)){ + player.playEffect(b.getLocation(), Effect.STEP_SOUND, lastType); + } + } + } } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index f6213789..19b47d83 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -13,4 +13,7 @@ cancelChunkUnloadRange: 4 UseVault: true #Debug Mode, don't activate it if you're not a tester or a developper -DebugMode: false \ No newline at end of file +DebugMode: false + +#This value can be set to false, because some people can create signs with a command and destroy them to get free signs. +DropSignWhenBroken: true \ No newline at end of file