private void button_mpk_unpack_Click(object sender, EventArgs e) { try { var files = new List <string>(); if (Directory.Exists(textBox_mpk_unpack_input.Text)) { files.AddRange(Directory.GetFiles(textBox_mpk_unpack_input.Text) .Where(f => f.EndsWith(".mpk", StringComparison.CurrentCultureIgnoreCase))); } else { files.Add(textBox_mpk_unpack_input.Text); } foreach (var file in files) { Log("[MPK Unpack] Unpacking " + Path.GetFileName(file) + " ..."); var output = Path.Combine(textBox_mpk_unpack_output.Text, Path.GetFileNameWithoutExtension(file)); Directory.CreateDirectory(output); using (var reader = new BinaryReader(File.OpenRead(file))) { var mpk = MPK.ReadFile(reader); Log("[MPK Unpack] Found " + mpk.Entries.Count + " entries."); foreach (var entry in mpk.Entries) { Log("[MPK Unpack] Unpacking " + entry.Name + "(" + entry.Size + ") ..."); File.WriteAllBytes(Path.Combine(output, entry.Name), entry.Data); } } } } catch (Exception ex) { Oops(ex); } }
private void button_patch_Click(object sender, EventArgs e) { textBox_log.Clear(); button_patch.Enabled = false; ThreadPool.QueueUserWorkItem(s => { try { var usrdir = Path.Combine(textBox_path.Text, "USRDIR"); Log("[BERD] 正在寻找 USRDIR..."); if (!Directory.Exists(usrdir)) { Oops("[BERD] USRDIR 不存在, 请检查你的目录设置."); Invoke(new Action(() => button_patch.Enabled = true)); return; } var bakdir = usrdir + ".bak"; if (!Directory.Exists(bakdir)) { Log("[BERD] 备份文件夹不存在, 创建中..."); Directory.CreateDirectory(bakdir); } foreach (var patch in Directory.GetFiles(PATCH_DIR, "*.json").Select(p => JSON.ToObject <Dictionary <string, dynamic> >(File.ReadAllText(p)))) { if (!patch.ContainsKey("file")) { continue; } string file = patch["file"]; if (!File.Exists(Path.Combine(bakdir, file))) { Log("[BERD] 正在备份 " + file + "..."); File.Copy(Path.Combine(usrdir, file), Path.Combine(bakdir, file)); } MPK mpk = null; Log("[MPK] 正在加载 " + file + "..."); using (var reader = new BinaryReader(File.OpenRead(Path.Combine(bakdir, file)))) { mpk = MPK.ReadFile(reader); } var entries = mpk.Entries.ToDictionary(k => k.Name, v => v); switch (patch["type"]) { case "scx": if (!patchSCX(entries, patch["charset_preset"] + patch["charset"], patch["data"])) { return; } break; case "file": if (!patchFile(entries, patch["data"])) { return; } break; default: Oops("未知补丁类型"); Invoke(new Action(() => button_patch.Enabled = true)); return; } Log("[MPK] 正在打包 " + file + "..."); using (var writer = new BinaryWriter(File.Open(Path.Combine(usrdir, file), FileMode.Create))) { mpk.Write(writer); Log("[MPK] 打包成功: " + writer.BaseStream.Position); } } MessageBox.Show("补丁应用完成, 请检查游戏是否能正常运行", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); Log("[FENGberd] 操作完成, 请检查游戏是否能正常运行"); } catch (Exception ex) { Oops(ex.ToString()); Log("[FENGberd] 发生致命错误"); } Invoke(new Action(() => button_patch.Enabled = true)); }); }