Beispiel #1
0
        public static void UnpackToUserdata(string TargetGameFolder, string zip, Dictionary <string, string> roleInfo, TextBox logPanel)
        {
            using (FileStream fs = new FileStream(zip, FileMode.Open))
                using (ZipArchive zipArchive = new ZipArchive(fs, ZipArchiveMode.Read))
                {
                    try
                    {
                        zipArchive.GetEntry("profile.json").ExtractToFile("profile.json");
                        Profile profile = JsonSerializer.Deserialize <Profile>(File.ReadAllText("profile.json"));
                        File.Delete("profile.json");
                        if (profile.version != MainWindow.VERSION)
                        {
                            Log("WARN: The description document version of the data is inconsistent with the program version. This may cause data migration errors.", logPanel);
                        }
                        Dictionary <string, string[]> files = profile.files;
                        //释放userdata的文件
                        if (files.ContainsKey("userdata"))
                        {
                            string userdataFolder = TargetGameFolder + $@"\userdata\{roleInfo["account"]}\{roleInfo["area"]}\{roleInfo["server"]}\{roleInfo["role"]}\";
                            foreach (string f in Directory.GetFileSystemEntries(userdataFolder))
                            {
                                if (File.Exists(f))
                                {
                                    File.Delete(f);
                                }
                            }
                            foreach (string file in files["userdata"])
                            {
                                try
                                {
                                    ZipArchiveEntry zipArchiveEntry = zipArchive.GetEntry(file);
                                    zipArchiveEntry.ExtractToFile(userdataFolder + Path.GetFileName(file), true);
                                    Helper.Log($"INFO: File \"{file}\" has been extract to \"{userdataFolder + Path.GetFileName(file)}\"", logPanel);
                                }
                                catch (Exception E)
                                {
                                    Helper.Log(E.Message, logPanel);
                                    Helper.Log(E.StackTrace, logPanel);
                                }
                            }
                        }
                        //释放剑心插件集的全局文件
                        if (files.ContainsKey("jx_config"))
                        {
                            foreach (string file in files["jx_config"])
                            {
                                try
                                {
                                    ZipArchiveEntry zipArchiveEntry     = zipArchive.GetEntry(file);
                                    string          targetExtractFolder = Path.GetDirectoryName(TargetGameFolder + file);
                                    Directory.CreateDirectory(targetExtractFolder);
                                    zipArchiveEntry.ExtractToFile(TargetGameFolder + file, true);
                                    Helper.Log($"INFO: File \"{file}\" has been extract to \"{TargetGameFolder + file}\"", logPanel);
                                }
                                catch (Exception E)
                                {
                                    Helper.Log(E.Message, logPanel);
                                    Helper.Log(E.StackTrace, logPanel);
                                }
                            }
                        }
                        //释放茗伊插件集的全局文件
                        if (files.ContainsKey("my_config"))
                        {
                            foreach (string file in files["my_config"])
                            {
                                try
                                {
                                    ZipArchiveEntry zipArchiveEntry     = zipArchive.GetEntry(file);
                                    string          targetExtractFolder = Path.GetDirectoryName(TargetGameFolder + file);
                                    Directory.CreateDirectory(targetExtractFolder);
                                    zipArchiveEntry.ExtractToFile(TargetGameFolder + file, true);
                                    Helper.Log($"INFO: File \"{file}\" has been extract to \"{TargetGameFolder + file}\"", logPanel);
                                }
                                catch (Exception E)
                                {
                                    Helper.Log(E.Message, logPanel);
                                    Helper.Log(E.StackTrace, logPanel);
                                }
                            }
                        }

                        string roleId = GetGlobalIdByIdAndServer(roleInfo["role"], roleInfo["server"], TargetGameFolder);
                        if (roleId == null)
                        {
                            Console.WriteLine("Cannot find out role id in MY#DATA, All role plugin setting will be skip.");
                        }

                        if (files.ContainsKey("jx_role_config") && roleId != null)
                        {
                            foreach (string file in files["jx_role_config"])
                            {
                                try
                                {
                                    string          file_name           = file.Replace("roleId", $"{roleId}");
                                    ZipArchiveEntry zipArchiveEntry     = zipArchive.GetEntry(file);
                                    string          targetExtractFolder = Path.GetDirectoryName(TargetGameFolder + file_name);
                                    Directory.CreateDirectory(targetExtractFolder);
                                    zipArchiveEntry.ExtractToFile(TargetGameFolder + file_name, true);
                                    Helper.Log($"INFO: File \"{file}\" has been extract to \"{TargetGameFolder + file_name}\"", logPanel);
                                }
                                catch (Exception E)
                                {
                                    Helper.Log(E.Message, logPanel);
                                    Helper.Log(E.StackTrace, logPanel);
                                }
                            }
                        }

                        if (files.ContainsKey("my_role_config") && roleId != null)
                        {
                            foreach (string file in files["my_role_config"])
                            {
                                try
                                {
                                    string          file_name           = file.Replace("roleId", $"{roleId}@zhcn_hd");
                                    ZipArchiveEntry zipArchiveEntry     = zipArchive.GetEntry(file);
                                    string          targetExtractFolder = Path.GetDirectoryName(TargetGameFolder + file_name);
                                    Directory.CreateDirectory(targetExtractFolder);
                                    zipArchiveEntry.ExtractToFile(TargetGameFolder + file_name, true);
                                    Helper.Log($"INFO: File \"{file}\" has been extract to \"{TargetGameFolder + file_name}\"", logPanel);
                                }
                                catch (Exception E)
                                {
                                    Helper.Log(E.Message, logPanel);
                                    Helper.Log(E.StackTrace, logPanel);
                                }
                            }
                        }
                    }
                    catch (Exception e)
                    {
                        throw e;
                    }
                }

            File.Delete(zip);
        }
Beispiel #2
0
        public static void GetZipFromUserdata(string SourceData, string zip, Dictionary <string, string> roleInfo, Dictionary <string, bool> contain_options, TextBox logPanel)
        {
            Profile profile = new Profile {
                version = MainWindow.VERSION
            };
            Dictionary <string, string[]> allFiles = new Dictionary <string, string[]>();

            try
            {
                using (FileStream fs = new FileStream(zip, FileMode.Create))
                    using (ZipArchive zipArchive = new ZipArchive(fs, ZipArchiveMode.Create))
                    {
                        //userdata设置迁移,最基本的数据文件
                        if (contain_options["userdata"])
                        {
                            ArrayList files     = new ArrayList();
                            string[]  file_list =
                            {
                                "addon.jx3dat",
                                "CoinShopOutfitData.jx3dat",
                                "custom.dat",
                                "custom.dat.addon",
                                "userpreferences.jx3dat",
                                "hotkey.data",
                                "hotkey_last.txt",
                                "hotkey_back0.txt",
                                "hotkey_back1.txt",
                                "hotkey_back2.txt",
                                "hotkey_back3.txt",
                                "hotkey_back4.txt",
                            };
                            string userdataFolder = SourceData + $@"\userdata\{roleInfo["account"]}\{roleInfo["area"]}\{roleInfo["server"]}\{roleInfo["role"]}\";
                            foreach (string file in file_list)
                            {
                                try
                                {
                                    string file_name = @"\userdata\" + file;
                                    zipArchive.CreateEntryFromFile(userdataFolder + file, file_name);
                                    files.Add(file_name);
                                }
                                catch (Exception E)
                                {
                                    Log($"Take \"{userdataFolder}{file}\" into Zip File Error!", logPanel);
                                    Log(E.Message, logPanel);
                                    Log(E.StackTrace, logPanel);
                                }
                            }
                            if (contain_options["userdata_async"])
                            {
                                try
                                {
                                    string file_name = @"\userdata\userpreferencesasync.jx3dat";
                                    Uri    uri       = new Uri(@"pack://*****:*****@"\userdata\userpreferencesasync.jx3dat";
                                    zipArchive.CreateEntryFromFile("userpreferencesasync.jx3dat", file_name);
                                    File.Delete("userpreferencesasync.jx3dat");
                                }
                                catch (Exception E)
                                {
                                    Log("Take \"userpreferencesasync.jx3dat\" into Zip File Error!", logPanel);
                                    Log(E.Message, logPanel);
                                    Log(E.StackTrace, logPanel);
                                }
                            }
                            else
                            {
                                try
                                {
                                    string file_name = @"\userdata\userpreferencesasync.jx3dat";
                                    zipArchive.CreateEntryFromFile(userdataFolder + "userpreferencesasync.jx3dat", file_name);
                                    files.Add(file_name);
                                }
                                catch (Exception E)
                                {
                                    Log($"Take {userdataFolder}\"userpreferencesasync.jx3dat\" into Zip File Error!", logPanel);
                                    Log(E.Message, logPanel);
                                    Log(E.StackTrace, logPanel);
                                }
                            }
                            allFiles.Add("userdata", (string[])files.ToArray(typeof(string)));
                        }
                        //看能不能找到需要迁移角色的globalId,因为剑心 茗伊这些插件储存的时候都是用globalId存储的
                        //只通过文件的话只能找到茗伊插件数据里面对应id的文件夹来获取globalId
                        //如果找不到的话就没办法进性插件相关的设置2迁移了
                        string roleId = GetGlobalIdByIdAndServer(roleInfo["role"], roleInfo["server"], SourceData);

                        if (roleId == null)
                        {
                            Console.WriteLine("Cannot find out role id in MY#DATA, All role plugin setting will be skip.");
                        }
                        //剑心插件集的一些角色设置,喊话,技能释放什么的
                        if (contain_options["jx_role_config"] && roleId != null)
                        {
                            ArrayList files     = new ArrayList();
                            string[]  file_list =
                            {
                                $@"\interface\JX#DATA\killnotice\{roleId}.jx3dat",  //技能喊话
                                $@"\interface\JX#DATA\othernotice\{roleId}.jx3dat", //入组 入帮之类的喊话
                                $@"\interface\JX#DATA\skillnotice\{roleId}.jx3dat"  //击杀提示
                            };
                            foreach (string file in file_list)
                            {
                                try
                                {
                                    string file_name = file.Replace($"{roleId}", "roleId");
                                    zipArchive.CreateEntryFromFile(SourceData + file, file_name);
                                    files.Add(file_name);
                                }
                                catch (Exception e)
                                {
                                    Console.WriteLine($"Take \"{SourceData}{file}\" into Zip File Error!");
                                    Console.WriteLine(e.StackTrace);
                                }
                            }
                            allFiles.Add("jx_role_config", (string[])files.ToArray(typeof(string)));
                        }
                        //茗伊插件集的角色设置
                        if (contain_options["my_role_config"] && roleId != null)
                        {
                            ArrayList files     = new ArrayList();
                            string[]  file_list =
                            {
                                $@"\interface\MY#DATA\{roleId}@zhcn_hd\config\anmerkungen.jx3dat",
                                $@"\interface\MY#DATA\{roleId}@zhcn_hd\config\focus.jx3dat",
                                $@"\interface\MY#DATA\{roleId}@zhcn_hd\config\infotip.jx3dat",
                                $@"\interface\MY#DATA\{roleId}@zhcn_hd\config\memo.jx3dat",
                                $@"\interface\MY#DATA\{roleId}@zhcn_hd\config\my_targetmon.jx3dat",
                                $@"\interface\MY#DATA\{roleId}@zhcn_hd\config\settings.db",
                                $@"\interface\MY#DATA\{roleId}@zhcn_hd\config\storageversion.jx3dat",
                                $@"\interface\MY#DATA\{roleId}@zhcn_hd\config\tutorialed.jx3dat",
                                $@"\interface\MY#DATA\{roleId}@zhcn_hd\manifest.jx3dat"
                            };
                            foreach (string file in file_list)
                            {
                                try
                                {
                                    string file_name = file.Replace($"{roleId}@zhcn_hd", "roleId");
                                    zipArchive.CreateEntryFromFile(SourceData + file, file_name);
                                    files.Add(file_name);
                                }
                                catch (Exception e)
                                {
                                    Console.WriteLine($"Take \"{SourceData}{file}\" into Zip File Error!");
                                    Console.WriteLine(e.StackTrace);
                                }
                            }
                            allFiles.Add("my_role_config", (string[])files.ToArray(typeof(string)));
                        }
                        //剑心插件集的全局设置
                        if (contain_options["jx_config"])
                        {
                            ArrayList files     = new ArrayList();
                            string[]  file_list =
                            {
                                $@"\interface\JX#DATA\hiderepresent\HideActionData.jx3dat",
                                $@"\interface\JX#DATA\skillcastmode\CastModeData.jx3dat",
                                $@"\interface\JX#DATA\targetlist\CustomMod.jx3dat",
                                $@"\interface\JX#DATA\targetlist\FocusTarget.jx3dat",
                                $@"\interface\JX#DATA\CustomData.jx3dat",
                            };
                            foreach (string file in file_list)
                            {
                                try
                                {
                                    zipArchive.CreateEntryFromFile(SourceData + file, file);
                                    files.Add(file);
                                }
                                catch (Exception e)
                                {
                                    Console.WriteLine($"Take \"{SourceData}{file}\" into Zip File Error!");
                                    Console.WriteLine(e.StackTrace);
                                }
                            }
                            allFiles.Add("jx_config", (string[])files.ToArray(typeof(string)));
                        }
                        //茗伊插件集的全局设置
                        if (contain_options["my_config"])
                        {
                            ArrayList files     = new ArrayList();
                            string[]  file_list =
                            {
                                @"\interface\MY#DATA\!all-users@zhcn_hd\config\settings.db",
                                @"\interface\MY#DATA\!all-users@zhcn_hd\config\yy.jx3dat",
                                @"\interface\MY#DATA\!all-users@zhcn_hd\config\show_notify.jx3dat",
                                @"\interface\MY#DATA\!all-users@zhcn_hd\config\serendipity_autoshare.jx3dat",
                                @"\interface\MY#DATA\!all-users@zhcn_hd\config\screenshot.jx3dat",
                                @"\interface\MY#DATA\!all-users@zhcn_hd\config\my_targetmon.jx3dat",
                                @"\interface\MY#DATA\!all-users@zhcn_hd\config\memo.jx3dat",
                                @"\interface\MY#DATA\!all-users@zhcn_hd\config\fontconfig.jx3dat",
                                @"\interface\MY#DATA\!all-users@zhcn_hd\config\chatmonitor.jx3dat",
                                @"\interface\MY#DATA\!all-users@zhcn_hd\config\chatblockwords.jx3dat",
                                @"\interface\MY#DATA\!all-users@zhcn_hd\config\cataclysm\common.jx3dat",
                                @"\interface\MY#DATA\!all-users@zhcn_hd\config\focus\common.jx3dat",
                                @"\interface\MY#DATA\!all-users@zhcn_hd\config\xlifebar\common.jx3dat",
                                @"\interface\MY#DATA\!all-users@zhcn_hd\manifest.jx3dat"
                            };
                            if (Directory.Exists(SourceData + @"\interface\MY#DATA\!all-users@zhcn_hd\userdata\TargetMon"))
                            {
                                string[] TargetMonFiles = Directory.GetFiles(SourceData + @"\interface\MY#DATA\!all-users@zhcn_hd\userdata\TargetMon");
                                foreach (string TargetMonFile in TargetMonFiles)
                                {
                                    string file_name = $@"\interface\MY#DATA\!all-users@zhcn_hd\userdata\TargetMon\{Path.GetFileName(TargetMonFile)}";
                                    try
                                    {
                                        zipArchive.CreateEntryFromFile(SourceData + file_name, file_name);
                                        files.Add(file_name);
                                    }
                                    catch (Exception e)
                                    {
                                        Console.WriteLine($"Take \"{SourceData}{file_name}\" into Zip File Error!");
                                        Console.WriteLine(e.StackTrace);
                                    }
                                }
                            }

                            foreach (string file in file_list)
                            {
                                try
                                {
                                    zipArchive.CreateEntryFromFile(SourceData + file, file);
                                    files.Add(file);
                                }
                                catch (Exception e)
                                {
                                    Console.WriteLine($"Take \"{SourceData}{file}\" into Zip File Error!");
                                    Console.WriteLine(e.StackTrace);
                                }
                            }
                            allFiles.Add("my_config", (string[])files.ToArray(typeof(string)));
                        }

                        string[] contains = allFiles.Keys.ToArray <string>();
                        profile.contains = contains;
                        profile.files    = allFiles;
                        try
                        {
                            File.WriteAllText("profile.json", JsonSerializer.Serialize(profile));
                            zipArchive.CreateEntryFromFile("profile.json", "profile.json");
                            File.Delete("profile.json");
                        }
                        catch (Exception e)
                        {
                            Log($"Delete Temp File \"profile.json\" File Error!", logPanel);
                            Log(e.Message, logPanel);
                            Log(e.StackTrace, logPanel);
                        }
                    }
            }
            catch (Exception e)
            {
                throw e;
            }
        }