package dk.thoerup.bukkit.hoeruputils.secretdoor; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.bukkit.block.Block; import org.bukkit.entity.Player; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockListener; import org.bukkit.event.block.BlockRedstoneEvent; import org.bukkit.event.block.SignChangeEvent; import org.bukkit.event.player.PlayerListener; import org.bukkit.plugin.Plugin; public class DoorBlockListener extends BlockListener { private DoorStorage store; private DoorOpenListener handler; private Plugin plugin; public DoorBlockListener(Plugin plugin) { this.plugin = plugin; store = new DoorStorage( plugin ); store.loadAll(); handler = new DoorOpenListener(store, plugin); } public PlayerListener getPlayerListener() { return handler; } @Override public void onBlockBreak(BlockBreakEvent event) { Door door = store.findDoor(event.getBlock().getLocation() ); if (door != null) { Player player = event.getPlayer(); if ( ! door.getOwner().equals( player.getName() )) { Player owner = player.getServer().getPlayer( door.getOwner() ); if (owner != null) { owner.sendMessage("" + player.getName() + " broke one of your secret doors"); } } player.sendMessage("Secret door broken"); store.removeDoor(door); } } private Block[] getAdjacentBlocks(Block block) { Block out[] = new Block[6]; out[0] = block.getRelative(-1,0,0); out[1] = block.getRelative(1,0,0); out[2] = block.getRelative(0,-1,0); out[3] = block.getRelative(0,1,0); out[4] = block.getRelative(0,0,-1); out[5] = block.getRelative(0,0,1); return out; } @Override public void onBlockRedstoneChange(BlockRedstoneEvent event) { //System.out.println( event.getBlock().toString() ); Block block = event.getBlock(); int x,y,z; Block blocks[] = getAdjacentBlocks(block); for (int i=0; i" + blocks[i].toString() ); Door d = store.findDoor( blocks[i].getLocation() ); if (d != null) { //System.out.println(" found door"); d.powerChange(block.getWorld(), event.getOldCurrent(), event.getNewCurrent() ); } } } @Override public void onSignChange(SignChangeEvent event) { Block sign = event.getBlock(); if (sign.getTypeId() == 63) { // don't react on floor signs return; } String line0 = event.getLine(0).trim().toLowerCase(); String line1 = event.getLine(1).trim().toLowerCase(); int width = 2; int height = 2; if (line0.equals("secretdoor") ) { if ( ! line1.equals("")) { Pattern p = Pattern.compile("^[0-9]x[0-9]$"); Matcher m = p.matcher(line1); if ( !m.matches() ) { event.getPlayer().sendMessage("The second line must be of the format [width]x[height]"); return; } String parts[] = line1.split("x"); width = Integer.parseInt( parts[0] ); height = Integer.parseInt( parts[1] ); if (width <1 || width>8) { event.getPlayer().sendMessage("width must be between 1 and 8 (inclusive)"); return; } if (height <2 || height>5) { event.getPlayer().sendMessage("height must be between 2 and 5 (inclusive)"); return; } } try { Door door = new Door(sign, width, height, store, event.getPlayer().getName() ); store.addDoor(door); event.getPlayer().sendMessage("Secret door created"); sign.setTypeId(0); } catch (ConflictingDoorException e) { event.getPlayer().sendMessage("Door conflicts whith another secretdoor"); } } } }