Exemplo n.º 1
0
        public override void Download()
        {
            ServicePointManager.DefaultConnectionLimit = 1000;
            MCVersion.InstallLaunchWrapper();
            var url             = this.Url;
            var versionText     = string.Format("{0}_{1}_{2}", this.MCVersion, this.Type, this.Patch);
            var jarname         = "Optifine-" + versionText + ".jar";
            var dirpath         = "optifine\\Optifine\\" + versionText + "\\";
            var downloadDirPath = LauncherMain.Instance.Settings.MinecraftFolderName + "libraries\\" + dirpath;

            if (!Directory.Exists(downloadDirPath))
            {
                Directory.CreateDirectory(downloadDirPath);
            }
            var path         = dirpath + jarname;
            var downloadPath = downloadDirPath + jarname;
            var manifest     = MinecraftManifest.AnalyzeFromVersion(this.MCVersion);

            using (var wc = new WebClient())
            {
                OnProgressChanged("开始下载。。", 0);
                wc.DownloadProgressChanged +=
                    (sender, args) => OnProgressChanged(null, (int)(args.ProgressPercentage * 0.8));
                Task downloadTask = wc.DownloadFileTaskAsync(url, downloadPath);
                while (!downloadTask.IsCompleted)
                {
                    Thread.Sleep(500);
                }
            }
            OnProgressChanged("正在添加依赖项。。。", 80);
            var library = new MinecraftLibrary();

            library.name                    = dirpath.Substring(0, dirpath.Length - 1).Replace('\\', ':');
            library.downloads               = new LibraryDownloads();
            library.downloads.artifact      = new DownloadInfo();
            library.downloads.artifact.path = path.Replace('\\', '/');
            library.downloads.artifact.url  = url;
            manifest.libraries.Add(library);
            if (manifest.minecraftArguments == null)
            {
                manifest.arguments.game.Add("--tweakClass");
                manifest.arguments.game.Add("optifine.OptiFineTweaker");
            }
            else
            {
                manifest.minecraftArguments += " --tweakClass optifine.OptiFineTweaker";
            }

            OnProgressChanged(null, 100);
            MCVersion.SaveManifest(manifest);
        }
Exemplo n.º 2
0
        public MinecraftLaunchMaker(MinecraftVersion version, string PlayerName, ConsoleWindow LogWindow)
        {
            Version         = version;
            this.LogWindow  = LogWindow;
            this.PlayerName = PlayerName;
            manifest        = MinecraftManifest.AnalyzeFromVersion(Version);
            GameDir         = LauncherMain.Instance.Settings.MinecraftFolderName;
            AssetsRoot      = GameDir + "assets\\";
            AssetsRoot      = AssetsRoot.Substring(AssetsRoot.IndexOf('\\') + 1);
            LibRoot         = GameDir + "libraries\\";
            UserType        = "mojang";
            var jrepath = LauncherMain.Instance.Settings.JREPath;

            if (jrepath.Last() != '\\')
            {
                jrepath += '\\';
            }
            JavaExe   = jrepath + "bin\\java.exe";
            ClassPath = this.GenerateClassPath();
        }
Exemplo n.º 3
0
        public override void Download()
        {
            ServicePointManager.DefaultConnectionLimit = 1000;
            var jsonURL   = this.Url;
            var id        = this.Id;
            var MCVersion = new MinecraftVersion(id);

            Directory.CreateDirectory(MCVersion.VersionDirectory);
            MinecraftManifest info;

            // Solve json and download jar
            using (WebClient wc = new WebClient())
            {
                wc.Proxy = null;
                wc.DownloadFile(jsonURL, MCVersion.VersionManifestPath);
                info = MinecraftManifest.AnalyzeFromVersion(MCVersion);
                OnProgressChanged("已获取版本下载信息", 0);
                string jarloc = info.downloads.client.url;
                if (UseBMCLAPI)
                {
                    jarloc = string.Format("https://bmclapi2.bangbang93.com/version/{0}/client", id);
                }
                var DownloadHasDone = false;
                OnProgressChanged(string.Format("正在从{0}下载{1}.jar", jarloc, id), 0);
                wc.DownloadProgressChanged += (sender, e) => OnProgressChanged(null, e.ProgressPercentage);
                wc.DownloadFileCompleted   += (sender, e) => DownloadHasDone = true;
                wc.DownloadFileAsync(new Uri(jarloc), MCVersion.JarPath);
                while (!DownloadHasDone)
                {
                    Thread.Sleep(500);
                }
                OnProgressChanged("minecraft.jar已下载", 0);
            }
            // Analyze libraries and download
            OnProgressChanged("开始分析需要下载的前置库和本地化前置", 0);
            DownloadLibraries(info, MCVersion);
            OnProgressChanged("开始下载资源文件", 0);
            DownloadAssets(info);
            LauncherMain.Instance.AddMinecraftVersion(MCVersion);
        }
Exemplo n.º 4
0
        private void DownloadAssets(MinecraftManifest info)
        {
            var assetsFolder = MinecraftFolderName + "assets\\";

            if (!Directory.Exists(assetsFolder))
            {
                Directory.CreateDirectory(assetsFolder);
            }
            var indexesFolder = assetsFolder + "indexes\\";

            if (!Directory.Exists(indexesFolder))
            {
                Directory.CreateDirectory(indexesFolder);
            }
            var objectsFolder = assetsFolder + "objects\\";

            if (!Directory.Exists(objectsFolder))
            {
                Directory.CreateDirectory(objectsFolder);
            }
            var id        = info.assetIndex.id;
            var url       = info.assetIndex.url;
            var indexPath = indexesFolder + id + ".json";

            if (!File.Exists(indexPath))
            {
                OnProgressChanged("正在下载并解析资源目录", 0);
                var seri = new JavaScriptSerializer();
                Dictionary <string, Dictionary <string, Dictionary <string, object> > > dict;
                using (var wc = new WebClient())
                {
                    dict = seri.Deserialize <Dictionary <string, Dictionary <string, Dictionary <string, object> > > >(wc.DownloadString(url));
                }
                var sw = new StreamWriter(new FileStream(indexPath, FileMode.Create));
                sw.Write(seri.Serialize(dict));
                sw.Close();
                OnProgressChanged("正在下载资源文件", 0);
                var       objects         = dict["objects"];
                const int MAX_DOWNLOADING = 100;
                int       downloading     = 0;
                int       downloaded      = 0;
                int       needDownload    = 0;
                foreach (var kvpair in objects)
                {
                    var resName   = kvpair.Key;
                    var resInfo   = kvpair.Value;
                    var hash      = (string)resInfo["hash"];
                    var hashPath  = hash.Substring(0, 2) + '\\' + hash;
                    var hashurl   = MinecraftAssetsURL + hashPath;
                    var localPath = objectsFolder + hashPath;
                    if (!Directory.Exists(objectsFolder + hash.Substring(0, 2)))
                    {
                        Directory.CreateDirectory(objectsFolder + hash.Substring(0, 2));
                    }
                    while (downloading >= MAX_DOWNLOADING)
                    {
                        Thread.Sleep(10);
                    }
                    var wc = new WebClient();
                    wc.DownloadFileCompleted += (a, b) =>
                    {
                        downloaded++;
                        OnProgressChanged(string.Format("已下载{0}。。。", resName), (int)((downloaded / (float)objects.Count) * 100));
                        wc.Dispose();
                        downloading--;
                    };
                    wc.DownloadProgressChanged += (o, e) => Debug.WriteLine(string.Format("{0} Downloaded {1}", resName, e.ProgressPercentage));
                    wc.DownloadFileAsync(new Uri(hashurl), localPath);
                    needDownload++;
                    downloading++;
                }
                while (downloaded < needDownload)
                {
                    Thread.Sleep(500);
                }
            }
        }
Exemplo n.º 5
0
        private void DownloadLibraries(MinecraftManifest info, MinecraftVersion MCVersion)
        {
            List <MinecraftLibrary> libraries = info.libraries;
            var libFolder         = MinecraftFolderName + "libraries\\";
            int AllDownloadCount  = 0;
            int DownloadedCount   = 0;
            var nativesAccessLock = new object();

            foreach (var lib in libraries)
            {
                bool NeedThisLib = true;
                if (lib.rules != null)
                {
                    var rules = lib.rules;
                    foreach (var rule in rules)
                    {
                        if (!rule.Allowed)
                        {
                            NeedThisLib = false;
                            break;
                        }
                    }
                }
                if (NeedThisLib)
                {
                    var downloads = lib.downloads;
                    if (lib.natives != null)
                    {
                        var natives     = lib.natives;
                        var classifier  = natives["windows"].Replace("${arch}", Environment.Is64BitOperatingSystem ? "64" : "86");
                        var classifiers = downloads.classifiers;
                        var item        = classifiers[classifier].Clone() as DownloadInfo;
                        var path        = (libFolder + item.path).Replace('/', '\\');
                        if (!File.Exists(path))
                        {
                            if (UseBMCLAPI)
                            {
                                item.url = "https://bmclapi2.bangbang93.com/libraries/" + item.path;
                            }
                            AllDownloadCount++;
                            item.DownloadAsync(path, (sender, arg) =>
                            {
                                var NativesPath = MCVersion.NativesPath;
                                Directory.CreateDirectory(NativesPath);
                                lock (nativesAccessLock)
                                {
                                    var zip = ZipFile.Open(path, ZipArchiveMode.Read);
                                    zip.ExtractToDirectory(NativesPath);
                                    if (Directory.Exists(NativesPath + "META-INF\\"))
                                    {
                                        Directory.Delete(NativesPath + "META-INF\\", true);
                                    }
                                }
                                DownloadedCount++;
                            });
                            OnProgressChanged(string.Format("开始从{0}下载文件。。。", item.url), 0);
                        }
                        else
                        {
                            var NativesPath = MCVersion.NativesPath;
                            Directory.CreateDirectory(NativesPath);
                            lock (nativesAccessLock)
                            {
                                var zip = ZipFile.Open(path, ZipArchiveMode.Read);
                                zip.ExtractToDirectory(NativesPath);
                                if (Directory.Exists(NativesPath + "META-INF\\"))
                                {
                                    Directory.Delete(NativesPath + "META-INF\\", true);
                                }
                            }
                        }
                    }
                    if (downloads.artifact != null)
                    {
                        var artifact = downloads.artifact.Clone() as DownloadInfo;
                        var path     = (libFolder + artifact.path).Replace('/', '\\');
                        if (!File.Exists(path))
                        {
                            if (UseBMCLAPI)
                            {
                                artifact.url = "https://bmclapi2.bangbang93.com/libraries/" + artifact.path;
                            }
                            AllDownloadCount++;
                            artifact.DownloadAsync(path, (sender, arg) =>
                            {
                                DownloadedCount++;
                            });
                            OnProgressChanged(string.Format("开始从{0}下载文件。。。", artifact.url), 0);
                        }
                    }
                }
            }
            while (DownloadedCount != AllDownloadCount)
            {
                OnProgressChanged(null, (int)((DownloadedCount / (double)AllDownloadCount) * 100));
                Thread.Sleep(500);
            }
        }
Exemplo n.º 6
0
        public override void Download()
        {
            bool NeedBranchName = !NetUtils.IsUrlExists(Url);

            if (NeedBranchName)
            {
                Url = string.Format(
                    "http://files.minecraftforge.net/maven/net/minecraftforge/forge/{0}-{1}-{0}/forge-{0}-{1}-{0}-universal.jar",
                    MCVersion.VersionName,
                    ForgeVersion
                    );
            }
            if (UseBMCL)
            {
                Url = Url.Replace("files.minecraftforge.net", "bmclapi2.bangbang93.com");
            }
            OnProgressChanged("正在检查launchwrapper安装情况并确保安装", 0);
            MCVersion.InstallLaunchWrapper();
            string jarfile, folder;

            if (NeedBranchName)
            {
                jarfile = string.Format("forge-{0}-{1}-{0}.jar", this.MCVersion.VersionName, this.ForgeVersion);
                folder  = string.Format("net/minecraftforge/forge/{0}-{1}-{0}/", this.MCVersion.VersionName, this.ForgeVersion);
            }
            else
            {
                jarfile = string.Format("forge-{0}-{1}.jar", this.MCVersion.VersionName, this.ForgeVersion);
                folder  = string.Format("net/minecraftforge/forge/{0}-{1}/", this.MCVersion.VersionName, this.ForgeVersion);
            }
            var location     = folder + jarfile;
            var realLocation = LauncherMain.Instance.Settings.MinecraftFolderName + "libraries\\" + location.Replace('/', '\\');
            var realFolder   = LauncherMain.Instance.Settings.MinecraftFolderName + "libraries\\" + folder.Replace('/', '\\');

            if (!Directory.Exists(realFolder))
            {
                Directory.CreateDirectory(realFolder);
            }
            using (var wc = new WebClient())
            {
                OnProgressChanged("开始下载" + jarfile, 0);
                bool downloaded = false;
                wc.DownloadFileCompleted += (o, e) =>
                {
                    downloaded = true;
                    wc.Dispose();
                };
                wc.DownloadProgressChanged += (o, e) => OnProgressChanged(null, e.ProgressPercentage);
                wc.DownloadFileAsync(new Uri(this.Url), realLocation);
                while (!downloaded)
                {
                    Thread.Sleep(100);
                }
            }
            var zip = ZipFile.Open(realLocation, ZipArchiveMode.Read);
            var versionlistentry = zip.GetEntry("version.json");
            var sr   = new StreamReader(versionlistentry.Open());
            var json = sr.ReadToEnd();

            sr.Close();
            zip.Dispose();
            var matches         = Regex.Matches(json, "\"name\"\\s*:\\s*\"(.*?)\"");
            var manifest        = MinecraftManifest.AnalyzeFromVersion(MCVersion);
            int needDownload    = 0;
            int downloadedCount = 0;

            foreach (Match match in matches)
            {
                var groups  = EnumeratorUtils.MakeListFromEnumerator(match.Groups.GetEnumerator());
                var libname = ((Group)groups[1]).Value;
                var names   = new List <string>(libname.Split(':'));
                if (names[1] != "launchwrapper")
                {
                    manifest.libraries.RemoveAll(m =>
                    {
                        var ns = m.name.Split(':');
                        return(ns[1] == names[1]);
                    });
                    var fnames = names[0].Split('.');
                    names.RemoveAt(0);
                    names.InsertRange(0, fnames);
                    string url;
                    if (this.UseBMCL)
                    {
                        url = "http://bmclapi2.bangbang93.com/maven/";
                    }
                    else
                    {
                        if (Regex.IsMatch(
                                json,
                                string.Format(
                                    "\"name\"\\s*:\\s*\"{0}\"\\n" +
                                    "\\s*?\"url\"\\s*:\\s*\"http://files\\.minecraftforge\\.net/maven/\"",
                                    libname.Replace(".", "\\.")
                                    )
                                ))
                        {
                            url = "http://files.minecraftforge.net/maven/";
                        }
                        else
                        {
                            url = "https://libraries.minecraft.net/";
                        }
                    }
                    url += string.Join("/", names);
                    var jarname = names[names.Count - 2] + "-" + names[names.Count - 1] + ".jar";
                    url += "/" + jarname;
                    var localDir = LauncherMain.Instance.Settings.MinecraftFolderName + "libraries\\" + string.Join("\\", names) + "\\";
                    if (!Directory.Exists(localDir))
                    {
                        Directory.CreateDirectory(localDir);
                    }
                    var localLoc = localDir + jarname;
                    if (!File.Exists(localLoc))
                    {
                        var wc = new WebClient();
                        wc.DownloadFileCompleted += (o, e) =>
                        {
                            downloadedCount++;
                            OnProgressChanged(jarname + "已下载", (int)(downloadedCount / (double)needDownload * 100));
                            wc.Dispose();
                        };
                        wc.DownloadProgressChanged += (o, e) =>
                                                      Debug.WriteLine(string.Format("{0} Downloaded {1}", jarname, e.ProgressPercentage));
                        wc.DownloadFileAsync(new Uri(url), localLoc);
                    }
                    var library = new MinecraftLibrary
                    {
                        name = libname
                    };
                    manifest.libraries.Add(library);
                    needDownload++;
                }
            }
            while (needDownload != downloadedCount)
            {
                Thread.Sleep(100);
            }
            if (manifest.arguments == null)
            {
                manifest.minecraftArguments += " --tweakClass cpw.mods.fml.common.launcher.FMLTweaker";
            }
            else
            {
                manifest.arguments.game.Add("--tweakClass");
                manifest.arguments.game.Add("cpw.mods.fml.common.launcher.FMLTweaker");
            }
            MCVersion.SaveManifest(manifest);
        }
Exemplo n.º 7
0
        public override List <DownloadItem> GetAllItemsToDownload()
        {
            var list     = new List <DownloadItem>();
            var manifest = MinecraftManifest.AnalyzeFromVersion(this.Version);
            var id       = manifest.id;

            downloadVersionInfos = new List <OptifineDownloadItem>();
            using (var wc = new WebClient())
            {
                if (UseBMCL)
                {
                    var jsonurl  = string.Format(BMCLAPI_OPTIFINE_LIST_FORMAT, id);
                    var seri     = new JavaScriptSerializer();
                    var itemList = seri.Deserialize <List <BMCLOptifineDownloadItem> >(
                        wc.DownloadString(jsonurl)
                        );
                    foreach (var item in itemList)
                    {
                        var MCVersion = this.Version;
                        var Type      = item.type;
                        var Patch     = item.patch;
                        var Url       = string.Format(
                            "https://bmclapi2.bangbang93.com/optifine/{0}/{1}/{2}",
                            item.mcversion,
                            item.type,
                            item.patch
                            );
                        var listItem = new OptifineDownloadItem(MCVersion, Type, Patch, Url);
                        downloadVersionInfos.Add(listItem);
                        list.Add(listItem);
                    }
                }
                else
                {
                    var   downloads = wc.DownloadString(OPTIFINE_OFFICAL_DOWNLOADS);
                    Match main      = Regex.Match(
                        downloads,
                        string.Format("<h2>Minecraft {0}</h2>((.|\n)*?)</table>", id.Replace(".", "\\."))
                        );
                    MatchCollection matches = Regex.Matches(
                        main.Value,
                        "<tr class='downloadLine.*?'>\\n<td class='downloadLineFile.*?'>(.*?)</td>\\n<td class='downloadLineDownload.*?'><a href=.*?>Download</a></td>\\n<td class='downloadLineMirror'><a href=\"(.*?)\">&nbsp; \\(mirror\\)</a></td>"
                        );
                    foreach (Match match in matches)
                    {
                        var groups = EnumeratorUtils.MakeListFromEnumerator(
                            match.Groups.GetEnumerator()
                            );
                        var name   = ((Group)groups[1]).Value;
                        var mirror = ((Group)groups[2]).Value;
                        var t      = EnumeratorUtils.MakeListFromEnumerator(
                            Regex.Match(
                                mirror,
                                "http://optifine.net/adloadx\\?f=(.*)"
                                ).Groups.GetEnumerator()
                            );
                        var jar    = ((Group)t[1]).Value;
                        var adsite = wc.DownloadString(mirror);
                        var uri    = Regex.Match(adsite, string.Format("downloadx\\?f={0}&x=.*?'", jar.Replace(".", "\\."))).Value;
                        uri = uri.Substring(0, uri.Length - 1);
                        var url   = "https://optifine.net/" + uri;
                        var args  = name.Split(' ');
                        var type  = args[2] + "_" + args[3];
                        var patch = args[4];
                        var info  = new OptifineDownloadItem(Version, type, patch, url);
                        downloadVersionInfos.Add(info);
                        list.Add(info);
                    }
                }
            }
            return(list);
        }