package dk.thoerup.bukkit.hoeruputils; import java.util.HashSet; import java.util.Set; import java.util.Random; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.event.block.BlockDamageEvent; import org.bukkit.event.block.BlockListener; import org.bukkit.event.player.PlayerListener; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.inventory.ItemStack; public class PowerMiner extends BlockListener implements CommandExecutor { Random rand = new Random(); Set miners = new HashSet(); @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { if (!sender.isOp()) { sender.sendMessage("Only ops can use powerminer"); return false; } if (! (sender instanceof Player) ) { sender.sendMessage("Only in-game players can use powerminer"); return false; } Player p = (Player) sender; if (miners.contains(p.getName())) { miners.remove( p.getName() ); p.sendMessage("PowerMiner disabled"); } else { miners.add( p.getName() ); p.sendMessage("PowerMiner enabled - go dig some tunnels (with a feather)"); } return true; } protected ItemStack getDropItems(Block b) { switch (b.getTypeId()) { case 1: //stone drops cobblestone return new ItemStack(4,1); case 2: case 3: return null; //instabreak already drops dirt case 12: return null; //instabreak drops sand case 13: return null; //don't drop gravel case 16: //coal ore drops coal return new ItemStack(263,1); case 17: return null; //instabreak drops wood case 18: return (rand.nextInt(16) == 0) ? new ItemStack(6,1,(short)0, b.getData() ) : null; //leaves has 6.25% chance of dropping sapplings case 21: //lapis lazuli int count = rand.nextInt(5) + 4; return new ItemStack(351,count,(short)0, (byte)4); case 27: case 28: return null; //instabreak drops powered and detector rails case 54: return null; //instabreak drops chests case 56: //diamond ore drops diamond return new ItemStack(264,1); case 58: return null; //instabreak drops craft tables case 64: //instabreak drops wooden doors case 66: return null; //instabreak drops rails case 71: //instabreak drops iron doors return null; case 73: case 74: return new ItemStack(331,4); //redstone ore (both glowing and non-glowing) drops 4 redstone case 82: return null; //instabreak drops clay from clayblock case 88: return null; //instabreak drops soul sand default: return new ItemStack(b.getTypeId(), 1,(short)0, b.getData()); } } public void onBlockDamage(BlockDamageEvent event) { Player p = event.getPlayer(); if (! p.isOp() ) return; if (p.getItemInHand().getType() == Material.FEATHER) { if ( miners.contains(p.getName()) ) { Block b = event.getBlock(); if (b.getTypeId() == 7) //don't remove bedrock return; if (b.getTypeId() == 90) //don't break portal return; event.setInstaBreak(true); ItemStack items = getDropItems(b); if (items != null) { b.getWorld().dropItemNaturally(b.getLocation(), items); } } } } public PlayerQuitListener getPlayerQuitListener() { return new PlayerQuitListener(); } public class PlayerQuitListener extends PlayerListener { @Override public void onPlayerQuit(PlayerQuitEvent event) { Player p = event.getPlayer(); if (miners.contains(p.getName())) { miners.remove( p.getName() ); } } } }