package dk.thoerup.bukkit.hoeruputils; import java.util.HashMap; import java.util.Map; import org.bukkit.Effect; import org.bukkit.Location; import org.bukkit.Material; 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(); private PlayerHandler handler = new PlayerHandler(); Plugin plugin; public SecretDoor(Plugin plugin) { this.plugin = plugin; } 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); } } @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); event.getPlayer().sendMessage("Secret door created"); sign.setTypeId(0); } } class PlayerHandler extends PlayerListener { @Override public void onPlayerInteract(PlayerInteractEvent event) { final 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; } door.open( player.getWorld() ); player.playEffect( player.getLocation(), Effect.DOOR_TOGGLE, 0); Runnable doorCloser = new Runnable() { public void run() { door.close( player.getWorld() ); player.playEffect( player.getLocation(), 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 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 ); } } }