package dk.thoerup.bukkit.hoeruputils; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.Server; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; import org.bukkit.event.Listener; import org.bukkit.event.EventHandler; import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.event.player.PlayerPortalEvent; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockPlaceEvent; import java.util.ArrayList; import java.util.TreeSet; public class Jail implements CommandExecutor, Listener { Plugin plugin; TreeSet jailed = new TreeSet(); Location jailLocation; Location releaseLocation; final double maxDist = 25.0; public Jail(Plugin plugin) { this.plugin = plugin; jailLocation = new Location( plugin.getServer().getWorld("world"), 528.0, 68.0, 57); releaseLocation = new Location( plugin.getServer().getWorld("world"), 124.0, 68.0, 78); jailed.add("hoerup"); } @Override public boolean onCommand(final CommandSender sender, Command command, String label, String[] args) { if (! (sender instanceof Player) ) { sender.sendMessage("only use these commands in-game"); return true; } Player p = (Player) sender; if ( !p.isOp()) { p.sendMessage("Only server operators may use this command"); return true; } if (args.length == 0) { p.sendMessage("Usage: /jail "); return true; } if (args[0].equals("imprison")) { if (args.length != 2) { return true; } Player inmate = sender.getServer().getPlayer( args[1] ); if (inmate == null) { p.sendMessage("Player not found"); return true; } inmate.sendMessage("You have been imprisoned"); inmate.teleport( jailLocation ); jailed.add( inmate.getName() ); return true; } if (args[0].equals("release")) { if (args.length != 2) { return true; } Player inmate = sender.getServer().getPlayer( args[1] ); if (inmate == null) { p.sendMessage("Player not found"); return true; } jailed.remove( inmate.getName() ); inmate.sendMessage("You have been released from prison"); inmate.teleport( releaseLocation ); return true; } if (args[0].equals("list") ) { if (jailed.size() > 0) { StringBuffer sb = new StringBuffer(); for (String j : jailed ) { sb.append(", "); sb.append(j); } sender.sendMessage("Current inmates: " + sb.substring(2) ); } else { sender.sendMessage("There are currently no inmates"); } return true; } if (args[0].equals("tpjail")) { p.teleport(jailLocation); return true; } if (args[0].equals("tprelease")) { p.teleport(releaseLocation); return true; } sender.sendMessage( "Unknown command: " + args[0] ); return true; } @EventHandler public void onPlayerMove(PlayerMoveEvent event) { Player p = event.getPlayer(); if (jailed.contains(p.getName() )) { Location to = event.getTo(); double xDist = Math.abs( to.getX() - jailLocation.getX() ); double zDist = Math.abs( to.getZ() - jailLocation.getZ() ); if ( xDist > maxDist || zDist > maxDist) { //System.out.println("" + xDist + " / " + zDist ); event.setCancelled(true ); } } } @EventHandler public void onJoin(PlayerJoinEvent event) { Player p = event.getPlayer(); if (jailed.contains( p.getName() ) ) { p.teleport( jailLocation ); } } @EventHandler public void onBlockBreak(BlockBreakEvent event) { Player p = event.getPlayer(); if (jailed.contains( p.getName() ) ) { event.setCancelled( true ); } } @EventHandler public void onBlockPlace(BlockPlaceEvent event) { Player p = event.getPlayer(); if (jailed.contains( p.getName() ) ) { event.setCancelled( true ); } } @EventHandler public void onTeleport(PlayerTeleportEvent event) { Player p = event.getPlayer(); if (jailed.contains( p.getName() ) ) { //System.out.println( "Teleport: " + event.getCause().toString() ); Location from = event.getFrom(); Location to = event.getTo(); if ( from.getWorld() != to.getWorld() ) { p.sendMessage("You are jailed and may not teleport"); event.setCancelled(true ); return; } double xDist = Math.abs( to.getX() - jailLocation.getX() ); double zDist = Math.abs( to.getZ() - jailLocation.getZ() ); if ( xDist > maxDist || zDist > maxDist) { p.sendMessage("You are jailed and may not teleport"); event.setCancelled(true ); } } } @EventHandler public void onPortal(PlayerPortalEvent event) { Player p = event.getPlayer(); if (jailed.contains( p.getName() ) ) { p.sendMessage("You are jailed and may not use portals"); event.setCancelled( true ); } } }