package dk.thoerup.bukkit.hoeruputils; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; import java.util.HashMap; import java.util.LinkedList; import java.util.Map; import org.bukkit.Effect; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.Server; import org.bukkit.World; 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.SignChangeEvent; import org.bukkit.event.player.PlayerListener; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.plugin.Plugin; public class SecretDoor extends BlockListener { HashMap doormap = new HashMap(); LinkedList doors = new LinkedList(); private PlayerHandler handler = new PlayerHandler(); Plugin plugin; public SecretDoor(Plugin plugin) { this.plugin = plugin; loadAll(); } public PlayerListener getPlayerListener() { return handler; } @Override public void onBlockBreak(BlockBreakEvent event) { Door door = doormap.get( event.getBlock().getLocation() ); if (door != null) { event.getPlayer().sendMessage("Secret door broken"); door.unregisterMap(doormap); doors.remove(door); saveAll(); } } @Override public void onSignChange(SignChangeEvent event) { Block sign = event.getBlock(); World world = sign.getWorld(); if (sign.getTypeId() == 63) { // don't react on floor signs return; } if (event.getLine(0).toLowerCase().equals("secretdoor") ) { Door door = new Door(sign); door.registerMap(doormap); doors.add(door); event.getPlayer().sendMessage("Secret door created"); sign.setTypeId(0); saveAll(); } } private void saveAll() { try { File f = new File( plugin.getDataFolder(), "secretdoors.csv"); RandomAccessFile out = new RandomAccessFile( f, "rw" ); out.setLength(0); for (Door door : doors) { out.writeBytes( door.toCsv() ); out.writeBytes( "\n"); } out.close(); } catch (IOException e) { System.out.println(e.getMessage() ); e.printStackTrace(); } } private void loadAll() { try { File f = new File( plugin.getDataFolder(), "secretdoors.csv"); RandomAccessFile in = new RandomAccessFile( f, "r" ); String line; while ( (line = in.readLine() ) != null ) { Door door = new Door(line, plugin.getServer() ); doors.add( door ); door.registerMap( doormap ); } in.close(); } catch (FileNotFoundException fnfe) { return; } catch (IOException e) { System.out.println(e.getMessage() ); e.printStackTrace(); } } class PlayerHandler extends PlayerListener { @Override public void onPlayerInteract(PlayerInteractEvent event) { Player player = event.getPlayer(); if ( player.getItemInHand().getType() != Material.AIR ) { return; } if ( event.hasBlock() == false ) { return; } final Door door = doormap.get( event.getClickedBlock().getLocation() ); if (door == null) { return; } final World world = player.getWorld(); final Location loc = event.getClickedBlock().getLocation(); door.open( player.getWorld() ); world.playEffect( loc, Effect.DOOR_TOGGLE, 0); Runnable doorCloser = new Runnable() { public void run() { door.close( world ); world.playEffect( loc, Effect.DOOR_TOGGLE, 0); } }; player.getServer().getScheduler().scheduleSyncDelayedTask(plugin, doorCloser, 4*20); } } class Door { Location leftUpper; Location rightUpper; Location leftLower; Location rightLower; int material; public Door(Block sign) { leftUpper = sign.getLocation().clone(); rightUpper = sign.getLocation().clone(); switch ( sign.getData() ) { case 2: //facing east leftUpper.setZ( leftUpper.getZ() + 1 ); rightUpper.setZ( rightUpper.getZ() + 1 ); rightUpper.setX( rightUpper.getX() - 1 ); break; case 3: //facing west leftUpper.setZ( leftUpper.getZ() - 1 ); rightUpper.setZ( rightUpper.getZ() - 1 ); rightUpper.setX( rightUpper.getX() + 1 ); break; case 4: //facing north leftUpper.setX( leftUpper.getX() + 1); rightUpper.setX( rightUpper.getX() + 1); rightUpper.setZ( rightUpper.getZ() + 1); break; case 5: //facing south leftUpper.setX( leftUpper.getX() - 1); rightUpper.setX( rightUpper.getX() - 1); rightUpper.setZ( rightUpper.getZ() - 1); break; } material = sign.getWorld().getBlockAt( leftUpper ).getTypeId(); leftLower = leftUpper.clone(); rightLower = rightUpper.clone(); leftLower.setY( leftLower.getY() - 1); rightLower.setY( rightLower.getY() - 1); } public Door(String input, Server server) { String parts[] = input.split(":"); World w = server.getWorld( parts[0] ); leftUpper = new Location(w, Integer.parseInt(parts[1]), Integer.parseInt(parts[2]), Integer.parseInt(parts[3]) ); rightUpper = new Location(w, Integer.parseInt(parts[4]), Integer.parseInt(parts[5]), Integer.parseInt(parts[6]) ); leftLower = new Location(w, Integer.parseInt(parts[7]), Integer.parseInt(parts[8]), Integer.parseInt(parts[9]) ); rightLower = new Location(w, Integer.parseInt(parts[10]), Integer.parseInt(parts[11]), Integer.parseInt(parts[12]) ); material = Integer.parseInt( parts[13] ); } public String toCsv() { StringBuilder sb = new StringBuilder(); sb.append( leftUpper.getWorld().getName() ); sb.append( ":" + leftUpper.getBlockX() ); sb.append( ":" + leftUpper.getBlockY() ); sb.append( ":" + leftUpper.getBlockZ() ); sb.append( ":" + rightUpper.getBlockX() ); sb.append( ":" + rightUpper.getBlockY() ); sb.append( ":" + rightUpper.getBlockZ() ); sb.append( ":" + leftLower.getBlockX() ); sb.append( ":" + leftLower.getBlockY() ); sb.append( ":" + leftLower.getBlockZ() ); sb.append( ":" + rightLower.getBlockX() ); sb.append( ":" + rightLower.getBlockY() ); sb.append( ":" + rightLower.getBlockZ() ); sb.append( ":" + material ); return sb.toString(); } public void registerMap(Map map) { map.put(leftUpper, this ); map.put(rightUpper, this ); map.put(leftLower, this ); map.put(rightLower, this ); } public void unregisterMap(Map map) { map.remove(leftUpper); map.remove(rightUpper); map.remove(leftLower); map.remove(rightLower); } public void open(World world) { world.getBlockAt( leftUpper ).setTypeId( 0 ); world.getBlockAt( rightUpper ).setTypeId( 0 ); world.getBlockAt( leftLower ).setTypeId( 0 ); world.getBlockAt( rightLower ).setTypeId( 0 ); } public void close(World world) { world.getBlockAt( leftUpper ).setTypeId( material ); world.getBlockAt( rightUpper ).setTypeId( material ); world.getBlockAt( leftLower ).setTypeId( material ); world.getBlockAt( rightLower ).setTypeId( material ); } } }