package dk.thoerup.bukkit.hoeruputils.secretdoor; import java.util.Set; 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.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.AsyncPlayerChatEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.plugin.Plugin; public class DoorOpenListener implements Listener{ private DoorStorage store; private Plugin plugin; public DoorOpenListener(DoorStorage store, Plugin plugin) { super(); this.store = store; this.plugin = plugin; } @EventHandler public void onPlayerInteract(PlayerInteractEvent event) { Player player = event.getPlayer(); if ( player.getInventory().getItemInMainHand().getType() != Material.AIR ) { return; } if ( event.hasBlock() == false ) { return; } final Door door = store.findDoor( event.getClickedBlock().getLocation() ); if (door == null) { return; } if (door.isPrivate() == true && !door.getOwner().equals(player.getName() ) ) { return; } openDoor(door, player,false ); } private void openDoor(final Door door, Player player, boolean longDelay ) { final World world = player.getWorld(); //final Location loc = event.getClickedBlock().getLocation(); final Location loc = door.getLeftUpper(); door.open(); world.playEffect( loc, Effect.DOOR_TOGGLE, 0); Runnable doorCloser = new Runnable() { public void run() { door.close( ); world.playEffect( loc, Effect.DOOR_TOGGLE, 0); } }; int delay = (longDelay == true) ? 8*20 : 4*20; player.getServer().getScheduler().scheduleSyncDelayedTask(plugin, doorCloser, delay); } @EventHandler public void onPlayerChat(AsyncPlayerChatEvent evt) { if (evt.isCancelled()) return; String parts[] = evt.getMessage().split(" "); if (parts.length == 1) { Runnable r = new DooOpenOnChat( evt ); r.run(); //plugin.getServer().getScheduler().runTask(plugin, r); //force sync handling of this } } class DooOpenOnChat implements Runnable { AsyncPlayerChatEvent evt; public DooOpenOnChat(AsyncPlayerChatEvent evt) { this.evt = evt; } @Override public void run() { Player p = evt.getPlayer(); Block target = p.getTargetBlock( (Set)null, 40); if (target == null || target.getType() == Material.AIR) { return; } final Door door = store.findDoor( target.getLocation() ); if (door == null) { return; } if (door.isPrivate() == true && !door.getOwner().equals(p.getName() ) ) { return; } if (door.getPassword().equals( evt.getMessage() )) { openDoor(door, p, true); evt.setCancelled(true); } } } }