private static IEnumerator DownloadAvatarFav(string avatarfavPath) { VRCUiPopupManagerUtils.ShowPopup("AvatarFav Updater", "Updating AvatarFav", "Quit", () => Application.Quit(), (popup) => { if (popup.popupProgressFillImage != null) { popup.popupProgressFillImage.enabled = true; popup.popupProgressFillImage.fillAmount = 0f; downloadProgressFillImage = popup.popupProgressFillImage; } }); WWW vrctoolsDownload = new WWW(ModValues.avatarfavDownloadLink); yield return(vrctoolsDownload); while (!vrctoolsDownload.isDone) { VRCModLogger.Log("[AvatarFavUpdater] Download progress: " + vrctoolsDownload.progress); downloadProgressFillImage.fillAmount = vrctoolsDownload.progress; yield return(null); } int responseCode = WebRequestsUtils.GetResponseCode(vrctoolsDownload); VRCModLogger.Log("[AvatarFavUpdater] Download done ! response code: " + responseCode); VRCModLogger.Log("[AvatarFavUpdater] File size: " + vrctoolsDownload.bytes.Length); if (responseCode == 200) { VRCUiPopupManagerUtils.ShowPopup("AvatarFav Updater", "Saving AvatarFav"); VRCModLogger.Log("[AvatarFavUpdater] Saving file"); File.WriteAllBytes(avatarfavPath, vrctoolsDownload.bytes); VRCModLogger.Log("[AvatarFavUpdater] Showing restart dialog"); bool choiceDone = false; VRCUiPopupManagerUtils.ShowPopup("AvatarFav Updater", "Update downloaded", "Restart", () => { choiceDone = true; }); yield return(new WaitUntil(() => choiceDone)); VRCUiPopupManagerUtils.ShowPopup("AvatarFav Updater", "Restarting game"); string args = ""; foreach (string arg in Environment.GetCommandLineArgs()) { args = args + arg + " "; } VRCModLogger.Log("[AvatarFavUpdater] Rebooting game with args " + args); Thread t = new Thread(() => { Thread.Sleep(1000); System.Diagnostics.Process.Start(Path.GetDirectoryName(Path.GetDirectoryName(avatarfavPath)) + "\\VRChat.exe", args); Thread.Sleep(100); }); t.Start(); Application.Quit(); } else { VRCUiPopupManagerUtils.ShowPopup("AvatarFav Updater", "Unable to update VRCTools: Server returned code " + responseCode, "Quit", () => Application.Quit()); } }