/** Delete prisoner from the database. No teleporting is involved. */ public void delete() { SetBeingReleased(true); JailCell cell = getCell(); InputOutput.DeletePrisoner(this); Jail.prisoners.remove(getName()); if (cell != null) { for (Sign sign : cell.getSigns()) { sign.setLine(0, ""); sign.setLine(1, ""); sign.setLine(2, ""); sign.setLine(3, ""); sign.update(); } if (cell.getChest() != null) cell.getChest().getInventory().clear(); cell.setPlayerName(""); } for (LivingEntity e : guards) { e.remove(); Jail.guards.remove(e); } if (getJail() != null && jail.getSettings().getBoolean(Setting.EnableChangingPermissions) && jail.getSettings().getBoolean(Setting.RestorePermissionsToEscapedPrisoners)) { Util.setPermissionsGroups( getName(), getOldPermissions(), jail.getTeleportLocation().getWorld().getName()); } }
/** Update text of the sign that belongs to prisoner's cell if he have one. */ public void updateSign() { if (cell != null) { for (Sign sign : cell.getSigns()) { String set = getJail().getSettings().getString(Setting.SignText); set = set.replaceAll("\\&([0-9abcdef])", "§$1"); String[] lines = set.split("\\[NEWLINE\\]"); int max = lines.length; if (max > 4) max = 4; for (int i = 0; i < max; i++) { sign.setLine(i, parseTags(lines[i])); } sign.update(); } } }
/** * Performs transfer of specified JailPrisoner. If you just want to transfer someone, I recommend * using prisoner.transfer, because it supports offline transfer and it's easier to do. * * @param prisoner Prisoner that will be transfered * @param player Player that will be teleported */ public static void Transfer(JailPrisoner prisoner, Player player) { if (prisoner.getTransferDestination() == "find nearest") prisoner.setTransferDestination( JailZoneManager.findNearestJail(player.getLocation(), prisoner.getJail().getName()) .getName()); if (prisoner.getCell() != null) { Inventory inventory = player.getInventory(); JailCell cell = prisoner.getCell(); cell.setPlayerName(""); for (Sign sign : cell.getSigns()) { sign.setLine(0, ""); sign.setLine(1, ""); sign.setLine(2, ""); sign.setLine(3, ""); sign.update(); } if (cell.getChest() != null) { for (ItemStack i : cell.getChest().getInventory().getContents()) { if (i == null || i.getType() == Material.AIR) continue; inventory.addItem(i); } cell.getChest().getInventory().clear(); } if (cell.getSecondChest() != null) { for (ItemStack i : cell.getSecondChest().getInventory().getContents()) { if (i == null || i.getType() == Material.AIR) continue; inventory.addItem(i); } cell.getSecondChest().getInventory().clear(); } prisoner.setCell(null); } prisoner.SetBeingReleased(true); String targetJail = prisoner.getTransferDestination(); if (targetJail.contains(":")) { prisoner.setRequestedCell(targetJail.split(":")[1]); targetJail = targetJail.split(":")[0]; } JailZone jail = Jail.zones.get(targetJail); prisoner.setJail(jail); prisoner.setTransferDestination(""); prisoner.setOfflinePending(false); Util.Message(jail.getSettings().getString(Setting.MessageTransfer), player); Jail.prisoners.put(prisoner.getName(), prisoner); JailCell cell = jail.getRequestedCell(prisoner); if (cell == null || (cell.getPlayerName() != null && !cell.getPlayerName().equals("") && !cell.getPlayerName().equals(prisoner.getName()))) { cell = null; cell = jail.getEmptyCell(); } if (cell != null) { cell.setPlayerName(player.getName()); prisoner.setCell(cell); player.teleport(prisoner.getTeleportLocation()); prisoner.updateSign(); if (jail.getSettings().getBoolean(Setting.StoreInventory) && cell.getChest() != null) { Chest chest = cell.getChest(); chest.getInventory().clear(); for (int i = 0; i < 40; i++) { if (chest.getInventory().getSize() <= Util.getNumberOfOccupiedItemSlots(chest.getInventory().getContents())) break; if (player.getInventory().getItem(i) == null || player.getInventory().getItem(i).getType() == Material.AIR) continue; chest.getInventory().addItem(player.getInventory().getItem(i)); player.getInventory().clear(i); } if (cell.getSecondChest() != null) { chest = cell.getSecondChest(); chest.getInventory().clear(); for (int i = 0; i < 40; i++) { if (chest.getInventory().getSize() <= Util.getNumberOfOccupiedItemSlots(chest.getInventory().getContents())) break; if (player.getInventory().getItem(i) == null || player.getInventory().getItem(i).getType() == Material.AIR) continue; chest.getInventory().addItem(player.getInventory().getItem(i)); player.getInventory().clear(i); } } } cell.update(); } else { player.teleport(prisoner.getTeleportLocation()); } if (jail.getSettings().getBoolean(Setting.StoreInventory)) { prisoner.storeInventory(player.getInventory()); player.getInventory().clear(); } prisoner.SetBeingReleased(false); InputOutput.UpdatePrisoner(prisoner); }
/** * Performs releasing of specified JailPrisoner. If you just want to release someone, I recommend * using prisoner.release, because it supports offline release and it's easier to do. * * @param prisoner prisoner that will be released * @param player Player that will be teleported */ public static void UnJail(JailPrisoner prisoner, Player player) { prisoner.SetBeingReleased(true); JailZone jail = prisoner.getJail(); Util.Message(jail.getSettings().getString(Setting.MessageUnJail), player); Util.changeSkin(player, ""); if (jail.getSettings().getBoolean(Setting.EnableChangingPermissions) && !jail.getSettings().getBoolean(Setting.RestorePermissionsToEscapedPrisoners)) { Util.setPermissionsGroups( player.getName(), prisoner.getOldPermissions(), jail.getTeleportLocation().getWorld().getName()); } player.setSleepingIgnored(false); JailCell cell = prisoner.getCell(); if (cell != null) { if (cell.getChest() != null) { Chest chest = cell.getChest(); for (int i = 0; i < chest.getInventory().getSize(); i++) { if (chest.getInventory().getItem(i) == null || chest.getInventory().getItem(i).getType() == Material.AIR) continue; if (player.getInventory().firstEmpty() == -1) player.getWorld().dropItem(player.getLocation(), chest.getInventory().getItem(i)); else player.getInventory().addItem(chest.getInventory().getItem(i)); } chest.getInventory().clear(); if (cell.getSecondChest() != null) { chest = cell.getSecondChest(); for (int i = 0; i < chest.getInventory().getSize(); i++) { if (chest.getInventory().getItem(i) == null || chest.getInventory().getItem(i).getType() == Material.AIR) continue; if (player.getInventory().firstEmpty() == -1) player.getWorld().dropItem(player.getLocation(), chest.getInventory().getItem(i)); else player.getInventory().addItem(chest.getInventory().getItem(i)); } chest.getInventory().clear(); } } for (Sign sign : cell.getSigns()) { sign.setLine(0, ""); sign.setLine(1, ""); sign.setLine(2, ""); sign.setLine(3, ""); sign.update(); } cell.setPlayerName(""); cell.update(); } if (jail.getSettings().getBoolean(Setting.TeleportPrisonerOnRelease)) player.teleport(prisoner.getReleaseTeleportLocation()); prisoner.restoreInventory(player); InputOutput.LogJail(prisoner, "unjail"); prisoner.delete(); for (Object o : jail.getSettings().getList(Setting.ExecutedCommandsOnRelease)) { String s = (String) o; CraftServer cs = (CraftServer) Jail.instance.getServer(); CommandSender coms = Jail.instance.getServer().getConsoleSender(); cs.dispatchCommand(coms, prisoner.parseTags(s)); } }