public IEnumerable<IResult> ReadSave() { string fileName = null; MyOpenFileResult ofr; ofr = new MyOpenFileResult() .FilterFiles( ffc => ffc.AddFilter("sav", true) .WithDescription("Borderlands 2 Save Files") .AddAllFilesFilter()) .WithFileDo(s => fileName = s); if (string.IsNullOrEmpty(this._SavePath) == false && Directory.Exists(this._SavePath) == true) { ofr = ofr.In(this._SavePath); } yield return ofr; if (fileName == null) { yield break; } /////////////////////////////////////////// //SPITFIRE1337 MODS /////////////////////////////////////////// string path = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); //using (FileStream fs = File.Create(path)) { } File.Delete(path + "/mytempsave.sav"); File.Delete(path + "/savegame.sav"); File.Copy(fileName, path + "/mytempsave.sav"); string profileid = ""; string deviceid = ""; string consoleid = ""; Stream input1 = new FileStream(fileName, FileMode.Open); // Ensure that the target does not exist. //Stream input = new Stream(fs); var check = input1.ReadValueU32(Endian.Big); input1.Close(); if (check == 0x434F4E20) { //MessageBox.Show("This is a xbox save"); yield return new DelegateResult(() => { DJsIO io = new DJsIO(fileName, DJFileMode.Open, true); io.Position = 0x371; profileid = io.ReadHexString(8); //Profile ID io.Close(); }) .Rescue().Execute( x => new MyMessageBox("An exception was thrown (press Ctrl+C to copy):\n\n" + x.ToString(), "Error") .WithIcon(MessageBoxImage.Error).AsCoroutine()); STFSPackage xPackage = new STFSPackage(fileName, null); FileEntry xent = (FileEntry)xPackage.GetFile("savegame.sav"); if (!xent.Extract(path + "/savegame.sav")) { //MessageBoxEx.Show("Extraction Failed!", "Failed!", MessageBoxButtons.OK, MessageBoxIcon.[Error]) //xboxextract.ReportProgress(200, "Extraction Failed"); //Thread.Sleep(2000); //Return MessageBox.Show("Could not extract savegame.sav. Please use a program like modio or horizon to extract your savegame.sav"); } else { fileName = path + "/savegame.sav"; //MessageBox.Show("File extracted"); //Thread.Sleep(2000); //MessageBoxEx.Show("Extraction Complete!", "Complete!", MessageBoxButtons.OK, MessageBoxIcon.Information) } } else { profileid = "0"; deviceid = "0"; consoleid = "0"; } yield return new DelegateResult(() => { FileFormats.SaveFile saveFile; using (var input = File.OpenRead(fileName)) { saveFile = FileFormats.SaveFile.Deserialize(input, FileFormats.SaveFile.DeserializeSettings.None); } this.SaveFile = saveFile; this.General.ImportData(saveFile.SaveGame, saveFile.Endian, profileid, deviceid, consoleid); this.CurrencyOnHand.ImportData(saveFile.SaveGame); this.Backpack.ImportData(saveFile.SaveGame); this.Bank.ImportData(saveFile.SaveGame); }) .Rescue<DllNotFoundException>().Execute( x => new MyMessageBox("Failed to load save: " + x.Message, "Error") .WithIcon(MessageBoxImage.Error).AsCoroutine()) .Rescue<FileFormats.SaveFormatException>().Execute( x => new MyMessageBox("Failed to load save: " + x.Message, "Error") .WithIcon(MessageBoxImage.Error).AsCoroutine()) .Rescue<FileFormats.SaveCorruptionException>().Execute( x => new MyMessageBox("Failed to load save: " + x.Message, "Error") .WithIcon(MessageBoxImage.Error).AsCoroutine()) .Rescue().Execute( x => new MyMessageBox("An exception was thrown (press Ctrl+C to copy):\n\n" + x.ToString(), "Error") .WithIcon(MessageBoxImage.Error).AsCoroutine()); /////////////////////////////////////////// //END SPITFIRE1337 MODS /////////////////////////////////////////// }
/////////////////////////////////////////// //SPITFIRE1337 MODS /////////////////////////////////////////// public IEnumerable<IResult> WriteSaveXbox() { if (this.SaveFile == null) { yield break; } string path = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); File.Delete(path + "/savegame.sav"); //MessageBox.Show("A save file box will now appear, please select a EXISTING XBOX SAVE to overwrite. I can not emphasize this enough, ALWAYS KEEP A WORKING BACKUP. Once you have a backup press ok to continue"); var saveFile = this.SaveFile; yield return new DelegateResult(() => { Endian endian; this.General.ExportData(saveFile.SaveGame, out endian); this.CurrencyOnHand.ExportData(saveFile.SaveGame); this.Backpack.ExportData(saveFile.SaveGame); this.Bank.ExportData(saveFile.SaveGame); using (var output = File.Create(path + "/savegame.sav")) { saveFile.Endian = endian; saveFile.Serialize(output); } }).Rescue().Execute( x => new MyMessageBox("An exception was thrown (press Ctrl+C to copy this text):\n\n" + x.ToString(), "Error") .WithIcon(MessageBoxImage.Error).AsCoroutine()); string fileName = null; MySaveFileResult ofr; ofr = new MySaveFileResult() .PromptForOverwrite() .FilterFiles( ffc => ffc.AddFilter("sav", true) .WithDescription("Borderlands 2 Save Files") .AddAllFilesFilter()) .WithFileDo(s => fileName = s); if (string.IsNullOrEmpty(this._SavePath) == false && Directory.Exists(this._SavePath) == true) { ofr = ofr.In(this._SavePath); } yield return ofr; if (fileName == null) { yield break; } if (File.Exists(fileName)) { File.WriteAllBytes(fileName, Properties.Resources.Save0001); } else { File.Delete(fileName); File.WriteAllBytes(fileName, Properties.Resources.Save0001); } yield return new DelegateResult(() => { string profileid = this.General.Profileid; DJsIO io = new DJsIO(fileName, DJFileMode.Open, true); io.Position = 0x371; io.WriteHexString(profileid); io.Close(); }).Rescue().Execute( x => new MyMessageBox("An exception was thrown (press Ctrl+C to copy this text):\n\n" + x.ToString(), "Error") .WithIcon(MessageBoxImage.Error).AsCoroutine()); yield return new DelegateResult(() => { STFSPackage stfs = new STFSPackage(fileName, null); FileEntry item = stfs.GetFile("savegame.sav"); //Get's the account file if (!item.Replace(path + "\\savegame.sav")) { //If Not xent.Extract(Application.StartupPath + "\" + "savegame.sav") Then //MessageBoxEx.Show("Extraction Failed!", "Failed!", MessageBoxButtons.OK, MessageBoxIcon.[Error]) throw new Exception("Failed to insert save file to xbox save. Please use a program like modio or horizon to insert your save"); } else { //MessageBox.Show("File Inserted"); //If Not Then //End If //MessageBoxEx.Show("Extraction Complete!", "Complete!", MessageBoxButtons.OK, MessageBoxIcon.Information) } if (!File.Exists(path + "/kv.bin")) { File.WriteAllBytes(path + "/kv.bin", Properties.Resources.KV); } stfs.FlushPackage(new RSAParams(path + "/kv.bin")); stfs.CloseIO(); }).Rescue().Execute( x => new MyMessageBox("An exception was thrown (press Ctrl+C to copy this text):\n\n" + x.ToString(), "Error") .WithIcon(MessageBoxImage.Error).AsCoroutine()); }
///<summary>Extracts a WSG from a CON (Xbox 360 Container File).</summary> public MemoryStream WSGExtract(Stream InputX360File) { BinaryReader br = new BinaryReader(InputX360File); byte[] fileInMemory = br.ReadBytes((int)InputX360File.Length); if (fileInMemory.Count() != InputX360File.Length) throw new EndOfStreamException(); try { STFSPackage CON = new STFSPackage(new DJsIO(fileInMemory, true), new X360.Other.LogRecord()); //DJsIO Extract = new DJsIO(true); //CON.FileDirectory[0].Extract(Extract); ProfileID = CON.Header.ProfileID; DeviceID = CON.Header.DeviceID; //DJsIO Save = new DJsIO("C:\\temp.sav", DJFileMode.Create, true); //Save.Write(Extract.ReadStream()); //Save.Close(); //byte[] nom = CON.GetFile("SaveGame.sav").GetEntryData(); return new MemoryStream(CON.GetFile("SaveGame.sav").GetTempIO(true).ReadStream(), false); } catch { try { DJsIO Manual = new DJsIO(fileInMemory, true); Manual.ReadBytes(881); ProfileID = Manual.ReadInt64(); Manual.ReadBytes(132); DeviceID = Manual.ReadBytes(20); Manual.ReadBytes(48163); int size = Manual.ReadInt32(); Manual.ReadBytes(4040); return new MemoryStream(Manual.ReadBytes(size), false); } catch { return null; } } }