@EventHandler(priority = EventPriority.HIGHEST)
  public void onBlockBreak(BlockBreakEvent event) {
    Player p = event.getPlayer();
    int pid = GameManager.getInstance().getPlayerGameId(p);

    if (pid == -1) {
      int blockgameid = GameManager.getInstance().getBlockGameId(event.getBlock().getLocation());

      if (blockgameid != -1) {
        if (GameManager.getInstance().getGame(blockgameid).getGameMode()
            != Game.GameMode.DISABLED) {
          event.setCancelled(true);
        }
      }
      return;
    }

    Game g = GameManager.getInstance().getGame(pid);

    if (g.getMode() == Game.GameMode.DISABLED) {
      return;
    }
    if (g.getMode() != Game.GameMode.INGAME) {
      event.setCancelled(true);
      return;
    }

    if (!allowedBreak.contains(event.getBlock().getTypeId())) event.setCancelled(true);
  }
  public void setup() {
    baseDir = new File(SurvivalGames.getPluginDataFolder() + "/ArenaData/");
    try {
      if (!baseDir.exists()) {
        baseDir.mkdirs();
      }
      for (Game g : GameManager.getInstance().getGames()) {
        ensureFile(g.getID());
      }

    } catch (Exception e) {
    }

    Bukkit.getScheduler()
        .runTaskTimerAsynchronously(
            GameManager.getInstance().getPlugin(), new DataDumper(), 100, 100);
  }
    public void run() {

      ArrayList<BlockData> data = queue.get(id);
      if (data != null) {
        int a = data.size() - 1;
        int rb = 0;
        while (a >= 0 && (rb < 100 || shutdown)) {
          SurvivalGames.debug("Reseting " + a);
          BlockData result = data.get(a);
          if (result.getGameId() == game.getID()) {

            data.remove(a);
            Location l =
                new Location(
                    Bukkit.getWorld(result.getWorld()),
                    result.getX(),
                    result.getY(),
                    result.getZ());
            Block b = l.getBlock();
            b.setTypeIdAndData(result.getPrevid(), result.getPrevdata(), false);
            b.getState().update();

            /*	if(result.getItems() != null){
            	Chest c = (Chest)b;
            	c.getBlockInventory().setContents(result.getItems());
            }
             */

            rb++;
          }
          a--;
        }

        if (a != -1) {
          Bukkit.getScheduler()
              .scheduleSyncDelayedTask(
                  GameManager.getInstance().getPlugin(), new Rollback(id, shutdown), 1);
        } else {
          SurvivalGames.$("Arena " + id + " reset. ");
          game.resetCallback();
        }
      } else {
        SurvivalGames.$(" Arena " + id + " reset. ");
        game.resetCallback();
      }
    }
  public void saveGame(int arenaid, Player winner, int players, long time) {
    if (!enabled) return;
    int gameno = 0;
    Game g = GameManager.getInstance().getGame(arenaid);

    try {
      long time1 = new Date().getTime();
      PreparedStatement s2 =
          dbman.createStatement(
              "SELECT * FROM "
                  + SettingsManager.getSqlPrefix()
                  + "gamestats ORDER BY gameno DESC LIMIT 1");
      ResultSet rs = s2.executeQuery();
      rs.next();
      gameno = rs.getInt(1) + 1;

      if (time1 + 5000 < new Date().getTime())
        System.out.println(
            "Your database took a long time to respond. Check the connection between the server and database");
    } catch (SQLException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
      g.setRBStatus("Error: getno");
    }

    addSQL(
        "INSERT INTO "
            + SettingsManager.getSqlPrefix()
            + "gamestats VALUES(NULL,"
            + arenaid
            + ","
            + players
            + ",'"
            + winner.getName()
            + "',"
            + time
            + ")");

    for (PlayerStatsSession s : arenas.get(arenaid).values()) {
      s.setGameID(gameno);
      addSQL(s.createQuery());
    }
    arenas.get(arenaid).clear();
  }
  public void onDisable() {
    disabling = false;
    PluginDescriptionFile pdfFile = p.getDescription();
    SettingsManager.getInstance().saveSpawns();
    SettingsManager.getInstance().saveSystemConfig();
    for (Game g : GameManager.getInstance().getGames()) {
      try {
        g.disable();
      } catch (Exception e) {
        // will throw useless "tried to register task blah blah error." Use the method below to
        // reset the arena without a task.
      }
      QueueManager.getInstance().rollback(g.getID(), true);
    }

    logger.info(
        pdfFile.getName()
            + " version "
            + pdfFile.getVersion()
            + " has now been disabled and reset");
  }
  public boolean onCommand(Player player, String[] args) {

    if (!player.hasPermission("sg.staff.forcestart") && !player.isOp()) {
      player.sendMessage(ChatColor.RED + "No Permission");
      return true;
    }
    int game = -1;
    int seconds = 10;
    if (args.length == 2) {
      seconds = Integer.parseInt(args[1]);
    }
    if (args.length >= 1) {
      game = Integer.parseInt(args[0]);

    } else game = GameManager.getInstance().getPlayerGameId(player);
    if (game == -1) {
      player.sendMessage(ChatColor.RED + "Must be in a game!");
      return true;
    }
    if (GameManager.getInstance().getGame(game).getActivePlayers() < 2) {
      player.sendMessage(ChatColor.RED + "Needs at least 2 players to start!");
      return true;
    }

    Game g = GameManager.getInstance().getGame(game);
    if (g.getMode() != Game.GameMode.WAITING && !player.hasPermission("sg.arena.restart")) {
      player.sendMessage(ChatColor.RED + "Game Already Starting!");
      return true;
    }
    g.countdown(seconds);
    for (Player pl : g.getAllPlayers()) {
      msgmgr.sendMessage(PrefixType.INFO, "Game starting in " + seconds + " seconds!", pl);
    }
    player.sendMessage(ChatColor.GREEN + "Started arena " + game);

    return true;
  }
 @Override
 public boolean onCommand(Player player, String[] args) {
   if (!player.hasPermission(permission()) && !player.isOp()) {
     MessageManager.getInstance()
         .sendFMessage(MessageManager.PrefixType.ERROR, "error.nopermission", player.getName());
     return true;
   }
   try {
     if (args.length == 0) {
       for (Game g : GameManager.getInstance().getGames()) {
         QueueManager.getInstance().rollback(g.getID(), true);
         g.disable();
       }
       MessageManager.getInstance()
           .sendFMessage(
               MessageManager.PrefixType.INFO, "game.all", player.getName(), "input-disabled");
     } else {
       Game g = GameManager.getInstance().getGame(Integer.parseInt(args[0]));
       g.disable();
       QueueManager.getInstance().rollback(g.getID(), true);
       MessageManager.getInstance()
           .sendFMessage(
               MessageManager.PrefixType.INFO,
               "game.state",
               player.getName(),
               "arena-" + args[0],
               "input-disabled");
     }
   } catch (NumberFormatException e) {
     MessageManager.getInstance()
         .sendFMessage(
             MessageManager.PrefixType.ERROR, "error.notanumber", player.getName(), "input-Arena");
   } catch (NullPointerException e) {
     MessageManager.getInstance()
         .sendFMessage(
             MessageManager.PrefixType.ERROR,
             "error.gamedoesntexist",
             player.getName(),
             "arena-" + args[0]);
   }
   return true;
 }