static void ReplaceAll(string archivePath, string replacementFolder, string newArchivePath) { CrafArchive archive = null; try { archive = CrafArchive.Open(archivePath); var task = archive.LoadAsync(new Progress <int>()); task.Wait(); archive.CloseReader(); } catch (IOException) { Console.WriteLine("Could not open archive"); Environment.Exit(-1); } var ct = archive.Count(); Console.WriteLine("Loading replacement files..."); for (var i = 0; i < ct; i++) { var fileInArchive = archive.DiskPath(i); var combined = Path.Combine(replacementFolder, fileInArchive); if (File.Exists(combined)) { Console.WriteLine(string.Format("{0} ({1}/{2})", combined, i + 1, ct)); try { archive.Replace(i, File.ReadAllBytes(combined)); } catch (IOException ex) { Console.WriteLine("Could not read replacement file"); Console.WriteLine("Details: " + ex.Message); Environment.Exit(-1); } } } Console.WriteLine(""); Console.WriteLine("Writing back files..."); var fivePercent = ct / 20; if (fivePercent == 0) { fivePercent = 1; } try { var task2 = archive.SaveAsync(newArchivePath, new Progress <int>((i) => { if (i % fivePercent == 0) { Console.Write("."); } })); task2.Wait(); } catch (IOException ex) { Console.WriteLine(""); Console.WriteLine("Could not write new archive"); Console.WriteLine("Details: " + ex.Message); Environment.Exit(-1); } Console.WriteLine(""); }
public Task PatchAsync(IProgress <int> progress, PatchMode mode, float multiplier) { return(Task.Run(() => { var _multiplier = BitConverter.GetBytes(multiplier); for (var i = 0; i < _candidateIds.Count(); i++) { var id = _candidateIds[i]; var binary = _archive.Get(id); var disassembly = D3DCompiler.Disassemble(binary); if (disassembly.Contains("FP_FadePower")) { // actor - patching these causes glitches with camera-overlap fade progress.Report(i + 1); continue; } bool found = false; byte[] newBinary = (byte[])binary.Clone(); foreach (var pos in binary.SigScan(block_sig)) { switch (mode) { case PatchMode.DisableDithering: Buffer.BlockCopy(nop_12x, 0, newBinary, pos + block_discard_offset, 12); break; case PatchMode.NarrowDithering: Buffer.BlockCopy(_multiplier, 0, newBinary, pos + block_float_offset, 4); break; } found = true; } foreach (var pos in binary.SigScan(block2_sig)) { switch (mode) { case PatchMode.DisableDithering: Buffer.BlockCopy(nop_12x, 0, newBinary, pos + block2_discard_offset, 12); break; case PatchMode.NarrowDithering: Buffer.BlockCopy(_multiplier, 0, newBinary, pos + block2_float_offset, 4); break; } found = true; } if (found) { int[] checksum = DXBCChecksum.DXBCChecksum.CalculateDXBCChecksum(newBinary); Buffer.BlockCopy(checksum, 0, newBinary, 4, 16); _archive.Replace(id, newBinary); } progress.Report(i + 1); } })); }
static void Replace(string archivePath, string fileInArchive, string fileOnDisk, string newArchivePath) { CrafArchive archive = null; try { archive = CrafArchive.Open(archivePath); var task = archive.LoadAsync(new Progress <int>()); task.Wait(); archive.CloseReader(); } catch (IOException) { Console.WriteLine("Could not open archive"); Environment.Exit(-1); } var id = archive.IndexOfDiskPath(fileInArchive); if (id == -1) { Console.WriteLine("File in archive not found"); Environment.Exit(-1); } Console.WriteLine("Loading new file..."); try { archive.Replace(id, File.ReadAllBytes(fileOnDisk)); } catch (IOException ex) { Console.WriteLine("Could not read replacement file"); Console.WriteLine("Details: " + ex.Message); Environment.Exit(-1); } Console.WriteLine("Writing back files..."); var fivePercent = archive.Count() / 20; if (fivePercent == 0) { fivePercent = 1; } try { var task2 = archive.SaveAsync(newArchivePath, new Progress <int>((i) => { if (i % fivePercent == 0) { Console.Write("."); } })); task2.Wait(); } catch (IOException ex) { Console.WriteLine(""); Console.WriteLine("Could not write new archive"); Console.WriteLine("Details: " + ex.Message); Environment.Exit(-1); } Console.WriteLine(""); }