private void getDestination(int id, Player p) {
   // get the destination sign
   Sign s = getDestinationSign(id);
   if (s != null) {
     String line1 = s.getLine(1);
     String line2 = s.getLine(2);
     String line3 = s.getLine(3);
     if (line1.isEmpty() || line2.isEmpty() || line3.isEmpty()) {
       TARDISMessage.send(p, "JUNK_LINES");
       return;
     }
     World w = plugin.getServer().getWorld(line1);
     int x = TARDISNumberParsers.parseInt(line2);
     int z = TARDISNumberParsers.parseInt(line3);
     // load the chunk
     Chunk chunk = w.getChunkAt(x, z);
     while (!chunk.isLoaded()) {
       w.loadChunk(chunk);
     }
     int y = w.getHighestBlockYAt(x, z);
     Location d = new Location(w, x, y, z);
     // TODO check destination
     if (plugin.getPluginRespect().getRespect(d, new Parameters(p, FLAG.getNoMessageFlags()))) {
       while (!chunk.isLoaded()) {
         chunk.load();
       }
       d.setY(getActualHighestY(d));
       plugin.getGeneralKeeper().setJunkDestination(d);
     }
   }
 }
 public boolean exterminate(int id) {
   HashMap<String, Object> where = new HashMap<String, Object>();
   where.put("tardis_id", id);
   ResultSetTardis rs = new ResultSetTardis(plugin, where, "", false);
   try {
     if (rs.resultSet()) {
       String saveLoc = rs.getCurrent();
       Location bb_loc = plugin.utils.getLocationFromDB(saveLoc, 0F, 0F);
       String chunkLoc = rs.getChunk();
       String owner = rs.getOwner();
       TARDISConstants.SCHEMATIC schm = rs.getSchematic();
       TARDISConstants.COMPASS d = rs.getDirection();
       if (!rs.isHidden()) {
         // clear the torch
         //                    plugin.destroyPB.destroyPlatform(rs.getPlatform(), id);
         plugin.destroyPB.destroyPoliceBox(bb_loc, d, id, false, false, false, null);
       }
       String[] chunkworld = chunkLoc.split(":");
       World cw = plugin.getServer().getWorld(chunkworld[0]);
       int restore = getRestore(cw);
       if (!cw.getName().contains("TARDIS_WORLD_")) {
         plugin.destroyI.destroyInner(schm, id, cw, restore, owner);
       }
       cleanDatabase(id);
       cleanWorlds(cw, owner);
       return true;
     }
   } catch (Exception e) {
     plugin.console.sendMessage(plugin.pluginName + "TARDIS prune by id error: " + e);
   } finally {
     return false;
   }
 }
 /**
  * Retrieves an SQL ResultSet from the destinations table. This method builds an SQL query string
  * from the parameters supplied and then executes the query. Use the getters to retrieve the
  * results.
  *
  * @return true or false depending on whether any data matches the query
  */
 public boolean resultSet() {
   PreparedStatement statement = null;
   ResultSet rs = null;
   String wheres = "";
   if (where != null) {
     StringBuilder sbw = new StringBuilder();
     for (Map.Entry<String, Object> entry : where.entrySet()) {
       sbw.append(entry.getKey()).append(" = ? AND ");
     }
     wheres = " WHERE " + sbw.toString().substring(0, sbw.length() - 5);
   }
   String query = "SELECT * FROM next" + wheres;
   try {
     service.testConnection(connection);
     statement = connection.prepareStatement(query);
     if (where != null) {
       int s = 1;
       for (Map.Entry<String, Object> entry : where.entrySet()) {
         if (entry.getValue().getClass().equals(String.class)) {
           statement.setString(s, entry.getValue().toString());
         } else {
           statement.setInt(s, plugin.getUtils().parseInt(entry.getValue().toString()));
         }
         s++;
       }
       where.clear();
     }
     rs = statement.executeQuery();
     if (rs.isBeforeFirst()) {
       while (rs.next()) {
         this.next_id = rs.getInt("next_id");
         this.tardis_id = rs.getInt("tardis_id");
         this.world = plugin.getServer().getWorld(rs.getString("world"));
         this.x = rs.getInt("x");
         this.y = rs.getInt("y");
         this.z = rs.getInt("z");
         this.direction = COMPASS.valueOf(rs.getString("direction"));
         this.submarine = rs.getBoolean("submarine");
       }
     } else {
       return false;
     }
   } catch (SQLException e) {
     plugin.debug("ResultSet error for destinations table! " + e.getMessage());
     return false;
   } finally {
     try {
       if (rs != null) {
         rs.close();
       }
       if (statement != null) {
         statement.close();
       }
     } catch (SQLException e) {
       plugin.debug("Error closing destinations table! " + e.getMessage());
     }
   }
   return this.world != null;
 }
 public void doMalfunction(Location l) {
   HashMap<String, Object> where = new HashMap<String, Object>();
   where.put("tardis_id", id);
   ResultSetLamps rsl = new ResultSetLamps(plugin, where, true);
   List<Block> lamps = new ArrayList<Block>();
   if (rsl.resultSet()) {
     // flicker lights
     ArrayList<HashMap<String, String>> data = rsl.getData();
     for (HashMap<String, String> map : data) {
       Location loc = plugin.utils.getLocationFromDB(map.get("location"), 0.0F, 0.0F);
       lamps.add(loc.getBlock());
     }
     if (plugin.pm.isPluginEnabled("Citizens")
         && plugin.getConfig().getBoolean("allow.emergency_npc")) {
       // get player prefs
       HashMap<String, Object> wherep = new HashMap<String, Object>();
       wherep.put("player", p.getName());
       ResultSetPlayerPrefs rsp = new ResultSetPlayerPrefs(plugin, wherep);
       if (rsp.resultSet() && rsp.isEpsOn()) {
         // schedule the NPC to appear
         String message =
             "This is Emergency Programme One. Now listen, this is important. If this message is activated, then it can only mean one thing: we must be in danger, and I mean fatal. You're about to die any second with no chance of escape.";
         HashMap<String, Object> wherev = new HashMap<String, Object>();
         wherev.put("tardis_id", id);
         ResultSetTravellers rst = new ResultSetTravellers(plugin, wherev, true);
         List<String> players;
         if (rst.resultSet()) {
           players = rst.getData();
         } else {
           players = new ArrayList<String>();
           players.add(p.getName());
         }
         TARDISEPSRunnable EPS_runnable =
             new TARDISEPSRunnable(plugin, message, p, players, id, eps, creeper);
         plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, EPS_runnable, 220L);
       }
     }
     final long start = System.currentTimeMillis() + 10000;
     TARDISLampsRunnable runnable = new TARDISLampsRunnable(plugin, lamps, start);
     runnable.setHandbrake(handbrake_loc);
     int taskID =
         plugin.getServer().getScheduler().scheduleSyncRepeatingTask(plugin, runnable, 10L, 10L);
     runnable.setTask(taskID);
   }
 }
 public boolean build(Player p, int tips, int id) {
   if (!plugin.getConfig().getBoolean("allow.zero_room")) {
     TARDISMessage.send(p, "ZERO_DISABLED");
     return true;
   }
   TARDISInteriorPostioning tintpos = new TARDISInteriorPostioning(plugin);
   int slot = tips;
   if (tips == -1) {
     slot = tintpos.getFreeSlot();
     // uodate TARDIS table with new slot number
     QueryFactory qf = new QueryFactory(plugin);
     HashMap<String, Object> set = new HashMap<String, Object>();
     set.put("tips", slot);
     HashMap<String, Object> where = new HashMap<String, Object>();
     where.put("tardis_id", id);
     qf.doUpdate("tardis", set, where);
   }
   TARDISTIPSData pos = tintpos.getTIPSData(slot);
   int x = pos.getCentreX();
   int y = 64;
   int z = pos.getCentreZ();
   World w = plugin.getServer().getWorld("TARDIS_Zero_room");
   if (w == null) {
     TARDISMessage.send(p, "ZERO_NOT_FOUND");
     return true;
   }
   Location l = new Location(w, x, y, z);
   TARDISRoomBuilder builder = new TARDISRoomBuilder(plugin, "ZERO", l, COMPASS.SOUTH, p);
   if (builder.build()) {
     UUID uuid = p.getUniqueId();
     // ok, room growing was successful, so take their energy!
     int amount = plugin.getRoomsConfig().getInt("rooms.ZERO.cost");
     QueryFactory qf = new QueryFactory(plugin);
     HashMap<String, Object> set = new HashMap<String, Object>();
     set.put("uuid", p.getUniqueId().toString());
     qf.alterEnergyLevel("tardis", -amount, set, p);
     // remove blocks from condenser table if rooms_require_blocks is true
     if (plugin.getConfig().getBoolean("growth.rooms_require_blocks")) {
       TARDISCondenserData c_data = plugin.getGeneralKeeper().getRoomCondenserData().get(uuid);
       for (Map.Entry<String, Integer> entry : c_data.getBlockIDCount().entrySet()) {
         HashMap<String, Object> wherec = new HashMap<String, Object>();
         wherec.put("tardis_id", c_data.getTardis_id());
         wherec.put("block_data", entry.getKey());
         qf.alterCondenserBlockCount(entry.getValue(), wherec);
       }
       plugin.getGeneralKeeper().getRoomCondenserData().remove(uuid);
     }
     // are we doing an achievement?
     if (plugin.getAchievementConfig().getBoolean("rooms.enabled")) {
       TARDISAchievementFactory taf =
           new TARDISAchievementFactory(
               plugin, p, "rooms", plugin.getBuildKeeper().getSeeds().size());
       taf.doAchievement("ZERO");
     }
   }
   return true;
 }
 public void addPerms(String player) {
   BufferedReader bufRdr = null;
   try {
     bufRdr = new BufferedReader(new FileReader(permissionsFile));
     String line;
     // read each line of text file
     while ((line = bufRdr.readLine()) != null) {
       if (line.charAt(0) == '#') {
         group = line.substring(1).trim();
         permgroups.put(group, new ArrayList<String>());
       } else {
         List<String> perms = permgroups.get(group);
         perms.add(line.trim());
       }
     }
   } catch (IOException io) {
     plugin.debug("Could not read perms file. " + io.getMessage());
   } finally {
     if (bufRdr != null) {
       try {
         bufRdr.close();
       } catch (IOException e) {
         plugin.debug("Error closing perms reader! " + e.getMessage());
       }
     }
   }
   plugin.getServer().dispatchCommand(plugin.console, "world TARDIS_WORLD_" + player);
   int i = 0;
   for (Map.Entry<String, List<String>> entry : permgroups.entrySet()) {
     String grpstr = entry.getKey();
     List<String> perms = entry.getValue();
     plugin.getServer().dispatchCommand(plugin.console, "group " + grpstr);
     for (String p : perms) {
       plugin.getServer().dispatchCommand(plugin.console, "group addperm " + p);
     }
     if (i == 0) {
       plugin.getServer().dispatchCommand(plugin.console, "user " + player);
       plugin.getServer().dispatchCommand(plugin.console, "user setgroup " + grpstr);
     }
     i++;
   }
   plugin.getServer().dispatchCommand(plugin.console, "permissions save");
   plugin.getServer().dispatchCommand(plugin.console, "permissions reload");
 }
 @Override
 public void run() {
   TARDISRegulatorInventory reg = new TARDISRegulatorInventory();
   ItemStack[] items = reg.getRegulator();
   Inventory inv = plugin.getServer().createInventory(player, 54, "Helmic Regulator");
   inv.setContents(items);
   player.openInventory(inv);
   // play inflight sound
   TARDISSounds.playTARDISSound(player.getLocation(), player, "interior_flight");
 }
 private void asyncFetch(final ArrayList<String> names) {
   plugin
       .getServer()
       .getScheduler()
       .runTaskAsynchronously(
           plugin,
           new Runnable() {
             @Override
             public void run() {
               syncFetch(names);
             }
           });
 }
 /**
  * Closes the inventory.
  *
  * @param p the player using the GUI
  */
 private void close(final Player p) {
   plugin
       .getServer()
       .getScheduler()
       .scheduleSyncDelayedTask(
           plugin,
           new Runnable() {
             @Override
             public void run() {
               p.closeInventory();
             }
           },
           1L);
 }
 /**
  * A repeating task that checks if the charged creeper in the TARDIS Artron Energy Capacitor is
  * still there.
  */
 public void startCreeperCheck() {
   plugin
       .getServer()
       .getScheduler()
       .scheduleSyncRepeatingTask(
           plugin,
           new Runnable() {
             @Override
             public void run() {
               checkCreepers();
             }
           },
           600L,
           12000L);
 }
 public void addPerms(String player) {
   BufferedReader bufRdr = null;
   try {
     bufRdr = new BufferedReader(new FileReader(permissionsFile));
     String line;
     // read each line of text file
     while ((line = bufRdr.readLine()) != null) {
       if (line.charAt(0) == '#') {
         group = line.substring(1).trim();
         permgroups.put(group, new ArrayList<String>());
       } else {
         List<String> perms = permgroups.get(group);
         perms.add(line.trim());
       }
     }
   } catch (IOException io) {
     plugin.debug("Could not read perms file. " + io.getMessage());
   } finally {
     if (bufRdr != null) {
       try {
         bufRdr.close();
       } catch (IOException e) {
         plugin.debug("Error closing perms reader! " + e.getMessage());
       }
     }
   }
   // get the default world
   String w = plugin.getServer().getWorlds().get(0).getName();
   // pex world <world> inherit <parentWorld> - make the TARDIS world inherit the main worlds
   // permissions
   plugin
       .getServer()
       .dispatchCommand(
           plugin.getConsole(), "pex world " + "TARDIS_WORLD_" + player + " inherit " + w);
   plugin.getServer().dispatchCommand(plugin.getConsole(), "pex reload");
 }
 @EventHandler(ignoreCancelled = true)
 public void onAdminMenuClick(InventoryClickEvent event) {
   Inventory inv = event.getInventory();
   String name = inv.getTitle();
   if (name.equals("§4Admin Menu")) {
     event.setCancelled(true);
     int slot = event.getRawSlot();
     if (slot < 54) {
       String option = getDisplay(inv, slot);
       if (slot == 53 && option.equals("Player Preferences")) {
         final Player p = (Player) event.getWhoClicked();
         // close this gui and load the Player Prefs Menu
         plugin
             .getServer()
             .getScheduler()
             .scheduleSyncDelayedTask(
                 plugin,
                 new Runnable() {
                   @Override
                   public void run() {
                     Inventory ppm =
                         plugin.getServer().createInventory(p, 18, "§4Player Prefs Menu");
                     ppm.setContents(
                         new TARDISPrefsMenuInventory(plugin, p.getUniqueId()).getMenu());
                     p.openInventory(ppm);
                   }
                 },
                 1L);
         return;
       }
       if (!option.isEmpty()) {
         boolean bool = plugin.getConfig().getBoolean(option);
         plugin.getConfig().set(option, !bool);
         String lore = (bool) ? "false" : "true";
         setLore(inv, slot, lore);
         plugin.saveConfig();
       }
     }
   }
 }
 /** Checks the creeper is there and spawns in a new one if not. */
 private void checkCreepers() {
   ResultSetTardis rs = new ResultSetTardis(plugin, null, "", true);
   if (rs.resultSet()) {
     ArrayList<HashMap<String, String>> data = rs.getData();
     for (HashMap<String, String> map : data) {
       // only if there is a saved creeper location
       if (!map.get("creeper").isEmpty()) {
         // only if the TARDIS has been initialised
         if (map.get("tardis_init").equals("1")) {
           String[] creeperData = map.get("creeper").split(":");
           World w = plugin.getServer().getWorld(creeperData[0]);
           if (w != null) {
             float cx = 0, cy = 0, cz = 0;
             try {
               cx = plugin.utils.parseFloat(creeperData[1]);
               cy = plugin.utils.parseFloat(creeperData[2]) + 1;
               cz = plugin.utils.parseFloat(creeperData[3]);
             } catch (NumberFormatException nfe) {
               plugin.debug("Couldn't convert to a float! " + nfe.getMessage());
             }
             Location l = new Location(w, cx, cy, cz);
             plugin.myspawn = true;
             Entity e = w.spawnEntity(l, EntityType.CREEPER);
             // if there is a creeper there already get rid of it!
             for (Entity k : e.getNearbyEntities(1d, 1d, 1d)) {
               if (k.getType().equals(EntityType.CREEPER)) {
                 e.remove();
                 break;
               }
             }
             Creeper c = (Creeper) e;
             c.setPowered(true);
           }
         }
       }
     }
   }
 }
 private void cleanWorlds(World w, String owner) {
   // remove world guard region protection
   if (plugin.worldGuardOnServer && plugin.getConfig().getBoolean("use_worldguard")) {
     plugin.wgchk.removeRegion(w, owner);
   }
   // unload and remove the world if it's a TARDIS_WORLD_ world
   if (w.getName().contains("TARDIS_WORLD_")) {
     String name = w.getName();
     List<Player> players = w.getPlayers();
     Location spawn = plugin.getServer().getWorlds().get(0).getSpawnLocation();
     for (Player p : players) {
       p.sendMessage(
           plugin.pluginName + "World scheduled for deletion, teleporting you to spawn!");
       p.teleport(spawn);
     }
     if (plugin.pm.isPluginEnabled("Multiverse-Core")) {
       plugin.getServer().dispatchCommand(plugin.console, "mv remove " + name);
     }
     if (plugin.pm.isPluginEnabled("MultiWorld")) {
       plugin.getServer().dispatchCommand(plugin.console, "mw unload " + name);
       plugin.getServer().dispatchCommand(plugin.console, "mw delete " + name);
     }
     if (plugin.pm.isPluginEnabled("My Worlds")) {
       plugin.getServer().dispatchCommand(plugin.console, "myworlds unload " + name);
     }
     if (plugin.pm.isPluginEnabled("WorldBorder")) {
       // wb <world> clear
       plugin.getServer().dispatchCommand(plugin.console, "wb " + name + " clear");
     }
     plugin.getServer().unloadWorld(w, true);
     File world_folder =
         new File(plugin.getServer().getWorldContainer() + File.separator + name + File.separator);
     if (!deleteFolder(world_folder)) {
       plugin.debug("Could not delete world <" + name + ">");
     }
   }
 }
 public void clickButton() {
   HashMap<String, Object> wherep = new HashMap<String, Object>();
   wherep.put("tardis_id", id);
   HashMap<String, Object> setp = new HashMap<String, Object>();
   if (powered) {
     if (isTravelling(id)) {
       TARDISMessage.send(player, "POWER_NO");
       return;
     }
     TARDISSounds.playTARDISSound(loc, player, "power_down");
     // power down
     setp.put("powered_on", 0);
     TARDISMessage.send(player, "POWER_OFF");
     long delay = 0;
     // if hidden, rebuild
     if (hidden) {
       plugin
           .getServer()
           .dispatchCommand(plugin.getConsole(), "tardisremote " + player.getName() + " rebuild");
       TARDISMessage.send(player, "POWER_FAIL");
       delay = 20L;
     }
     // police box lamp, delay it incase the TARDIS needs rebuilding
     if (preset.equals(PRESET.NEW) || preset.equals(PRESET.OLD)) {
       plugin
           .getServer()
           .getScheduler()
           .scheduleSyncDelayedTask(
               plugin,
               new Runnable() {
                 @Override
                 public void run() {
                   new TARDISPoliceBoxLampToggler(plugin).toggleLamp(id, false);
                 }
               },
               delay);
     }
     // if lights are on, turn them off
     if (lights) {
       new TARDISLampToggler(plugin).flickSwitch(id, player.getUniqueId(), true, lanterns);
     }
     // if beacon is on turn it off
     new TARDISBeaconToggler(plugin).flickSwitch(player.getUniqueId(), false);
   } else {
     // don't power up if there is no power
     if (level <= plugin.getArtronConfig().getInt("standby")) {
       TARDISMessage.send(player, "POWER_LOW");
       return;
     }
     TARDISSounds.playTARDISSound(loc, player, "power_up");
     // power up
     setp.put("powered_on", 1);
     TARDISMessage.send(player, "POWER_ON");
     // if lights are off, turn them on
     if (lights) {
       new TARDISLampToggler(plugin).flickSwitch(id, player.getUniqueId(), false, lanterns);
     }
     // determine beacon prefs
     HashMap<String, Object> wherek = new HashMap<String, Object>();
     wherek.put("uuid", player.getUniqueId().toString());
     ResultSetPlayerPrefs rsp = new ResultSetPlayerPrefs(plugin, wherek);
     boolean beacon_on = true;
     if (rsp.resultSet()) {
       beacon_on = rsp.isBeaconOn();
     }
     // if beacon is off turn it on
     if (beacon_on) {
       new TARDISBeaconToggler(plugin).flickSwitch(player.getUniqueId(), true);
     }
     // police box lamp
     if (preset.equals(PRESET.NEW) || preset.equals(PRESET.OLD)) {
       new TARDISPoliceBoxLampToggler(plugin).toggleLamp(id, true);
     }
   }
   new QueryFactory(plugin).doUpdate("tardis", setp, wherep);
 }
 /**
  * Deletes a TARDIS.
  *
  * @param player running the command.
  * @param block the block that represents the Police Box sign
  * @return true or false depending on whether the TARIS could be deleted
  */
 public boolean exterminate(Player player, Block block) {
   int signx = 0, signz = 0;
   String playerNameStr = player.getName();
   Location sign_loc = block.getLocation();
   HashMap<String, Object> where = new HashMap<String, Object>();
   if (player.hasPermission("tardis.delete")) {
     Block blockbehind = null;
     byte data = block.getData();
     if (data == 4) {
       blockbehind = block.getRelative(BlockFace.EAST, 2);
     }
     if (data == 5) {
       blockbehind = block.getRelative(BlockFace.WEST, 2);
     }
     if (data == 3) {
       blockbehind = block.getRelative(BlockFace.NORTH, 2);
     }
     if (data == 2) {
       blockbehind = block.getRelative(BlockFace.SOUTH, 2);
     }
     if (blockbehind != null) {
       Block blockDown = blockbehind.getRelative(BlockFace.DOWN, 2);
       Location bd_loc = blockDown.getLocation();
       String bd_str =
           bd_loc.getWorld().getName()
               + ":"
               + bd_loc.getBlockX()
               + ":"
               + bd_loc.getBlockY()
               + ":"
               + bd_loc.getBlockZ();
       where.put("current", bd_str);
     } else {
       player.sendMessage(
           plugin.pluginName + ChatColor.RED + "Could not get TARDIS save location!");
       return false;
     }
   } else {
     where.put("owner", playerNameStr);
   }
   ResultSetTardis rs = new ResultSetTardis(plugin, where, "", false);
   if (rs.resultSet()) {
     int id = rs.getTardis_id();
     String saveLoc = rs.getCurrent();
     String chunkLoc = rs.getChunk();
     String owner = rs.getOwner();
     TARDISConstants.SCHEMATIC schm = rs.getSchematic();
     TARDISConstants.COMPASS d = rs.getDirection();
     // need to check that a player is not currently in the TARDIS
     if (player.hasPermission("tardis.delete")) {
       HashMap<String, Object> travid = new HashMap<String, Object>();
       travid.put("tardis_id", id);
       ResultSetTravellers rst = new ResultSetTravellers(plugin, travid, false);
       if (rst.resultSet()) {
         player.sendMessage(
             plugin.pluginName
                 + ChatColor.RED
                 + "You cannot delete this TARDIS as it is occupied!");
         return false;
       }
     }
     // check the sign location
     Location bb_loc = plugin.utils.getLocationFromDB(saveLoc, 0F, 0F);
     // get TARDIS direction
     switch (d) {
       case EAST:
         signx = -2;
         signz = 0;
         break;
       case SOUTH:
         signx = 0;
         signz = -2;
         break;
       case WEST:
         signx = 2;
         signz = 0;
         break;
       case NORTH:
         signx = 0;
         signz = 2;
         break;
     }
     int signy = -2;
     // if the sign was on the TARDIS destroy the TARDIS!
     if (sign_loc.getBlockX() == bb_loc.getBlockX() + signx
         && sign_loc.getBlockY() + signy == bb_loc.getBlockY()
         && sign_loc.getBlockZ() == bb_loc.getBlockZ() + signz) {
       if (!rs.isHidden()) {
         // remove Police Box
         plugin.destroyPB.destroyPoliceBox(bb_loc, d, id, false, false, false, null);
       }
       String[] chunkworld = chunkLoc.split(":");
       World cw = plugin.getServer().getWorld(chunkworld[0]);
       int restore = getRestore(cw);
       if (!cw.getName().contains("TARDIS_WORLD_")) {
         plugin.destroyI.destroyInner(schm, id, cw, restore, playerNameStr);
       }
       cleanDatabase(id);
       cleanWorlds(cw, owner);
       player.sendMessage(
           plugin.pluginName + "The TARDIS was removed from the world and database successfully.");
       return true;
     } else {
       // cancel the event because it's not the player's TARDIS
       player.sendMessage(TARDISConstants.NOT_OWNER);
       return false;
     }
   } else {
     player.sendMessage("Don't grief the TARDIS!");
     return false;
   }
 }
 @SuppressWarnings("deprecation")
 public boolean doRemoteComeHere(Player player, UUID uuid) {
   Location eyeLocation =
       player.getTargetBlock(plugin.getGeneralKeeper().getTransparent(), 50).getLocation();
   if (!plugin.getConfig().getBoolean("travel.include_default_world")
       && plugin.getConfig().getBoolean("creation.default_world")
       && eyeLocation
           .getWorld()
           .getName()
           .equals(plugin.getConfig().getString("creation.default_world_name"))) {
     TARDISMessage.send(player, "NO_WORLD_TRAVEL");
     return true;
   }
   if (!plugin
       .getPluginRespect()
       .getRespect(eyeLocation, new Parameters(player, FLAG.getDefaultFlags()))) {
     return true;
   }
   if (!plugin.getTardisArea().areaCheckInExisting(eyeLocation)) {
     TARDISMessage.send(
         player,
         "AREA_NO_COMEHERE",
         ChatColor.AQUA + "/tardisremote [player] travel area [area name]");
     return true;
   }
   Material m = player.getTargetBlock(plugin.getGeneralKeeper().getTransparent(), 50).getType();
   if (m != Material.SNOW) {
     int yplusone = eyeLocation.getBlockY();
     eyeLocation.setY(yplusone + 1);
   }
   // check the world is not excluded
   String world = eyeLocation.getWorld().getName();
   if (!plugin.getConfig().getBoolean("worlds." + world)) {
     TARDISMessage.send(player, "NO_PB_IN_WORLD");
     return true;
   }
   // check the remote player is a Time Lord
   HashMap<String, Object> where = new HashMap<String, Object>();
   where.put("uuid", uuid.toString());
   ResultSetTardis rs = new ResultSetTardis(plugin, where, "", false, 0);
   if (!rs.resultSet()) {
     TARDISMessage.send(player, "PLAYER_NO_TARDIS");
     return true;
   }
   Tardis tardis = rs.getTardis();
   final int id = tardis.getTardis_id();
   // check they are not in the tardis
   HashMap<String, Object> wherettrav = new HashMap<String, Object>();
   wherettrav.put("uuid", player.getUniqueId().toString());
   wherettrav.put("tardis_id", id);
   ResultSetTravellers rst = new ResultSetTravellers(plugin, wherettrav, false);
   if (rst.resultSet()) {
     TARDISMessage.send(player, "NO_PB_IN_TARDIS");
     return true;
   }
   if (plugin.getTrackerKeeper().getInVortex().contains(id)) {
     TARDISMessage.send(player, "NOT_WHILE_MAT");
     return true;
   }
   boolean chamtmp = false;
   if (plugin.getConfig().getBoolean("travel.chameleon")) {
     chamtmp = tardis.isChamele_on();
   }
   boolean hidden = tardis.isHidden();
   // get current police box location
   HashMap<String, Object> wherecl = new HashMap<String, Object>();
   wherecl.put("tardis_id", id);
   ResultSetCurrentLocation rsc = new ResultSetCurrentLocation(plugin, wherecl);
   if (!rsc.resultSet()) {
     hidden = true;
   }
   COMPASS d = rsc.getDirection();
   COMPASS player_d = COMPASS.valueOf(TARDISStaticUtils.getPlayersDirection(player, false));
   Biome biome = rsc.getBiome();
   TARDISTimeTravel tt = new TARDISTimeTravel(plugin);
   int count;
   boolean sub = false;
   Block b = eyeLocation.getBlock();
   if (b.getRelative(BlockFace.UP).getType().equals(Material.WATER)
       || b.getRelative(BlockFace.UP).getType().equals(Material.STATIONARY_WATER)) {
     count = (tt.isSafeSubmarine(eyeLocation, player_d)) ? 0 : 1;
     if (count == 0) {
       sub = true;
     }
   } else {
     int[] start_loc = tt.getStartLocation(eyeLocation, player_d);
     // safeLocation(int startx, int starty, int startz, int resetx, int resetz, World w, COMPASS
     // player_d)
     count =
         tt.safeLocation(
             start_loc[0],
             eyeLocation.getBlockY(),
             start_loc[2],
             start_loc[1],
             start_loc[3],
             eyeLocation.getWorld(),
             player_d);
   }
   if (plugin.getPM().isPluginEnabled("Lockette")) {
     Lockette Lockette = (Lockette) plugin.getPM().getPlugin("Lockette");
     if (Lockette.isProtected(eyeLocation.getBlock())) {
       count = 1;
     }
   }
   if (count > 0) {
     TARDISMessage.send(player, "WOULD_GRIEF_BLOCKS");
     return true;
   }
   boolean cham = chamtmp;
   final QueryFactory qf = new QueryFactory(plugin);
   Location oldSave = null;
   HashMap<String, Object> bid = new HashMap<String, Object>();
   bid.put("tardis_id", id);
   HashMap<String, Object> bset = new HashMap<String, Object>();
   if (rsc.getWorld() != null) {
     oldSave = new Location(rsc.getWorld(), rsc.getX(), rsc.getY(), rsc.getZ());
     // set fast return location
     bset.put("world", rsc.getWorld().getName());
     bset.put("x", rsc.getX());
     bset.put("y", rsc.getY());
     bset.put("z", rsc.getZ());
     bset.put("direction", d.toString());
     bset.put("submarine", rsc.isSubmarine());
   } else {
     // set fast return location
     bset.put("world", eyeLocation.getWorld().getName());
     bset.put("x", eyeLocation.getX());
     bset.put("y", eyeLocation.getY());
     bset.put("z", eyeLocation.getZ());
     bset.put("submarine", (sub) ? 1 : 0);
   }
   qf.doUpdate("back", bset, bid);
   HashMap<String, Object> tid = new HashMap<String, Object>();
   tid.put("tardis_id", id);
   HashMap<String, Object> set = new HashMap<String, Object>();
   set.put("world", eyeLocation.getWorld().getName());
   set.put("x", eyeLocation.getBlockX());
   set.put("y", eyeLocation.getBlockY());
   set.put("z", eyeLocation.getBlockZ());
   set.put("direction", player_d.toString());
   set.put("submarine", (sub) ? 1 : 0);
   if (hidden) {
     HashMap<String, Object> sett = new HashMap<String, Object>();
     sett.put("hidden", 0);
     HashMap<String, Object> ttid = new HashMap<String, Object>();
     ttid.put("tardis_id", id);
     qf.doUpdate("tardis", sett, ttid);
     // restore biome
     plugin.getUtils().restoreBiome(oldSave, biome);
   }
   qf.doUpdate("current", set, tid);
   TARDISMessage.send(player, "TARDIS_COMING");
   //        boolean mat = plugin.getConfig().getBoolean("police_box.materialise");
   //        long delay = (mat) ? 1L : 180L;
   long delay = 1L;
   plugin.getTrackerKeeper().getInVortex().add(id);
   final boolean hid = hidden;
   if (!plugin.getTrackerKeeper().getDestinationVortex().containsKey(id)) {
     final DestroyData dd = new DestroyData(plugin, player.getUniqueId().toString());
     dd.setChameleon(cham);
     dd.setDirection(d);
     dd.setLocation(oldSave);
     dd.setPlayer(player);
     dd.setHide(false);
     dd.setOutside(true);
     dd.setSubmarine(rsc.isSubmarine());
     dd.setTardisID(id);
     dd.setBiome(biome);
     plugin
         .getServer()
         .getScheduler()
         .scheduleSyncDelayedTask(
             plugin,
             new Runnable() {
               @Override
               public void run() {
                 if (!hid) {
                   plugin.getTrackerKeeper().getDematerialising().add(id);
                   plugin.getPresetDestroyer().destroyPreset(dd);
                 } else {
                   plugin.getPresetDestroyer().removeBlockProtection(id, qf);
                 }
               }
             },
             delay);
   }
   final BuildData bd = new BuildData(plugin, player.getUniqueId().toString());
   bd.setChameleon(cham);
   bd.setDirection(player_d);
   bd.setLocation(eyeLocation);
   bd.setMalfunction(false);
   bd.setOutside(true);
   bd.setPlayer(player);
   bd.setRebuild(false);
   bd.setSubmarine(sub);
   bd.setTardisID(id);
   plugin
       .getServer()
       .getScheduler()
       .scheduleSyncDelayedTask(
           plugin,
           new Runnable() {
             @Override
             public void run() {
               plugin.getPresetBuilder().buildPreset(bd);
             }
           },
           delay * 2);
   plugin.getTrackerKeeper().getHasDestination().remove(id);
   if (plugin.getTrackerKeeper().getRescue().containsKey(id)) {
     plugin.getTrackerKeeper().getRescue().remove(id);
   }
   return true;
 }
 @Override
 public void run() {
   int[][] ids;
   byte[][] datas;
   // get relative locations
   int x = tmd.getLocation().getBlockX(),
       plusx = tmd.getLocation().getBlockX() + 1,
       minusx = tmd.getLocation().getBlockX() - 1;
   int y;
   if (preset.equals(PRESET.SUBMERGED)) {
     y = tmd.getLocation().getBlockY() - 1;
   } else {
     y = tmd.getLocation().getBlockY();
   }
   int z = tmd.getLocation().getBlockZ(),
       plusz = tmd.getLocation().getBlockZ() + 1,
       minusz = tmd.getLocation().getBlockZ() - 1;
   World world = tmd.getLocation().getWorld();
   if (i < loops) {
     i++;
     // expand placed blocks to a police box
     switch (i % 3) {
       case 2: // stained
         ids = stained_column.getId();
         datas = stained_column.getData();
         break;
       case 1: // glass
         ids = glass_column.getId();
         datas = glass_column.getData();
         break;
       default: // preset
         ids = column.getId();
         datas = column.getData();
         break;
     }
     // first run - play sound
     if (i == 1) {
       switch (preset) {
         case GRAVESTONE:
           // remove flower
           int flowerx;
           int flowery = (tmd.getLocation().getBlockY() + 1);
           int flowerz;
           switch (tmd.getDirection()) {
             case NORTH:
               flowerx = tmd.getLocation().getBlockX();
               flowerz = tmd.getLocation().getBlockZ() + 1;
               break;
             case WEST:
               flowerx = tmd.getLocation().getBlockX() + 1;
               flowerz = tmd.getLocation().getBlockZ();
               break;
             case SOUTH:
               flowerx = tmd.getLocation().getBlockX();
               flowerz = tmd.getLocation().getBlockZ() - 1;
               break;
             default:
               flowerx = tmd.getLocation().getBlockX() - 1;
               flowerz = tmd.getLocation().getBlockZ();
               break;
           }
           plugin.getUtils().setBlock(world, flowerx, flowery, flowerz, 0, (byte) 0);
           break;
         case CAKE:
           plugin.getPresetDestroyer().destroyLamp(tmd.getLocation(), preset);
           break;
         default:
           break;
       }
       // only play the sound if the player is outside the TARDIS
       if (tmd.isOutside()) {
         HashMap<String, Object> wherep = new HashMap<String, Object>();
         wherep.put("uuid", tmd.getPlayer().getUniqueId().toString());
         ResultSetPlayerPrefs rsp = new ResultSetPlayerPrefs(plugin, wherep);
         boolean minecart = false;
         if (rsp.resultSet()) {
           minecart = rsp.isMinecartOn();
         }
         if (!minecart) {
           plugin.getUtils().playTARDISSoundNearby(tmd.getLocation(), "tardis_takeoff");
         } else {
           world.playSound(tmd.getLocation(), Sound.MINECART_INSIDE, 1.0F, 0.0F);
         }
       }
       the_colour = getWoolColour(tmd.getTardisID(), preset);
     } else {
       // just change the walls
       int xx, zz;
       for (int n = 0; n < 9; n++) {
         int[] colids = ids[n];
         byte[] coldatas = datas[n];
         switch (n) {
           case 0:
             xx = minusx;
             zz = minusz;
             break;
           case 1:
             xx = x;
             zz = minusz;
             break;
           case 2:
             xx = plusx;
             zz = minusz;
             break;
           case 3:
             xx = plusx;
             zz = z;
             break;
           case 4:
             xx = plusx;
             zz = plusz;
             break;
           case 5:
             xx = x;
             zz = plusz;
             break;
           case 6:
             xx = minusx;
             zz = plusz;
             break;
           case 7:
             xx = minusx;
             zz = z;
             break;
           default:
             xx = x;
             zz = z;
             break;
         }
         for (int yy = 0; yy < 4; yy++) {
           boolean change = true;
           if (yy == 0 && n == 9) {
             Block rail = world.getBlockAt(xx, y, zz);
             if (rail.getType().equals(Material.RAILS)
                 || rail.getType().equals(Material.POWERED_RAIL)) {
               change = false;
             }
           }
           switch (colids[yy]) {
             case 2:
             case 3:
               int subi = (preset.equals(PRESET.SUBMERGED)) ? cham_id : colids[yy];
               byte subd = (preset.equals(PRESET.SUBMERGED)) ? cham_data : coldatas[yy];
               plugin.getUtils().setBlock(world, xx, (y + yy), zz, subi, subd);
               break;
             case 35: // wool
               int chai =
                   (preset.equals(PRESET.NEW) || preset.equals(PRESET.OLD)) ? cham_id : colids[yy];
               byte chad =
                   (preset.equals(PRESET.NEW) || preset.equals(PRESET.OLD))
                       ? cham_data
                       : coldatas[yy];
               if (preset.equals(PRESET.PARTY)
                   || (preset.equals(PRESET.FLOWER) && coldatas[yy] == 0)) {
                 chad = the_colour;
               }
               plugin.getUtils().setBlock(world, xx, (y + yy), zz, chai, chad);
               break;
             case 38:
               break;
             case 50: // lamps, glowstone and torches
             case 89:
             case 124:
               int light =
                   (preset.equals(PRESET.NEW) || preset.equals(PRESET.OLD)) ? lamp : colids[yy];
               plugin.getUtils().setBlock(world, xx, (y + yy), zz, light, coldatas[yy]);
               break;
             case 64:
             case 68: // except the sign and doors
             case 71:
               break;
             case 95:
               if (coldatas[yy] == -1) {
                 if (preset.equals(PRESET.PARTY)
                     || (preset.equals(PRESET.FLOWER) && coldatas[yy] == 0)) {
                   chad = the_colour;
                 } else {
                   // if it was a wool / stained glass / stained clay block get the data from that
                   int[] finalids = column.getId()[n];
                   byte[] finaldatas = column.getData()[n];
                   if (finalids[yy] == 35
                       || finalids[yy] == 95
                       || finalids[yy] == 159
                       || finalids[yy] == 160
                       || finalids[yy] == 171) {
                     if (preset.equals(PRESET.NEW) || preset.equals(PRESET.OLD)) {
                       chad = cham_data;
                     } else {
                       chad = finaldatas[yy];
                     }
                   } else {
                     chad =
                         plugin.getBuildKeeper().getStainedGlassLookup().getStain().get(cham_id);
                   }
                 }
                 plugin.getUtils().setBlock(world, xx, (y + yy), zz, 95, chad);
               } else {
                 plugin.getUtils().setBlock(world, xx, (y + yy), zz, colids[yy], coldatas[yy]);
               }
               break;
             default: // everything else
               if (change) {
                 plugin.getUtils().setBlock(world, xx, (y + yy), zz, colids[yy], coldatas[yy]);
               }
               break;
           }
         }
       }
     }
   } else {
     plugin.getServer().getScheduler().cancelTask(task);
     task = 0;
     new TARDISDeinstaPreset(plugin).instaDestroyPreset(tmd, false, preset);
   }
 }
 /** Builds the TARDIS Police Box. */
 public void buildPoliceBox() {
   int plusx, minusx, x, plusz, minusz, z;
   byte sd = 0, grey = 8;
   byte mds = data,
       mdw = data,
       mdn = data,
       mde = data,
       bds = data,
       bdw = data,
       bdn = data,
       bde = data;
   final World world;
   // expand placed blocks to a police box
   double lowX = location.getX();
   double lowY = location.getY();
   double lowZ = location.getZ();
   location.setX(lowX + 0.5);
   location.setY(lowY + 2);
   location.setZ(lowZ + 0.5);
   // get relative locations
   x = location.getBlockX();
   plusx = (location.getBlockX() + 1);
   minusx = (location.getBlockX() - 1);
   final int y = location.getBlockY();
   final int plusy = (location.getBlockY() + 1),
       minusy = (location.getBlockY() - 1),
       down2y = (location.getBlockY() - 2),
       down3y = (location.getBlockY() - 3);
   z = (location.getBlockZ());
   plusz = (location.getBlockZ() + 1);
   minusz = (location.getBlockZ() - 1);
   world = location.getWorld();
   int south = mat, west = mat, north = mat, east = mat, signx = 0, signz = 0;
   String doorloc = "";
   // platform
   plugin.buildPB.addPlatform(location, false, d, p, tid);
   QueryFactory qf = new QueryFactory(plugin);
   HashMap<String, Object> ps = new HashMap<String, Object>();
   ps.put("tardis_id", tid);
   String loc = "";
   // get direction player is facing from yaw place block under door if block is in list of blocks
   // an iron door cannot go on
   switch (d) {
     case SOUTH:
       // if (yaw >= 315 || yaw < 45)
       plugin.utils.setBlockCheck(
           world, x, down3y, minusz, 35, grey, tid); // door is here if player facing south
       loc = world.getBlockAt(x, down3y, minusz).getLocation().toString();
       ps.put("location", loc);
       doorloc = world.getName() + ":" + x + ":" + down2y + ":" + minusz;
       sd = 2;
       signx = x;
       signz = (minusz - 1);
       south = 71;
       mds = 8;
       bds = 1;
       break;
     case EAST:
       // if (yaw >= 225 && yaw < 315)
       plugin.utils.setBlockCheck(
           world, minusx, down3y, z, 35, grey, tid); // door is here if player facing east
       loc = world.getBlockAt(minusx, down3y, z).getLocation().toString();
       ps.put("location", loc);
       doorloc = world.getName() + ":" + minusx + ":" + down2y + ":" + z;
       sd = 4;
       signx = (minusx - 1);
       signz = z;
       east = 71;
       mde = 8;
       bde = 0;
       break;
     case NORTH:
       // if (yaw >= 135 && yaw < 225)
       plugin.utils.setBlockCheck(
           world, x, down3y, plusz, 35, grey, tid); // door is here if player facing north
       loc = world.getBlockAt(x, down3y, plusz).getLocation().toString();
       ps.put("location", loc);
       doorloc = world.getName() + ":" + x + ":" + down2y + ":" + plusz;
       sd = 3;
       signx = x;
       signz = (plusz + 1);
       north = 71;
       mdn = 8;
       bdn = 3;
       break;
     case WEST:
       // if (yaw >= 45 && yaw < 135)
       plugin.utils.setBlockCheck(
           world, plusx, down3y, z, 35, grey, tid); // door is here if player facing west
       loc = world.getBlockAt(plusx, down3y, z).getLocation().toString();
       ps.put("location", loc);
       doorloc = world.getName() + ":" + plusx + ":" + down2y + ":" + z;
       sd = 5;
       signx = (plusx + 1);
       signz = z;
       west = 71;
       mdw = 8;
       bdw = 2;
       break;
   }
   ps.put("police_box", 1);
   qf.doInsert("blocks", ps);
   if (!loc.isEmpty()) {
     plugin.protectBlockMap.put(loc, tid);
   }
   // should insert the door when tardis is first made, and then update location there after!
   HashMap<String, Object> whered = new HashMap<String, Object>();
   whered.put("door_type", 0);
   whered.put("tardis_id", tid);
   ResultSetDoors rsd = new ResultSetDoors(plugin, whered, false);
   HashMap<String, Object> setd = new HashMap<String, Object>();
   setd.put("door_location", doorloc);
   if (rsd.resultSet()) {
     HashMap<String, Object> whereid = new HashMap<String, Object>();
     whereid.put("door_id", rsd.getDoor_id());
     qf.doUpdate("doors", setd, whereid);
   } else {
     setd.put("tardis_id", tid);
     setd.put("door_type", 0);
     setd.put("door_direction", d.toString());
     qf.doInsert("doors", setd);
   }
   // bottom layer corners
   plugin.utils.setBlockAndRemember(world, plusx, down2y, plusz, mat, data, tid);
   plugin.utils.setBlockAndRemember(world, minusx, down2y, plusz, mat, data, tid);
   plugin.utils.setBlockAndRemember(world, minusx, down2y, minusz, mat, data, tid);
   plugin.utils.setBlockAndRemember(world, plusx, down2y, minusz, mat, data, tid);
   // middle layer corners
   plugin.utils.setBlockAndRemember(world, plusx, minusy, plusz, mat, data, tid);
   plugin.utils.setBlockAndRemember(world, minusx, minusy, plusz, mat, data, tid);
   plugin.utils.setBlockAndRemember(world, minusx, minusy, minusz, mat, data, tid);
   plugin.utils.setBlockAndRemember(world, plusx, minusy, minusz, mat, data, tid);
   // top layer
   switch (mat) {
     case 18:
       plugin.utils.setBlockAndRemember(world, x, y, z, 17, data, tid);
       break;
     case 46:
       plugin.utils.setBlockAndRemember(world, x, y, z, 35, (byte) 14, tid);
       break;
     case 79:
       plugin.utils.setBlockAndRemember(world, x, y, z, 35, (byte) 3, tid);
       break;
     case 89:
       plugin.utils.setBlockAndRemember(world, x, y, z, 35, (byte) 4, tid);
       break;
     default:
       plugin.utils.setBlockAndRemember(world, x, y, z, mat, data, tid);
       break;
   }
   plugin.utils.setBlockAndRemember(world, plusx, y, z, mat, data, tid); // east
   plugin.utils.setBlockAndRemember(world, plusx, y, plusz, mat, data, tid);
   plugin.utils.setBlockAndRemember(world, x, y, plusz, mat, data, tid); // south
   plugin.utils.setBlockAndRemember(world, minusx, y, plusz, mat, data, tid);
   plugin.utils.setBlockAndRemember(world, minusx, y, z, mat, data, tid); // west
   plugin.utils.setBlockAndRemember(world, minusx, y, minusz, mat, data, tid);
   plugin.utils.setBlockAndRemember(world, x, y, minusz, mat, data, tid); // north
   plugin.utils.setBlockAndRemember(world, plusx, y, minusz, mat, data, tid);
   if (!plain) {
     // set sign
     plugin.utils.setBlock(world, signx, y, signz, 68, sd);
     Block sign = world.getBlockAt(signx, y, signz);
     if (sign.getType().equals(Material.WALL_SIGN)) {
       Sign s = (Sign) sign.getState();
       if (plugin.getConfig().getBoolean("name_tardis")) {
         HashMap<String, Object> wheret = new HashMap<String, Object>();
         wheret.put("tardis_id", tid);
         ResultSetTardis rst = new ResultSetTardis(plugin, wheret, "", false);
         if (rst.resultSet()) {
           String owner = rst.getOwner();
           if (owner.length() > 14) {
             s.setLine(0, owner.substring(0, 12) + "'s");
           } else {
             s.setLine(0, owner + "'s");
           }
         }
       }
       s.setLine(1, ChatColor.WHITE + "POLICE");
       s.setLine(2, ChatColor.WHITE + "BOX");
       s.update();
     }
     // put torch on top
     if (mat == 79) {
       plugin.utils.setBlockAndRemember(world, x, plusy, z, 76, (byte) 5, tid);
     } else {
       plugin.utils.setBlockAndRemember(world, x, plusy, z, lamp, (byte) 5, tid);
     }
   }
   // bottom layer with door bottom
   plugin.utils.setBlockAndRemember(world, plusx, down2y, z, west, bdw, tid);
   plugin.utils.setBlockAndRemember(world, x, down2y, plusz, north, bdn, tid);
   plugin.utils.setBlockAndRemember(world, minusx, down2y, z, east, bde, tid);
   plugin.utils.setBlockAndRemember(world, x, down2y, minusz, south, bds, tid);
   // middle layer with door top
   plugin.utils.setBlockAndRemember(world, plusx, minusy, z, west, mdw, tid);
   plugin.utils.setBlockAndRemember(world, x, minusy, plusz, north, mdn, tid);
   plugin.utils.setBlockAndRemember(world, minusx, minusy, z, east, mde, tid);
   plugin.utils.setBlockAndRemember(world, x, minusy, minusz, south, mds, tid);
   // message travellers in tardis
   HashMap<String, Object> where = new HashMap<String, Object>();
   where.put("tardis_id", tid);
   ResultSetTravellers rst = new ResultSetTravellers(plugin, where, true);
   if (rst.resultSet()) {
     final List<String> travellers = rst.getData();
     plugin
         .getServer()
         .getScheduler()
         .scheduleSyncDelayedTask(
             plugin,
             new Runnable() {
               @Override
               public void run() {
                 for (String s : travellers) {
                   Player p = plugin.getServer().getPlayer(s);
                   if (p != null) {
                     String message =
                         (mal)
                             ? "There was a malfunction and the emergency handbrake was engaged! Scan location before exit!"
                             : "LEFT-click the handbrake to exit!";
                     p.sendMessage(plugin.pluginName + message);
                   }
                 }
               }
             },
             30L);
   }
   plugin.tardisMaterialising.remove(Integer.valueOf(tid));
 }
 public void flickSwitch(UUID uuid, boolean on) {
   HashMap<String, Object> whereb = new HashMap<String, Object>();
   whereb.put("uuid", uuid.toString());
   ResultSetTardis rs = new ResultSetTardis(plugin, whereb, "", false);
   if (rs.resultSet()) {
     SCHEMATIC schm = rs.getSchematic();
     if (no_beacon.contains(schm)) {
       // doesn't have a beacon!
       return;
     }
     // toggle beacon
     String beacon = rs.getBeacon();
     String[] beaconData;
     int plusy = 0;
     if (beacon.isEmpty()) {
       // get the location from the TARDIS size and the creeper location
       switch (schm) {
         case REDSTONE:
           plusy = 14;
           break;
         case ELEVENTH:
           plusy = 22;
           break;
         case DELUXE:
           plusy = 23;
           break;
         case BIGGER:
         case ARS:
           plusy = 12;
           break;
         default: // BUDGET, STEAMPUNK, WAR, CUSTOM?
           plusy = 11;
           break;
       }
       String creeper = rs.getCreeper();
       beaconData = creeper.split(":");
     } else {
       beaconData = beacon.split(":");
     }
     World w = plugin.getServer().getWorld(beaconData[0]);
     boolean stuffed = (beaconData[1].contains(".5"));
     int bx, bz;
     // get rid of decimal places due to incorrectly copied values from creeper field...
     if (stuffed) {
       bx = (int) plugin.getUtils().parseFloat(beaconData[1]) * 1;
       bz = (int) plugin.getUtils().parseFloat(beaconData[3]) * 1;
     } else {
       bx = plugin.getUtils().parseInt(beaconData[1]);
       bz = plugin.getUtils().parseInt(beaconData[3]);
     }
     int by = (int) plugin.getUtils().parseFloat(beaconData[2]) * 1 + plusy;
     if (beacon.isEmpty() || stuffed) {
       // update the tardis table so we don't have to do this again
       String beacon_loc = beaconData[0] + ":" + bx + ":" + by + ":" + bz;
       HashMap<String, Object> set = new HashMap<String, Object>();
       set.put("beacon", beacon_loc);
       HashMap<String, Object> where = new HashMap<String, Object>();
       where.put("tardis_id", rs.getTardis_id());
       new QueryFactory(plugin).doUpdate("tardis", set, where);
     }
     Location bl = new Location(w, bx, by, bz);
     Block b = bl.getBlock();
     while (!b.getChunk().isLoaded()) {
       b.getChunk().load();
     }
     b.setType((on) ? Material.GLASS : Material.BEDROCK);
   }
 }