private void LoadFileFromDisk()
        {
            Console.WriteLine("\n\nReading new file: \"{0}\"", filePath);

            IO io = new IO(filePath, Endian.Little, 0x0000000, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);

            // We're gonna use this byte array for backing up the save file.
            originalBytes = io.ReadAll();
            io.Close();
            io = new IO(filePath, Endian.Little, 0x0000000, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);

            saveData = Helpers.ReadGVASSave(io);
            if (saveData == null)
            {
                Console.WriteLine("Loaded file is not a BL3 profile...");
                showMessage("File Error", "Loaded file is not a BL3 profile");
                return;
            }
            string saveGameType = saveData.sgType;

            int remainingDataLength = io.ReadInt32();

            Console.WriteLine("Length of data: {0}", remainingDataLength);
            byte[] buf = io.ReadBytes(remainingDataLength);
            io.Close();

            if (!saveGameType.Equals("BP_DefaultOakProfile_C"))
            {
                Console.WriteLine("Loaded file is not a profile...");
                showMessage("File Error", "Loaded file is not a profile");
                return;
            }

            ProfileBogoCrypt.Decrypt(buf, 0, remainingDataLength);
            loadedProfile = Serializer.Deserialize <Profile>(new MemoryStream(buf));
            UpdateSaveGUI();
        }
Example #2
0
        private void GRInjection()
        {
            DirectoryInfo          saveFiles = new DirectoryInfo(Path.GetDirectoryName(filePath));
            IEnumerable <FileInfo> infos     = saveFiles.EnumerateFiles("*.sav");

            foreach (FileInfo saveFile in infos) // Get all of our .sav files
            {
                if (saveFile.IsReadOnly)
                {
                    continue;
                }

                IO io = new IO(saveFile.FullName, Endian.Little, 0x0000000, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);

                Console.WriteLine("Reading file \"{0}\"", saveFile.FullName);
                GVASSave gvas = Helpers.ReadGVASSave(io);

                if (gvas == null || !gvas.sgType.Equals("OakSaveGame"))
                {
                    Console.WriteLine("File \"{0}\" is not a save.", saveFile.FullName);
                    continue;
                }

                int remainingDataLength = io.ReadInt32();
                Console.WriteLine("Length of data: {0}", remainingDataLength);
                byte[] buf = io.ReadBytes(remainingDataLength);

                SaveBogoCrypt.Decrypt(buf, 0, remainingDataLength);

                Character characterSave = Serializer.Deserialize <Character>(new MemoryStream(buf));
                Console.WriteLine("Parsing save: {0}", characterSave.PreferredCharacterName);

                GuardianRankCharacterSaveGameData grcd = characterSave.GuardianRankCharacterData;
                if (grcd == null)
                {
                    io.Close();
                    continue;
                }

                grcd.GuardianAvailableTokens  = loadedProfile.GuardianRank.AvailableTokens;
                grcd.GuardianExperience       = loadedProfile.GuardianRank.GuardianExperience;
                grcd.NewGuardianExperience    = loadedProfile.GuardianRank.NewGuardianExperience;
                grcd.GuardianRewardRandomSeed = loadedProfile.GuardianRank.GuardianRewardRandomSeed;
                grcd.GuardianRank             = loadedProfile.GuardianRank.GuardianRank;
                List <GuardianRankRewardCharacterSaveGameData> outputGR = new List <GuardianRankRewardCharacterSaveGameData>();
                foreach (GuardianRankRewardCharacterSaveGameData grData in grcd.RankRewards)
                {
                    bool bFoundMatch = false;
                    foreach (GuardianRankRewardSaveGameData pGRData in loadedProfile.GuardianRank.RankRewards)
                    {
                        if (pGRData.RewardDataPath.Equals(grData.RewardDataPath))
                        {
                            grData.NumTokens = pGRData.NumTokens;
                            if (grData.NumTokens == 0)
                            {
                                outputGR.Add(grData);
                            }
                            bFoundMatch = true;
                        }
                    }

                    if (!bFoundMatch)
                    {
                        outputGR.Add(grData);
                    }
                }
                outputGR = outputGR.Distinct().ToList();
                grcd.RankRewards.RemoveAll(x => outputGR.Contains(x));
                io.Close();


                io = new IO(saveFile.FullName, Endian.Little, 0x0000000, FileMode.Truncate, FileAccess.ReadWrite, FileShare.ReadWrite);
                Helpers.WriteGVASSave(io, gvas);
                byte[] result;
                using (var stream = new MemoryStream())
                {
                    Serializer.Serialize <Character>(stream, characterSave);
                    result = stream.ToArray();
                }
                SaveBogoCrypt.Encrypt(result, 0, result.Length);
                io.WriteInt32(result.Length);
                io.WriteBytes(result);

                io.Close();
            }

            Console.WriteLine("Done injecting GR into saves");
        }