--- miscJava/bukkit-minecraft-plugins/HoerupUtils/src/dk/thoerup/bukkit/hoeruputils/secretdoor/DoorOpenListener.java 2011/06/27 18:10:05 1532 +++ miscJava/bukkit-minecraft-plugins/HoerupUtils/src/main/java/dk/thoerup/bukkit/hoeruputils/secretdoor/DoorOpenListener.java 2016/11/18 13:14:07 3133 @@ -1,21 +1,28 @@ package dk.thoerup.bukkit.hoeruputils.secretdoor; +import java.util.Set; +import java.util.HashSet; + 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.event.player.PlayerListener; import org.bukkit.plugin.Plugin; -public class DoorOpenListener extends PlayerListener{ + +public class DoorOpenListener implements Listener{ - DoorStorage store; + private DoorStorage store; - Plugin plugin; + private Plugin plugin; public DoorOpenListener(DoorStorage store, Plugin plugin) { super(); @@ -23,12 +30,12 @@ this.plugin = plugin; } - @Override + @EventHandler public void onPlayerInteract(PlayerInteractEvent event) { Player player = event.getPlayer(); - if ( player.getItemInHand().getType() != Material.AIR ) { + if ( player.getInventory().getItemInMainHand().getType() != Material.AIR ) { return; } @@ -42,21 +49,82 @@ return; } - final World world = player.getWorld(); - final Location loc = event.getClickedBlock().getLocation(); + if (door.isPrivate() == true && !door.getOwner().equals(player.getName() ) ) { + return; + } + + openDoor(door, player,false ); - door.open( player.getWorld() ); + } + + 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 ); + 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; - player.getServer().getScheduler().scheduleSyncDelayedTask(plugin, doorCloser, 4*20); + 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); + } + } } }