Beispiel #1
0
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            Gvas gvas = existingValue == null ? new Gvas() : (Gvas)existingValue;

            JObject jo = JObject.Load(reader);

            gvas.SaveGameVersion        = int.Parse(jo["SaveGameVersion"].ToString());
            gvas.PackageVersion         = int.Parse(jo["PackageVersion"].ToString());
            gvas.EngineVersion.Major    = short.Parse(jo["EngineVersion"]["Major"].ToString());
            gvas.EngineVersion.Minor    = short.Parse(jo["EngineVersion"]["Minor"].ToString());
            gvas.EngineVersion.Patch    = short.Parse(jo["EngineVersion"]["Patch"].ToString());
            gvas.EngineVersion.Build    = short.Parse(jo["EngineVersion"]["Build"].ToString());
            gvas.EngineVersion.BuildId  = jo["EngineVersion"]["BuildId"].ToString();
            gvas.CustomFormatVersion    = int.Parse(jo["CustomFormatVersion"].ToString());
            gvas.CustomFormatData.Count = int.Parse(jo["CustomFormatData"]["Count"].ToString());

            List <CustomFormatDataEntry> cfd = new List <CustomFormatDataEntry>();

            foreach (JObject o in jo["CustomFormatData"]["Entries"])
            {
                cfd.Add(new CustomFormatDataEntry(o["Id"].ToObject <Guid>(), int.Parse(o["Value"].ToString())));
            }
            gvas.CustomFormatData.Entries = cfd.ToArray();
            gvas.SaveGameType             = jo["SaveGameType"].ToString();

            foreach (JObject o in jo["Properties"])
            {
                gvas.Properties.Add(ReadUEProperty(o));
            }
            //gvas.Properties.Add(ReadUEProperty(o));

            return(gvas);
        }
 public static Gvas ReadGvas(Stream stream)
 {
     using (var reader = new UE_BinaryReader(stream, true))
     {
         int type_tag = reader.ReadInt32();
         if (type_tag != GvasFormat.SaveGameHeader.UE4_SAVEGAME_FILE_TYPE_TAG)
         {
             throw new NotSupportedException("Only `GVAS` file is supported.");
         }
         var result = new Gvas();
         //
         result.Header = SaveGameHeader.Read(reader);
         //
         var list           = new List <UE_Property>();
         var ue_prop_reader = new UE_Property_Reader(reader);
         while (ue_prop_reader.Read() is UE_Property prop)
         {
             if (prop is UE_None)
             {
                 break;
             }
             list.Add(prop);
         }
         result.PropertyList = list;
         //
         return(result);
     }
 }
        public static void WriteKovaakSpecific(Gvas gvas, Stream stream)
        {
            using (var writer = new BinaryWriter(stream, Encoding.ASCII, true))
            {
                writer.Write(Gvas.Header);
                writer.Write(gvas.SaveGameVersion);
                writer.Write(gvas.PackageVersion);
                writer.Write(gvas.EngineVersion.Major);
                writer.Write(gvas.EngineVersion.Minor);
                writer.Write(gvas.EngineVersion.Patch);
                writer.Write(gvas.EngineVersion.Build);
                writer.WriteUEString(gvas.EngineVersion.BuildId);
                writer.Write(gvas.CustomFormatVersion);
                writer.Write(gvas.CustomFormatData.Count);

                foreach (var entry in gvas.CustomFormatData.Entries)
                {
                    writer.Write(entry.Id.ToByteArray());
                    writer.Write(entry.Value);
                }

                writer.WriteUEString(gvas.SaveGameType);


                ((UEGenericStructProperty)gvas.Properties[0]).Serialize(writer);
                ((UENoneProperty)gvas.Properties[1]).Serialize(writer);


                writer.Write((int)0);
            }
        }
        public static void Write(Gvas gvas, Stream stream)
        {
            using (var writer = new BinaryWriter(stream, Encoding.ASCII, true))
            {
                writer.Write(Gvas.Header);
                writer.Write(gvas.SaveGameVersion);
                writer.Write(gvas.PackageVersion);
                writer.Write(gvas.EngineVersion.Major);
                writer.Write(gvas.EngineVersion.Minor);
                writer.Write(gvas.EngineVersion.Patch);
                writer.Write(gvas.EngineVersion.Build);
                writer.WriteUEString(gvas.EngineVersion.BuildId);
                writer.Write(gvas.CustomFormatVersion);
                writer.Write(gvas.CustomFormatData.Count);

                foreach (var entry in gvas.CustomFormatData.Entries)
                {
                    writer.Write(entry.Id.ToByteArray());
                    writer.Write(entry.Value);
                }

                writer.WriteUEString(gvas.SaveGameType);

                foreach (var prop in gvas.Properties)
                {
                    Console.WriteLine($"GVAS Serializing {prop}");

                    prop.Serialize(writer);
                }

                writer.Write((int)0);
            }
        }
        public static void Write(FileStream stream, Gvas data)
        {
            using (BinaryWriter writer = new BinaryWriter(stream, Encoding.ASCII, true))
            {
                writer.Write(Gvas.Header);

                writer.WriteInt32(data.SaveGameVersion);
                writer.WriteInt32(data.PackageVersion);
                writer.WriteInt16(data.EngineVersion.Major);
                writer.WriteInt16(data.EngineVersion.Minor);
                writer.WriteInt16(data.EngineVersion.Patch);
                writer.WriteInt32(data.EngineVersion.Build);
                writer.WriteUEString(data.EngineVersion.BuildId);
                writer.WriteInt32(data.CustomFormatVersion);
                writer.WriteInt32(data.CustomFormatData.Count);
                for (var i = 0; i < data.CustomFormatData.Count; i++)
                {
                    var entry = data.CustomFormatData.Entries[i];
                    writer.Write(entry.Id.ToByteArray());
                    writer.WriteInt32(entry.Value);
                }
                writer.WriteUEString(data.SaveGameType);

                foreach (UEProperty prop in data.Properties)
                {
                    prop.Serialize(writer);
                }

                writer.WriteInt32(0);
            }
        }
Beispiel #6
0
        public void GameData_Slot0v011()
        {
            Gvas gvas = Gvas.Load(@"C:\Users\Wouter\AppData\Local\CodeVein\Saved\SaveGames\112073240\GameData_Slot0v011.sav");

            if (gvas.Properties.First(x => x.Name == "__buffer") is UEArrayProperty <byte> arr)
            {
                File.WriteAllBytes("GameData_Slot0v011", arr.Value);
            }
        }
 public static void WriteGvas(Stream stream, Gvas save)
 {
     using (var writer = new UE_BinaryWriter(stream, true))
     {
         SaveGameHeader.Write(writer, save.Header);
         var ue_prop_writer = new UE_Property_Writer(writer);
         for (int i = 0; i < save.PropertyList.Count; i++)
         {
             ue_prop_writer.Write(save.PropertyList[i], PositionToken.Normal);
         }
         ue_prop_writer.Write_UE_None();
         string Null_End = null;
         writer.Write(Null_End);
     }
 }
        public static Gvas Read(Stream stream)
        {
            using (var reader = new BinaryReader(stream, Encoding.ASCII, true))
            {
                var header = reader.ReadBytes(Gvas.Header.Length);
                if (!Gvas.Header.SequenceEqual(header))
                {
                    throw new FormatException($"Invalid header, expected {Gvas.Header.AsHex()}");
                }

                var result = new Gvas();
                result.SaveGameVersion          = reader.ReadInt32();
                result.PackageVersion           = reader.ReadInt32();
                result.EngineVersion.Major      = reader.ReadInt16();
                result.EngineVersion.Minor      = reader.ReadInt16();
                result.EngineVersion.Patch      = reader.ReadInt16();
                result.EngineVersion.Build      = reader.ReadInt32();
                result.EngineVersion.BuildId    = reader.ReadUEString();
                result.CustomFormatVersion      = reader.ReadInt32();
                result.CustomFormatData.Count   = reader.ReadInt32();
                result.CustomFormatData.Entries = new CustomFormatDataEntry[result.CustomFormatData.Count];
                for (var i = 0; i < result.CustomFormatData.Count; i++)
                {
                    var entry = new CustomFormatDataEntry();
                    entry.Id    = new Guid(reader.ReadBytes(16));
                    entry.Value = reader.ReadInt32();
                    result.CustomFormatData.Entries[i] = entry;
                }
                result.SaveGameType = reader.ReadUEString();
                while (UEProperty.Read(reader) is UEProperty prop)
                {
                    Console.WriteLine(x++);
                    if (x == 10)
                    {
                        var json = JsonConvert.SerializeObject(result.Properties, new JsonSerializerSettings {
                            Formatting = Formatting.Indented
                        });
                        Console.WriteLine(json);
                    }
                    result.Properties.Add(prop);
                }

                return(result);
            }
        }
 public static void WriteGvas(Stream stream, Gvas save, bool compact)
 {
     using (var sw = new StreamWriter(stream, new UTF8Encoding(false, true)))
         using (var json_writer = new JsonTextWriter(sw))
         {
             json_writer.Formatting  = Formatting.Indented;
             json_writer.Indentation = 2;
             if (compact)
             {
                 JsonConvert_Compact.Write.Gvas(json_writer, save);
             }
             else
             {
                 JsonConvert_Invertible.Write.Gvas(json_writer, save);
             }
             json_writer.Flush();
         }
 }
        public static string WriteGvas(Gvas save, bool compact)
        {
            var sb = new StringBuilder();

            using (var tw = new StringWriter(sb))
                using (var json_writer = new JsonTextWriter(tw))
                {
                    json_writer.Formatting  = Formatting.Indented;
                    json_writer.Indentation = 2;
                    if (compact)
                    {
                        JsonConvert_Compact.Write.Gvas(json_writer, save);
                    }
                    else
                    {
                        JsonConvert_Invertible.Write.Gvas(json_writer, save);
                    }
                    json_writer.Flush();
                }
            return(sb.ToString());
        }
Beispiel #11
0
        static void Main(string[] args)
        {
            if (args.Length != 2)
            {
                Console.WriteLine("Usage:");
                Console.WriteLine("  gvas-converter infile outfile");
                return;
            }

            var ext = Path.GetExtension(args[0]).ToLower();

            if (ext == ".json")
            {
                Console.WriteLine("Loading json...");
                Gvas data   = JsonConvert.DeserializeObject <Gvas>(File.ReadAllText(args[0]), new GvasJsonConverter());
                var  stream = File.Open(args[1], FileMode.Create, FileAccess.Write);
                Console.WriteLine("Converting and saving file...");
                UESerializer.Write(stream, data);
            }
            else
            {
                Console.WriteLine("Parsing UE4 save file structure...");
                Gvas save;
                using (var stream = File.Open(args[0], FileMode.Open, FileAccess.Read, FileShare.Read))
                    save = UESerializer.Read(stream);

                Console.WriteLine("Converting to json...");
                var json = JsonConvert.SerializeObject(save, new JsonSerializerSettings {
                    Formatting = Formatting.Indented
                });

                Console.WriteLine("Saving json...");
                using (var stream = File.Open(args[1], FileMode.Create, FileAccess.Write, FileShare.Read))
                    using (var writer = new StreamWriter(stream, new UTF8Encoding(false)))
                        writer.Write(json);
            }
            Console.WriteLine("Done.");
        }
        private void LoadPlaylist(object sender, EventArgs e)
        {
            var fd = new OpenFileDialog();

            fd.DefaultExt   = "plo";
            fd.AddExtension = true;
            fd.Filter       = "Playlist (*.plo) | *.plo";
            var res = fd.ShowDialog();

            if (res.Accept())
            {
                try
                {
                    using (var stream = File.Open(fd.FileName, FileMode.Open, FileAccess.Read, FileShare.Read))
                        _playlist = UESerializer.Read(stream);
                }
                catch
                {
                    _playlist = null;
                    new UserMessages().InvalidIO();
                }
                if (_playlist != null && PlaylistScenarios.Items.Count() > 0)
                {
                    _playlistPath             = fd.FileName;
                    _shuffledPlaylist         = new KovaakHandler().ImportPlaylist(PlaylistScenarios.Items);
                    _importedListPlaylist     = new GroupUtil().UngroupBySame(_shuffledPlaylist);
                    _playlistNameTextbox.Text = $"{PlaylistName.Value} - Shuffled";
                    UpdateProgramState();
                }
            }

            else
            {
                new UserMessages().InvalidIO();
            }
        }