public ArrayList<String> load() {
    ArrayList<String> players = new ArrayList<String>();

    Configuration config = new Configuration(file);

    PlayerInfo info;
    for (String cat : config.categories.keySet()) {
      if (cat.contains(".")) continue;
      else if (cat.equalsIgnoreCase(PermissionsAPI.EntryPlayer)) {
        PermissionsAPI.EPPrefix = config.get(cat, "prefix", " ").value;
        PermissionsAPI.EPSuffix = config.get(cat, "suffix", " ").value;
        continue;
      }

      info = PlayerInfo.getPlayerInfo(cat);

      if (info != null) {
        info.prefix = config.get(cat, "prefix", " ").value;
        info.suffix = config.get(cat, "suffix", " ").value;
      }

      players.add(cat);
      discardInfo(info, new String[] {});
    }

    return players;
  }
  public PacketSelectionUpdate(PlayerInfo info) {
    packet = new Packet250CustomPayload();

    ByteArrayOutputStream streambyte = new ByteArrayOutputStream();
    DataOutputStream stream = new DataOutputStream(streambyte);

    try {
      stream.write(packetID);

      if (info != null && info.getPoint1() != null) {
        Point p1 = info.getPoint1();
        stream.writeBoolean(true);
        stream.writeInt(p1.x);
        stream.writeInt(p1.y);
        stream.writeInt(p1.z);
      } else stream.writeBoolean(false);

      if (info != null && info.getPoint2() != null) {
        Point p2 = info.getPoint2();
        stream.writeBoolean(true);
        stream.writeInt(p2.x);
        stream.writeInt(p2.y);
        stream.writeInt(p2.z);
      } else stream.writeBoolean(false);

      stream.close();
      streambyte.close();

      packet.channel = FECHANNEL;
      packet.data = streambyte.toByteArray();
      packet.length = packet.data.length;
    } catch (Exception e) {
      OutputHandler.SOP("Error creating packet >> " + this.getClass());
    }
  }
  @Override
  public void processCommandPlayer(EntityPlayer sender, String[] args) {
    if (args.length >= 1) {
      if (!PermissionsAPI.checkPermAllowed(
          new PermQueryPlayer(sender, getCommandPerm() + ".others"))) {
        OutputHandler.chatError(sender, Localization.get(Localization.ERROR_NOPERMISSION));
        return;
      }
      EntityPlayerMP player = FunctionHelper.getPlayerForName(args[0]);
      if (player != null) {
        PlayerInfo.getPlayerInfo(player.username).back = new WarpPoint(player);

        PropQueryPlayerZone query =
            new PropQueryPlayerZone(
                player, "ForgeEssentials.BasicCommands.spawnPoint", ZoneManager.getGLOBAL(), true);
        PermissionsAPI.getPermissionProp(query);

        String val = query.getStringValue();
        String[] split = val.split("[;_]");

        int dim = Integer.parseInt(split[0]);
        int x = Integer.parseInt(split[1]);
        int y = Integer.parseInt(split[2]);
        int z = Integer.parseInt(split[3]);

        WarpPoint point =
            new WarpPoint(dim, x + .5, y + 1, z + .5, player.cameraYaw, player.cameraPitch);

        // teleport
        FunctionHelper.setPlayer(player, point);
        player.sendChatToPlayer(Localization.get("command.spawn.done"));
        return;
      } else {
        OutputHandler.chatError(sender, Localization.format(Localization.ERROR_NOPLAYER, args[0]));
        return;
      }
    } else if (args.length == 0) {
      PropQueryPlayerZone query =
          new PropQueryPlayerZone(
              sender, "ForgeEssentials.BasicCommands.spawnPoint", ZoneManager.getGLOBAL(), true);
      PermissionsAPI.getPermissionProp(query);

      String val = query.getStringValue();
      String[] split = val.split("[;_]");

      int dim = Integer.parseInt(split[0]);
      int x = Integer.parseInt(split[1]);
      int y = Integer.parseInt(split[2]);
      int z = Integer.parseInt(split[3]);

      WarpPoint spawn =
          new WarpPoint(dim, x + .5, y + 1, z + .5, sender.cameraYaw, sender.cameraPitch);
      PlayerInfo.getPlayerInfo(sender.username).back = new WarpPoint(sender);
      TeleportCenter.addToTpQue(spawn, sender);
      sender.sendChatToPlayer(Localization.get("command.spawn.done"));
    }
  }
 @Override
 public void processCommandPlayer(EntityPlayer sender, String[] args) {
   if (args.length == 0) {
     String msg = "";
     for (String warp : CommandDataManager.warps.keySet()) {
       msg = warp + ", " + msg;
     }
     sender.sendChatToPlayer(msg);
   } else if (args.length == 1) {
     if (CommandDataManager.warps.containsKey(args[0].toLowerCase())) {
       if (PermissionsAPI.checkPermAllowed(
           new PermQueryPlayer(sender, getCommandPerm() + "." + args[0].toLowerCase()))) {
         Warp warp = CommandDataManager.warps.get(args[0].toLowerCase());
         PlayerInfo playerInfo = PlayerInfo.getPlayerInfo(sender.username);
         playerInfo.back = new WarpPoint(sender);
         TeleportCenter.addToTpQue(warp.getPoint(), sender);
       } else {
         OutputHandler.chatError(sender, Localization.get(Localization.ERROR_PERMDENIED));
       }
     } else {
       OutputHandler.chatError(sender, Localization.get("command.warp.notfound"));
     }
   } else if (args.length == 2) {
     if (PermissionsAPI.checkPermAllowed(
         new PermQueryPlayer(sender, getCommandPerm() + ".admin"))) {
       if (args[0].equalsIgnoreCase("set")) {
         if (CommandDataManager.warps.containsKey(args[1].toLowerCase())) {
           OutputHandler.chatError(sender, Localization.get("command.warp.alreadyexists"));
         } else {
           CommandDataManager.addWarp(new Warp(args[1].toLowerCase(), new WarpPoint(sender)));
           OutputHandler.chatConfirmation(sender, Localization.get(Localization.DONE));
         }
       } else if (args[0].equalsIgnoreCase("del")) {
         if (CommandDataManager.warps.containsKey(args[1].toLowerCase())) {
           CommandDataManager.removeWarp(CommandDataManager.warps.get(args[1]));
           OutputHandler.chatConfirmation(sender, Localization.get(Localization.DONE));
         } else {
           OutputHandler.chatError(sender, Localization.get("command.warp.notfound"));
         }
       } else {
         OutputHandler.chatError(
             sender, Localization.get(Localization.ERROR_BADSYNTAX) + getSyntaxPlayer(sender));
       }
     } else {
       OutputHandler.chatError(sender, Localization.get(Localization.ERROR_PERMDENIED));
     }
   }
 }
  @Override
  public void onComplete() {
    PlayerInfo.getPlayerInfo(player).addUndoAction(backup);

    String confirmMessage = "";
    switch (this.effectMode) {
      case THAW:
        confirmMessage = "thaw";
        break;
      case FREEZE:
        confirmMessage = "freeze";
        break;
      case SNOW:
        confirmMessage = "snow";
        break;
      case TILL:
        confirmMessage = "till";
        break;
      case UNTILL:
        confirmMessage = "untill";
        break;
    }
    OutputHandler.chatConfirmation(
        player, Localization.format("message.wc." + confirmMessage + "Confirm", this.changed));
  }
  @Override
  public void processCommandConsole(ICommandSender sender, String[] args) {
    if (args.length >= 1) {
      EntityPlayerMP player = FunctionHelper.getPlayerForName(args[0]);
      if (player != null) {
        PlayerInfo.getPlayerInfo(player.username).back = new WarpPoint(player);

        WarpPoint spawn;
        ChunkCoordinates point =
            FMLCommonHandler.instance()
                .getMinecraftServerInstance()
                .worldServers[0]
                .provider
                .getSpawnPoint();
        spawn =
            new WarpPoint(
                0, point.posX, point.posY, point.posZ, player.rotationPitch, player.rotationYaw);
        TeleportCenter.addToTpQue(spawn, player);
        player.sendChatToPlayer(Localization.get("command.spawn.done"));
        return;
      } else {
        OutputHandler.chatError(sender, Localization.format(Localization.ERROR_NOPLAYER, args[0]));
        return;
      }
    }
  }
  public void save(ArrayList<String> players) {
    // clear it.
    if (file.exists()) file.delete();

    String[] allPlayers =
        FMLCommonHandler.instance()
            .getSidedDelegate()
            .getServer()
            .getConfigurationManager()
            .getAllUsernames();

    Configuration config = new Configuration(file);

    PlayerInfo info;
    for (String name : players) {
      if (name.equalsIgnoreCase(PermissionsAPI.EntryPlayer)) {
        config.get(name, "prefix", PermissionsAPI.EPPrefix);
        config.get(name, "suffix", PermissionsAPI.EPSuffix);
        continue;
      }

      info = PlayerInfo.getPlayerInfo(name);
      config.get(name, "prefix", info.prefix == null ? "" : info.prefix);
      config.get(name, "suffix", info.suffix == null ? "" : info.suffix);
      discardInfo(info, allPlayers);
    }

    config.save();
  }
 @Override
 public void processCommandConsole(ICommandSender sender, String[] args) {
   if (args.length == 2) {
     if (CommandDataManager.warps.containsKey(args[1].toLowerCase())) {
       EntityPlayerMP player = FunctionHelper.getPlayerForName(sender, args[0]);
       if (player != null) {
         Warp warp = CommandDataManager.warps.get(args[1].toLowerCase());
         PlayerInfo.getPlayerInfo(player.username).back = new WarpPoint(player);
         TeleportCenter.addToTpQue(warp.getPoint(), player);
       } else {
         OutputHandler.chatError(
             sender, Localization.format(Localization.ERROR_NOPLAYER, args[0]));
       }
     } else {
       OutputHandler.info("CommandBlock Error: " + Localization.get("command.warp.notfound"));
     }
   }
 }
  @Override
  public String getResponceString(DatagramPacket packet) {
    LinkedHashMap<String, String> PlayerData = new LinkedHashMap();
    LinkedHashMap<String, String> tempMap = new LinkedHashMap();
    ArrayList<String> tempArgs = new ArrayList();

    String username = new String(Arrays.copyOfRange(packet.getData(), 11, packet.getLength()));
    EntityPlayerMP player = server.getConfigurationManager().getPlayerForUsername(username.trim());
    if (player == null) {
      return "";
    }

    PlayerInfo pi = PlayerInfo.getPlayerInfo(player);
    if (pi != null && sendhome) {
      if (pi.home != null) {
        PlayerData.put("home", TextFormatter.toJSON(pi.home));
      }
      if (pi.back != null) {
        PlayerData.put("back", TextFormatter.toJSON(pi.back));
      }
    }

    if (sendArmorAndHealth) {
      PlayerData.put("armor", "" + player.inventory.getTotalArmorValue());
      PlayerData.put("health", "" + player.getHealth());
    }

    PlayerData.put("wallet", "" + Wallet.getWallet(player));
    PlayerData.put("pos", TextFormatter.toJSON(new WorldPoint(player)));
    PlayerData.put("ping", "" + player.ping);
    PlayerData.put("gm", player.theItemInWorldManager.getGameType().getName());

    if (!player.getActivePotionEffects().isEmpty() && sendpotions) {
      PlayerData.put("potion", TextFormatter.toJSON(player.getActivePotionEffects()));
    }

    if (sendXP) {
      tempMap.clear();
      tempMap.put("lvl", "" + player.experienceLevel);
      tempMap.put("bar", "" + player.experience);
      PlayerData.put("xp", TextFormatter.toJSON(tempMap));
    }

    if (sendFood) {
      tempMap.clear();
      tempMap.put("food", "" + player.getFoodStats().getFoodLevel());
      tempMap.put("saturation", "" + player.getFoodStats().getSaturationLevel());
      PlayerData.put("foodStats", TextFormatter.toJSON(tempMap));
    }

    if (sendCapabilities) {
      tempMap.clear();
      tempMap.put("edit", "" + player.capabilities.allowEdit);
      tempMap.put("allowFly", "" + player.capabilities.allowFlying);
      tempMap.put("isFly", "" + player.capabilities.isFlying);
      tempMap.put("noDamage", "" + player.capabilities.disableDamage);
    }
    PlayerData.put("cap", TextFormatter.toJSON(tempMap));

    try {
      Group group = PermissionsAPI.getHighestGroup(player);
      PlayerData.put("group", group.name);
    } catch (Exception e) {
    }

    return dataString = TextFormatter.toJSON(PlayerData);
  }
  private void discardInfo(PlayerInfo info, String[] allPlayers) {
    for (String name : allPlayers) if (info.username.equalsIgnoreCase(name)) return;

    // not logged in?? kill it.
    PlayerInfo.discardInfo(info.username);
  }