package dk.thoerup.bukkit.hoeruputils; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.Server; import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.OfflinePlayer; 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.player.PlayerRespawnEvent; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.configuration.file.YamlConfiguration; import java.io.File; import java.io.*; import java.util.ArrayList; import java.util.Set; import java.util.TreeSet; public class Jail implements CommandExecutor, Listener { HoerupUtilsPlugin plugin; TreeSet jailed = new TreeSet(); Location jailLocation; Location releaseLocation; final double maxDist = 25.0; public Jail(HoerupUtilsPlugin plugin) { this.plugin = plugin; load(); } public void load() { File configFile = new File(plugin.getDataFolder(), "jail.yml"); if (!configFile.exists() ) { System.out.println("[HoerupJail] jail.yml not found"); } YamlConfiguration config = new YamlConfiguration(); try { config.load(configFile); } catch (Exception e) { System.out.println("[HoerupJail] exception loading jails : " + e.getMessage() ); return; } jailLocation = loadLocation(config, plugin.getServer(), "jailloc"); releaseLocation = loadLocation(config, plugin.getServer(), "releaseloc"); Set tmpSet = (Set) config.get("jails"); jailed.addAll(tmpSet); } public void save() { File configFile = new File(plugin.getDataFolder(), "jail.yml"); YamlConfiguration config = new YamlConfiguration(); saveLocation(config, jailLocation, "jailloc"); saveLocation(config, jailLocation, "releaseloc"); config.set("jails", jailed); try { config.save(configFile); } catch (java.io.IOException e) { System.out.println("[HoerupJial] exception saving jails : " + e.getMessage() ); } } private static Location loadLocation(YamlConfiguration config, Server server, String prefix) { String world = config.getString( prefix + ".world"); double x = config.getDouble( prefix + ".x"); double y = config.getDouble( prefix + ".y"); double z = config.getDouble( prefix + ".z"); float pitch = (float) config.getDouble( prefix + ".pitch"); float yaw = (float) config.getDouble( prefix + ".yaw"); World w = server.getWorld(world); return new Location(w,x,y,z,yaw,pitch); } private static void saveLocation(YamlConfiguration config, Location location, String prefix) { if (location == null) return; config.set( prefix + ".world", location.getWorld().getName() ); config.set( prefix + ".x", location.getX() ); config.set( prefix + ".y", location.getY() ); config.set( prefix + ".z", location.getZ() ); config.set( prefix + ".pitch", location.getPitch() ); config.set( prefix + ".yaw", location.getYaw() ); } @Override public boolean onCommand(final CommandSender sender, Command command, String label, String[] args) { if (args.length == 0) { sender.sendMessage("Usage: /jail "); return true; } if (sender instanceof Player ) { Player p = (Player) sender; if ( p.isOp() || p.hasPermission("hoeruputils.jail") ) { //do nothing } else { p.sendMessage("Only server operators or players with hoeruputils.jail priv may use this command"); return true; } } else { if ( args[0].equals("imprison") || args[0].equals("release") || args[0].equals("list") ) { //do nothing } else { sender.sendMessage("only imprison, release and list may be used from console"); return true; } } if (args[0].equals("imprison")) { if (args.length != 2) { sender.sendMessage("You must specify the player"); return true; } OfflinePlayer inmate = sender.getServer().getOfflinePlayer( args[1] ); if (inmate.hasPlayedBefore() == false && inmate.isOnline() == false) { sender.sendMessage("Player not found"); return true; } if (inmate instanceof Player) { Player p = (Player) inmate; p.sendMessage("You have been imprisoned"); p.teleport( jailLocation ); } jailed.add( inmate.getName() ); save(); sender.sendMessage("player " + inmate.getName() + " is imprisoned"); return true; } if (args[0].equals("release")) { if (args.length != 2) { sender.sendMessage("You must specify the player"); return true; } OfflinePlayer inmate = sender.getServer().getOfflinePlayer( args[1] ); if (inmate.hasPlayedBefore() == false && inmate.isOnline() == false) { sender.sendMessage("Player not found"); return true; } jailed.remove( inmate.getName() ); if (inmate instanceof Player) { Player p = (Player) inmate; p.sendMessage("You have been released from jail"); p.teleport( releaseLocation ); } else { plugin.getMessageWrapper().sendMessage("Jail System", inmate, "You have been release from jail - you are free to go home"); } save(); sender.sendMessage("player " + inmate.getName() + " is released"); 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("setjail")) { Player p = (Player) sender; jailLocation = p.getLocation().clone(); p.sendMessage("New jail location has been set"); save(); return true; } if (args[0].equals("setrelease")) { Player p = (Player) sender; releaseLocation = p.getLocation().clone(); p.sendMessage("New release location has been set"); save(); return true; } if (args[0].equals("tpjail")) { Player p = (Player) sender; p.teleport(jailLocation); return true; } if (args[0].equals("tprelease")) { Player p = (Player) sender; 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 ); p.sendMessage("You are currently in jail and have been teleported to you cell"); } } @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 ); } } @EventHandler public void onRespawn(PlayerRespawnEvent event) { Player p = event.getPlayer(); if (jailed.contains( p.getName() ) ) { event.setRespawnLocation( jailLocation ); p.teleport( jailLocation ); } } }