public static void addPresetPath(String npcName, PresetPath path, NPCHandler handle) {
    io.read();
    for (SyncWrapper wrap : io.getReadableData()) {
      io.add(wrap.getTag(), wrap.getObject());
    }
    io.add(npcName, path);
    io.write();
    presetNPCs.add(npcName);

    SimpleNPC rem = handle.getSimpleNPCByName(npcName);
    if (rem != null) {
      rem.destroyNPCObject();
    }

    LoadNPCTemplate tmp = new LoadNPCTemplate(npcName);

    tmp.loadProperties();

    SimpleNPC npc =
        tmp.getLoadedNPCTemplate().registerSimpleNPCFixedSpawn(handle, fixedSpawns.get(npcName));

    npc.setPresetPath(path);

    PresetPathsDisplay.updateSoftReference();
  }
  public static boolean removeFixedNPCSpawn(Player p, String npcName, NPCHandler handle) {
    if (!FileLocator.doesNPCNameExist(npcName)) {
      if (p != null) {
        QuestX.logChat(p, ChatColor.RED + LocaleBundle.getString("no_npc_name"));
      }
      return false;
    } else {
      if (!fixedSpawns.containsKey(npcName)) {
        if (p != null) {
          QuestX.logChat(p, LocaleBundle.getString("no_fixed_spawn"));
        }
        return false;
      } else {
        SimpleNPC rem = handle.getSimpleNPCByName(npcName);
        if (rem != null) {
          rem.destroyNPCObject();
        }

        loader.read();
        loader.clearWriteArray();
        for (SyncWrapper wrap : loader.getReadableData()) {
          // copy all the data read, except the npc to remove
          if (!wrap.getTag().equalsIgnoreCase(npcName)) {
            loader.add(wrap);
          }
        }
        loader.write();
        loader.clearReadArray();
        loader.clearWriteArray();

        fixedSpawns.remove(npcName);

        io.read();
        io.clearWriteArray();
        io.clearReadArray();
        for (SyncWrapper wrap : loader.getReadableData()) {
          // copy all the data read, except the npc to remove
          if (!wrap.getTag().equalsIgnoreCase(npcName)) {
            io.add(wrap);
          }
        }
        io.write();

        if (p != null) {
          QuestX.logChat(
              p, LocaleBundle.getString("t_fs") + npcName + LocaleBundle.getString("was_rem"));
          if (presetNPCs.contains(npcName)) {
            QuestX.logChat(
                p, LocaleBundle.getString("t_pp") + npcName + LocaleBundle.getString("was_rem"));
            presetNPCs.remove(npcName);
          }
        }

        FixedSpawnsDisplay.updateSoftReference();
        PresetPathsDisplay.updateSoftReference();

        return true;
      }
    }
  }
  public static final void deleteAllFixedSpawns(Player p, NPCHandler handle) {
    File spawn = FileLocator.getNPCFixedSpawnsFile(), pres = FileLocator.getNPCPresetPathingFile();
    if (spawn.canRead() && spawn.canWrite()) {
      if (spawn.exists()) {
        loader.read();
        for (SyncWrapper wrap : loader.getReadableData()) {
          SimpleNPC rem = handle.getSimpleNPCByName(wrap.getTag());
          if (rem != null) {
            rem.destroyNPCObject();
          }
        }
        spawn.delete();
        try {
          spawn.createNewFile();
          loader.add("NPC_COUNT", 0);
          loader.write();
          QuestX.logChat(p, LocaleBundle.getString("all_fxied_spawns_del"));
        } catch (IOException e) {
          QuestX.logChat(p, LocaleBundle.getString("error_del_fs_file"));
          e.printStackTrace();
        }
      } else {
        QuestX.logChat(p, LocaleBundle.getString("no_fs_file"));
      }
    } else {
      QuestX.logChat(p, LocaleBundle.getString("fs_file_locked"));
    }

    presetNPCs.clear();

    if (pres.canRead() && pres.canWrite()) {
      if (pres.exists()) {
        pres.delete();
        try {
          pres.createNewFile();
          io.clearWriteArray();
          io.add("NULL", 0);
          io.write();
          QuestX.logChat(p, LocaleBundle.getString("all_preset_del"));
        } catch (IOException e) {
          QuestX.logChat(p, LocaleBundle.getString("error_del_pp_file"));
          e.printStackTrace();
        }
      } else {
        QuestX.logChat(p, LocaleBundle.getString("no_pp_file"));
      }
    } else {
      QuestX.logChat(p, LocaleBundle.getString("pp_file_locked"));
    }

    FixedSpawnsDisplay.updateSoftReference();
    PresetPathsDisplay.updateSoftReference();
  }
  public static boolean removePresetPath(Player p, String npcName, NPCHandler handle) {
    if (!FileLocator.doesNPCNameExist(npcName)) {
      if (p != null) {
        QuestX.logChat(p, ChatColor.RED + LocaleBundle.getString("no_npc_name"));
      }
      return false;
    } else {
      if (!fixedSpawns.containsKey(npcName)) {
        if (p != null) {
          QuestX.logChat(p, LocaleBundle.getString("no_fixed_spawn"));
        }
        return false;
      } else {
        if (!presetNPCs.contains(npcName)) {
          QuestX.logChat(p, LocaleBundle.getString("no_preset_path"));
          return false;
        } else {
          io.read();
          io.clearWriteArray();
          io.clearReadArray();
          for (SyncWrapper wrap : loader.getReadableData()) {
            // copy all the data read, except the npc to remove
            if (!wrap.getTag().equalsIgnoreCase(npcName)) {
              io.add(wrap);
            }
          }
          io.write();

          presetNPCs.remove(npcName);

          SimpleNPC rem = handle.getSimpleNPCByName(npcName);
          if (rem != null) {
            rem.destroyNPCObject();
          }

          LoadNPCTemplate tmp = new LoadNPCTemplate(npcName);

          tmp.loadProperties();

          SimpleNPC npc =
              tmp.getLoadedNPCTemplate()
                  .registerSimpleNPCFixedSpawn(handle, fixedSpawns.get(npcName));

          npc.setAllowedToMove(true);

          PresetPathsDisplay.updateSoftReference();
          QuestX.logChat(p, ChatColor.GREEN + "Preset path for NPC " + npcName + " was removed.");
          return true;
        }
      }
    }
  }
  public static boolean addFixedNPCSpawn(Player p, String npcName, Location l, NPCHandler handle) {
    if (!FileLocator.doesNPCNameExist(npcName)) {
      if (p != null) {
        QuestX.logChat(p, ChatColor.RED + LocaleBundle.getString("no_npc_name"));
      }
      return false;
    } else {
      if (fixedSpawns.containsKey(npcName)) {
        if (p != null) {
          QuestX.logChat(p, LocaleBundle.getString("yes_fixed_spawn"));
        }
        return false;
      }
      SimpleNPC remove = handle.getSimpleNPCByName(npcName);
      if (remove != null) {
        remove.destroyNPCObject();
      }

      LoadNPCTemplate tmp = new LoadNPCTemplate(npcName);

      tmp.loadProperties();

      tmp.getLoadedNPCTemplate().registerSimpleNPCFixedSpawn(handle, l);

      loader.read();
      for (SyncWrapper wrap : loader.getReadableData()) {
        loader.add(wrap.getTag(), wrap.getObject());
      }
      loader.add(npcName, new SyncLocation(l));
      loader.write();
      loader.clearReadArray();
      loader.clearWriteArray();

      fixedSpawns.put(npcName, l);

      FixedSpawnsDisplay.updateSoftReference();

      if (p != null) {
        QuestX.logChat(p, LocaleBundle.getString("fixed_spawn_success") + npcName + "'.");
      }
      return true;
    }
  }
  public static boolean editFixedNPCSpawn(Player p, String npcName, NPCHandler handle) {
    if (!FileLocator.doesNPCNameExist(npcName)) {
      if (p != null) {
        QuestX.logChat(p, ChatColor.RED + "There is no NPC created with this name!");
      }
      return false;
    } else {
      if (!fixedSpawns.containsKey(npcName)) {
        if (p != null) {
          QuestX.logChat(p, LocaleBundle.getString("no_fixed_spawn"));
        }
        return false;
      } else {

        SimpleNPC rem = handle.getSimpleNPCByName(npcName);
        if (rem != null) {
          rem.destroyNPCObject();
        }

        loader.read();
        io.read();
        loader.clearWriteArray();
        for (SyncWrapper wrap : loader.getReadableData()) {
          // copy all the data read, except the npc to remove, set
          // this to be edited
          if (!wrap.getTag().equalsIgnoreCase(npcName)) {
            loader.add(wrap);
          } else {
            if (p != null) {
              loader.add(wrap.getTag(), new SyncLocation(p.getLocation()));
            }
          }
        }

        loader.write();
        loader.clearReadArray();
        loader.clearWriteArray();

        io.read();
        io.clearWriteArray();
        io.clearReadArray();
        for (SyncWrapper wrap : loader.getReadableData()) {
          // copy all the data read, except the npc to remove
          if (!wrap.getTag().equalsIgnoreCase(npcName)) {
            io.add(wrap);
          }
        }
        io.write();

        if (presetNPCs.contains(npcName)) {
          QuestX.logChat(p, "The preset path for NPC '" + npcName + "' was removed.");
          presetNPCs.remove(npcName);
        }

        LoadNPCTemplate tmp = new LoadNPCTemplate(npcName);

        tmp.loadProperties();

        SimpleNPC npc =
            tmp.getLoadedNPCTemplate().registerSimpleNPCFixedSpawn(handle, p.getLocation());

        npc.setAllowedToMove(true);

        if (p != null) {
          QuestX.logChat(
              p, "The fixed spawn for NPC '" + npcName + "' was changed to your current location.");
        }

        PresetPathsDisplay.updateSoftReference();

        return true;
      }
    }
  }