public boolean deleteGenericStructure(String structureName, boolean activeFolder) {
    try {
      File parent = RCFileTypeRegistry.getStructuresDirectory(activeFolder);
      return parent != null
          && (new File(parent, structureName + "." + FILE_SUFFIX).delete()
              || /* Legacy */ new File(parent, structureName + ".zip").delete());
    } catch (Throwable e) {
      RecurrentComplex.logger.error("Error when deleting structure", e);
    }

    return false;
  }
  public boolean saveGenericStructure(
      GenericStructureInfo info, String structureName, boolean activeFolder) {
    File parent = RCFileTypeRegistry.getStructuresDirectory(activeFolder);
    if (parent != null) {
      String json = registry.createJSONFromStructure(info);

      if (RecurrentComplex.USE_ZIP_FOR_STRUCTURE_FILES) {
        File newFile = new File(parent, structureName + "." + FILE_SUFFIX);
        boolean failed = false;

        try {
          ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream(newFile));

          addZipEntry(zipOutputStream, STRUCTURE_INFO_JSON_FILENAME, json.getBytes());
          addZipEntry(
              zipOutputStream,
              WORLD_DATA_NBT_FILENAME,
              CompressedStreamTools.compress(info.worldDataCompound));

          zipOutputStream.close();
        } catch (Exception ex) {
          RecurrentComplex.logger.error("Could not write structure to zip file", ex);
          failed = true;
        }

        return !failed && newFile.exists();
      } else {
        File newFile = new File(parent, structureName + ".json");
        boolean failed = false;

        try {
          FileUtils.writeStringToFile(newFile, json);
        } catch (Exception e) {
          RecurrentComplex.logger.error("Could not write structure zip to folder", e);
          failed = true;
        }

        return !failed && newFile.exists();
      }
    }

    return false;
  }