getAssets method

Future getAssets ()

Implementation

Future getAssets() async {

  String dir = path.join(root, 'assets', 'indexes').replaceAll("\\", "/");
  await createDirIfNotExists(dir);
  String assetIndex = path.join(dir, "${this.version["assetIndex"]["id"]}.json");

  if(!File(assetIndex).existsSync()) {
    await downloadFile(this.version["assetIndex"]["url"], path.join(root, 'assets', 'indexes', "${this.version["assetIndex"]["id"]}.json"));
  }

  Map<String,dynamic> index = json.decode(File(assetIndex).readAsStringSync());

  List<void Function()> funcs = [];
  List<Map<String,String>> infos = [];

  index["objects"].forEach((key, value) {
    String hash = value["hash"];
    String subhash = hash.substring(0,2);
    String assetDirectory = path.join(root, 'assets');
    String subAsset = path.join(assetDirectory, 'objects', subhash);
    if(!File(path.join(subAsset, hash)).existsSync()) {
      funcs.add(() async {
        await createDirIfNotExists(subAsset);
        await downloadFile('https://resources.download.minecraft.net/${subhash}/${hash}', path.join(subAsset,hash));
      });
      infos.add({"file": key, "hash": hash, "subhash": subhash});
    };
  });
  if(funcs.length > 0) {
    AdvancedProgressBar progress = AdvancedProgressBar(max: funcs.length, value: 0);
    progress.update(value: 0);

    for(int i=0;i<funcs.length;i++) {
      progress.update(actual: "| downloading asset asset: ${infos[i]["subhash"]}/${infos[i]["hash"]}: (${infos[i]["file"]})...");
      await funcs[i]();
      progress.update(value: i + 1);
    }

    progress.kill();
  }
}