Exemplo n.º 1
0
        private void Launch_Click(object sender, EventArgs e)
        {
            saveChange();
            if (!File.Exists(Application.StartupPath + "\\" + Nick.Text + ".authL"))
            {
                Guid G = Guid.NewGuid();
                File.WriteAllLines(Application.StartupPath + "\\" + Nick.Text + ".authL", new string[] { G.ToString(), G.ToString() });
            }
            JSONObject    jo   = new JSONObject(File.ReadAllText(Application.StartupPath + "\\JLConfig.json"));
            MCLaunchArgs  mcla = new MCLaunchArgs();
            YggDrasilAuth yda  = new YggDrasilAuth();
            JSONObject    mca  = jo.getJSONObject("MCLSettings");
            JSONArray     ya   = jo.getJSONArray("YggDrasilLogin");

            mcla.MaxMem = short.Parse(mca.getString("MaxMemorySize"));
            mcla.Nick   = jo.getString("Nick");
            JSONObject[] yas = ya.toJSONObjects();
            JSONObject   yt  = new JSONObject();

            foreach (JSONObject yd in yas)
            {
                if (yd.getObject("Selected") == "True")
                {
                    yt = yd;
                }
            }
            yda.UserName      = yt.getString("UserName");
            yda.Password      = yt.getString("Password");
            yda.Yggauth       = Boolean.Parse(mca.getObject("doYgg"));
            mcla.JrePath      = mca.getString("JrePath");
            mcla.ExtraJreArgs = mca.getString("ExtraJreArgs");
            if (mca.getObject("doServerC") == "True")
            {
                mcla.ExtraMCArgs = mcla.ExtraMCArgs + "--server " + mca.getString("ServerIp").Split(":".ToCharArray())[0] + " --port " + mca.getString("ServerIp").Split(":".ToCharArray())[1] + " ";
            }
            if (mca.getObject("FullScreen") == "True")
            {
                mcla.ExtraMCArgs = mcla.ExtraMCArgs + "--fullscreen ";
            }
            if (mca.getObject("Demo") == "True")
            {
                mcla.ExtraMCArgs = mcla.ExtraMCArgs + "--demo ";
            }
            mcla.ExtraMCArgs = mcla.ExtraMCArgs + "--width " + mca.getObject("WindowWidth") + " --height " + mca.getObject("WindowHeight") + " ";
            mcla.ExtraMCArgs = mcla.ExtraMCArgs + mca.getString("ExtraMCArgs");
            mcla.CurrentDir  = jo.getString("CurrentDir");
            mcla.VerName     = jo.getString("SelectedVersion");
            yda.uuid         = File.ReadAllLines(Application.StartupPath + "\\" + Nick.Text + ".authL")[0];
            yda.accessToken  = File.ReadAllLines(Application.StartupPath + "\\" + Nick.Text + ".authL")[1];
            this.Enabled     = false;
            this.Text        = "果汁启动器正在启动……";
            label3.Text      = "果汁启动器正在启动……";
            new Launcher().LaunchMC(mcla, yda);
        }
Exemplo n.º 2
0
        public LauncherReturn LaunchMC(MCLaunchArgs argument, YggDrasilAuth auth, int whatToReturn = 0)
        {
            auth.Login();
            LauncherReturn    lr     = new LauncherReturn();
            JSONObject        jo     = new JSONObject(File.ReadAllText(argument.CurrentDir.Replace(".\\", Application.StartupPath + "\\").Replace("./", Application.StartupPath + "/") + "\\versions\\" + argument.VerName + "\\" + argument.VerName + ".json"));
            String            Libcmd = "";
            List <JSONObject> libs   = new List <JSONObject>();

            libs.AddRange(jo.getJSONArray("libraries").toJSONObjects());
            JSONObject ji  = jo;
            string     jar = argument.VerName;

            #region 处理继承
            if (jo.Contains("inheritsFrom"))
            {
                jar = jo.getString("jar");
                ji  = new JSONObject(File.ReadAllText(argument.CurrentDir.Replace(".\\", Application.StartupPath + "\\").Replace("./", Application.StartupPath + "/") + "\\versions\\" + jo.getString("inheritsFrom") + "\\" + jo.getString("inheritsFrom") + ".json"));
                libs.AddRange(ji.getJSONArray("libraries").toJSONObjects());
                if (ji.Contains("inheritsFrom"))
                {
                    ji = new JSONObject(File.ReadAllText(argument.CurrentDir.Replace(".\\", Application.StartupPath + "\\").Replace("./", Application.StartupPath + "/") + "\\versions\\" + ji.getString("inheritsFrom") + "\\" + ji.getString("inheritsFrom") + ".json"));
                    libs.AddRange(ji.getJSONArray("libraries").toJSONObjects());
                    if (ji.Contains("inheritsFrom"))
                    {
                        ji = new JSONObject(File.ReadAllText(argument.CurrentDir.Replace(".\\", Application.StartupPath + "\\").Replace("./", Application.StartupPath + "/") + "\\versions\\" + ji.getString("inheritsFrom") + "\\" + ji.getString("inheritsFrom") + ".json"));
                        libs.AddRange(ji.getJSONArray("libraries").toJSONObjects());
                    }
                }
            }
            #endregion
            #region 处理库
            String          lnsuffix = "";
            List <TaskToDo> tl       = new List <TaskToDo>();
            foreach (JSONObject libdata in libs)
            {
                String[] libname = libdata.getString("name").Split(":".ToCharArray());
                if (libdata.Contains("natives") && libdata.getJSONObject("natives").Contains("windows"))
                {
                    lnsuffix = "-" + libdata.getJSONObject("natives").getString("windows");
                    lnsuffix = lnsuffix.Replace("${arch}", "32");
                }
                String libpath = argument.CurrentDir.Replace(".\\", Application.StartupPath + "\\") + "\\libraries\\" + libname[0].Replace(".", "\\") + "\\" + libname[1] + "\\" + libname[2] + "\\" + libname[1] + "-" + libname[2] + lnsuffix + ".jar";
                if (Libcmd.Contains(libpath))
                {
                    continue;
                }
                if (File.Exists(libpath))
                {
                    if (libdata.Contains("extract"))
                    {
                        Unzipper.decompress(libpath, argument.CurrentDir.Replace(".\\", Application.StartupPath + "\\") + "\\versions\\" + argument.VerName + "\\" + argument.VerName + "-natives");
                    }
                    else
                    {
                        Libcmd = Libcmd + libpath + ";";
                    }
                }
                else
                {
                    TaskToDo ttd = new TaskToDo();
                    ttd.Type  = "Download";
                    ttd.param = "http://bmclapi2.bangbang93.com/libraries/" + libname[0].Replace(".", "/") + "/" + libname[1] + "/" + libname[2] + "/" + libname[1] + "-" + libname[2] + lnsuffix + ".jar;" + libpath;
                    tl.Add(ttd);
                }
                lnsuffix = "";
            }
            #endregion
            #region 处理资源文件
            bool virt = false;
            if (jo.Contains("assets") && !jo.Contains("assetIndex"))
            {
                var I = new JSONObject();
                I.putString("id", jo.getString("assets"));
                jo.putJSONObject("assetIndex", I);
                ji = jo;
            }
            if (!File.Exists(argument.CurrentDir.Replace(".\\", Application.StartupPath + "\\") + "\\assets\\indexes\\" + ji.getJSONObject("assetIndex").getString("id") + ".json"))
            {
                TaskToDo tt = new TaskToDo();
                tt.Type  = "Download";
                tt.param = ji.getJSONObject("assetIndex").getString("url") + ";" + argument.CurrentDir.Replace(".\\", Application.StartupPath + "\\") + "\\assets\\indexes\\" + ji.getJSONObject("assetIndex").getString("id") + ".json";
                tl.Add(tt);
            }
            else
            {
                JSONObject    joa    = new JSONObject(File.ReadAllText(argument.CurrentDir.Replace(".\\", Application.StartupPath + "\\") + "\\assets\\indexes\\" + ji.getJSONObject("assetIndex").getString("id") + ".json"));
                List <string> files  = joa.getJSONObject("objects").getKeys();
                List <string> hashes = new List <string>();
                virt = joa.Contains("virtual");
                JSONObject job = joa.getJSONObject("objects");
                foreach (string keyf in files)
                {
                    hashes.Add(job.getJSONObject(keyf).getString("hash"));
                }
                bool   lackasset = false;
                string fp, nfp;
                nfp = argument.CurrentDir.Replace(".\\", Application.StartupPath + "\\") + "\\assets\\virtual\\" + ji.getJSONObject("assetIndex").getString("id");
                for (int j = 0; j < files.Count; j++)
                {
                    fp = argument.CurrentDir.Replace(".\\", Application.StartupPath + "\\") + "\\assets\\objects\\" + hashes[j].Substring(0, 2) + "\\" + hashes[j];
                    if (virt)
                    {
                        if (!File.Exists(nfp + "\\" + files[j].Replace("/", "\\")))
                        {
                            lackasset = true;
                            break;
                        }
                    }
                    else
                    {
                        if (!File.Exists(fp))
                        {
                            lackasset = true;
                            break;
                        }
                    }
                }
                if (lackasset)
                {
                    if (MessageBox.Show("资源文件不完整,是否补全?", "提示", MessageBoxButtons.YesNo) == DialogResult.Yes)
                    {
                        for (int j = 0; j < files.Count; j++)
                        {
                            if (virt)
                            {
                                if (!File.Exists(nfp + "\\" + files[j].Replace("/", "\\")))
                                {
                                    TaskToDo to = new TaskToDo();
                                    to.Type  = "Download";
                                    to.param = "http://bmclapi2.bangbang93.com/assets/" + hashes[j].Substring(0, 2) + "/" + hashes[j] + ";" + nfp + "\\" + files[j].Replace("/", "\\");
                                    tl.Add(to);
                                }
                            }
                            else
                            {
                                fp = argument.CurrentDir.Replace(".\\", Application.StartupPath + "\\") + "\\assets\\objects\\" + hashes[j].Substring(0, 2) + "\\" + hashes[j];
                                if (!File.Exists(fp))
                                {
                                    TaskToDo to = new TaskToDo();
                                    to.Type  = "Download";
                                    to.param = "http://bmclapi2.bangbang93.com/assets/" + hashes[j].Substring(0, 2) + "/" + hashes[j] + ";" + fp;
                                    tl.Add(to);
                                }
                            }
                        }
                    }
                }
            }
            #endregion
            if (tl.Count != 0)
            {
                ShowTask st = new ShowTask(tl.ToArray());
                st.yda  = auth;
                st.mcla = argument;
                st.wtr  = whatToReturn;
                if (whatToReturn == 0)
                {
                    st.onTaskCompleteA += new ShowTask.onTaskCompleteEventHandler(LaunchMC);
                }
                st.beginTask();
                lr.rtv = "缺少文件,正在下载。";
                return(lr);
            }
            try
            {
                Directory.Delete(argument.CurrentDir.Replace(".\\", Application.StartupPath + "\\") + "\\versions\\" + argument.VerName + "\\" + argument.VerName + "-natives\\META-INF", true);
            }
            catch (DirectoryNotFoundException ex)
            {
            }
            Libcmd = Libcmd + argument.CurrentDir.Replace(".\\", Application.StartupPath + "\\").Replace("./", Application.StartupPath + "/") + "\\versions\\" + jar + "\\" + jar + ".jar";
            String RunCommand;
            if (auth.Nick != "")
            {
                argument.Nick = auth.Nick;
            }
            String minecraftArguments = "";
            if (jo.Contains("minecraftArguments"))
            {
                minecraftArguments = jo.getString("minecraftArguments");
            }
            else if (jo.Contains("arguments"))
            {
                JSONObject ag   = jo.getJSONObject("arguments");
                var        gmja = ag.getJSONArray("game");
                var        gl   = gmja.length();
                for (int l = 0; l < gl; l++)
                {
                    if (gmja.getString(l).Contains(","))
                    {
                        continue;
                    }
                    minecraftArguments = minecraftArguments + gmja.getString(l).Replace("\n", "").Replace(" ", "") + " ";
                }
                minecraftArguments = minecraftArguments.Substring(0, minecraftArguments.Length - 1);
            }
            minecraftArguments = minecraftArguments.Replace("${auth_player_name}", argument.Nick).Replace("${version_name}", "JuicyLauncher_2").Replace("${game_directory}", "\"" + argument.CurrentDir.Replace(".\\", Application.StartupPath + "\\").Replace("./", Application.StartupPath + "/") + "\"").Replace("${assets_index_name}", ji.getJSONObject("assetIndex").getString("id")).Replace("${auth_uuid}", auth.uuid).Replace("${auth_access_token}", auth.accessToken).Replace("${user_type}", auth.UserType).Replace("${version_type}", "JuicyLauncher_2").Replace("${user_properties}", auth.userProperties.toString()).Replace("${game_assets}", "${assets_root}");

            if (virt == true)
            {
                minecraftArguments = minecraftArguments.Replace("${assets_root}", "\"" + argument.CurrentDir.Replace(".\\", Application.StartupPath + "\\").Replace("./", Application.StartupPath + "/") + "\\assets\\virtual\\" + ji.getJSONObject("assetIndex").getString("id") + "\"");
            }
            else
            {
                minecraftArguments = minecraftArguments.Replace("${assets_root}", "\"" + argument.CurrentDir.Replace(".\\", Application.StartupPath + "\\").Replace("./", Application.StartupPath + "/") + "\\assets\"");
            }
            RunCommand = "-Xmx" + argument.MaxMem.ToString() + "m -Djava.library.path=\"" + argument.CurrentDir.Replace(".\\", Application.StartupPath + "\\").Replace("./", Application.StartupPath + "/") + "\\versions\\" + argument.VerName + "\\" + argument.VerName + "-natives\" " + argument.ExtraJreArgs + " -cp \"" + Libcmd + "\" " + jo.getString("mainClass") + " " + minecraftArguments + " " + argument.ExtraMCArgs;
            Process          p   = new Process();
            ProcessStartInfo psi = new ProcessStartInfo(argument.JrePath, RunCommand);
            psi.WorkingDirectory = argument.CurrentDir.Replace(".\\", Application.StartupPath + "\\").Replace("./", Application.StartupPath + "/");
            psi.UseShellExecute  = false;
            p.StartInfo          = psi;
            if (whatToReturn == 1)
            {
                lr.MCMain = p;
                return(lr);
            }
            p.Start();
            Application.Exit();
            return(lr);
        }
Exemplo n.º 3
0
        private void button18_Click(object sender, EventArgs e)
        {
            gop.Append("已启动游戏。");
            gameOut.Text = gop.ToString();
            if (!File.Exists(Application.StartupPath + "\\" + Nick.Text + ".authL"))
            {
                Guid G = Guid.NewGuid();
                File.WriteAllLines(Application.StartupPath + "\\" + Nick.Text + ".authL", new string[] { G.ToString(), G.ToString() });
            }
            JSONObject    jo   = new JSONObject(File.ReadAllText(Application.StartupPath + "\\JLConfig.json"));
            MCLaunchArgs  mcla = new MCLaunchArgs();
            YggDrasilAuth yda  = new YggDrasilAuth();
            JSONObject    mca  = jo.getJSONObject("MCLSettings");
            JSONArray     ya   = jo.getJSONArray("YggDrasilLogin");

            mcla.MaxMem = short.Parse(mca.getString("MaxMemorySize"));
            mcla.Nick   = jo.getString("Nick");
            JSONObject[] yas = ya.toJSONObjects();
            JSONObject   yt  = new JSONObject();

            foreach (JSONObject yd in yas)
            {
                if (yd.getObject("Selected") == "True")
                {
                    yt = yd;
                }
            }
            yda.UserName      = yt.getString("UserName");
            yda.Password      = yt.getString("Password");
            yda.Yggauth       = Boolean.Parse(mca.getObject("doYgg"));
            mcla.JrePath      = mca.getString("JrePath");
            mcla.ExtraJreArgs = mca.getString("ExtraJreArgs");
            if (mca.getObject("doServerC") == "True")
            {
                mcla.ExtraMCArgs = mcla.ExtraMCArgs + "--server " + mca.getObject("ServerIp").Split(":".ToCharArray())[0] + " --port " + mca.getObject("ServerIp").Split(":".ToCharArray())[1] + " ";
            }
            if (mca.getObject("FullScreen") == "True")
            {
                mcla.ExtraMCArgs = mcla.ExtraMCArgs + "--fullscreen ";
            }
            if (mca.getObject("Demo") == "True")
            {
                mcla.ExtraMCArgs = mcla.ExtraMCArgs + "--demo ";
            }
            mcla.ExtraMCArgs = mcla.ExtraMCArgs + "--width " + mca.getObject("WindowWidth") + " --height " + mca.getObject("WindowHeight") + " ";
            mcla.ExtraMCArgs = mcla.ExtraMCArgs + mca.getString("ExtraMCArgs");
            mcla.CurrentDir  = jo.getString("CurrentDir");
            mcla.VerName     = jo.getString("SelectedVersion");
            yda.uuid         = File.ReadAllLines(Application.StartupPath + "\\" + Nick.Text + ".authL")[0];
            yda.accessToken  = File.ReadAllLines(Application.StartupPath + "\\" + Nick.Text + ".authL")[1];
            lr = new Launcher().LaunchMC(mcla, yda, 1);
            if (lr.rtv == "缺少文件,正在下载。")
            {
                gop.Append("\n对不起,游戏缺少重要文件,启动失败。请先在主界面点击“启动”下载好他们后再进行调试。");
                gameOut.Text = gop.ToString();
            }
            else
            {
                lr.MCMain.StartInfo.RedirectStandardOutput = true;
                lr.MCMain.OutputDataReceived += new DataReceivedEventHandler(OutputDataReceived);
                lr.MCMain.Start();
                lr.MCMain.BeginOutputReadLine();
            }
        }