예제 #1
0
        public static UEProperty Read(BinaryReader reader)
        {
            if (reader.PeekChar() < 0)
            {
                return(null);
            }

            var name = reader.ReadUEString();

            if (name == null)
            {
                return(null);
            }

            if (name == "None")
            {
                return new UENoneProperty {
                           Name = name
                }
            }
            ;

            var type        = reader.ReadUEString();
            var valueLength = reader.ReadInt64();

            return(UESerializer.Deserialize(name, type, valueLength, reader));
        }
예제 #2
0
        public UEArrayProperty(BinaryReader reader, long valueLength)
        {
            ItemType = reader.ReadUEString();
            var terminator = reader.ReadByte();

            if (terminator != 0)
            {
                throw new FormatException($"Offset: 0x{reader.BaseStream.Position - 1:x8}. Expected terminator (0x00), but was (0x{terminator:x2})");
            }

            // valueLength starts here
            var count = reader.ReadInt32();

            Items = new UEProperty[count];

            switch (ItemType)
            {
            case "StructProperty":
                Items = Read(reader, count);
                break;

            case "ByteProperty":
                Items = UEByteProperty.Read(reader, valueLength, count);
                break;

            default:
            {
                for (var i = 0; i < count; i++)
                {
                    Items[i] = UESerializer.Deserialize(null, ItemType, -1, reader);
                }
                break;
            }
            }
        }
예제 #3
0
        static void Main(string[] args)
        {
            if (args.Length != 1)
            {
                Console.WriteLine("Usage:");
                Console.WriteLine("  gvas-converter path_to_save_file|path_to_json");
                return;
            }

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

            if (ext == ".json")
            {
                Console.WriteLine("Not implemented atm");
            }
            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[0] + ".json", FileMode.Create, FileAccess.Write, FileShare.Read))
                    using (var writer = new StreamWriter(stream, new UTF8Encoding(false)))
                        writer.Write(json);
            }
            Console.WriteLine("Done.");
            Console.ReadKey(true);
        }
예제 #4
0
        public static UEProperty[] Read(BinaryReader reader, int count)
        {
            if (reader.PeekChar() < 0)
            {
                return(null);
            }

            var name        = reader.ReadUEString();
            var type        = reader.ReadUEString();
            var valueLength = reader.ReadInt64();

            return(UESerializer.Deserialize(name, type, valueLength, count, reader));
        }
예제 #5
0
        public UEMapProperty(BinaryReader reader, long valueLength)
        {
            KeyType   = reader.ReadUEString();
            ValueType = reader.ReadUEString();
            var unknown = reader.ReadBytes(5);

            if (unknown.Any(b => b != 0))
            {
                throw new InvalidOperationException($"Offset: 0x{reader.BaseStream.Position-5:x8}. Expected ??? to be 0, but was 0x{unknown.AsHex()}");
            }

            var count = reader.ReadInt32();

            for (var i = 0; i < count; i++)
            {
                UEProperty key, value;
                if (KeyType == "StructProperty")
                {
                    key = Read(reader);
                }
                else
                {
                    key = UESerializer.Deserialize(null, KeyType, -1, reader);
                }
                var values = new List <UEProperty>();
                do
                {
                    if (ValueType == "StructProperty")
                    {
                        value = Read(reader);
                    }
                    else
                    {
                        value = UESerializer.Deserialize(null, ValueType, -1, reader);
                    }
                    values.Add(value);
                } while (!(value is UENoneProperty));
                Map.Add(new UEKeyValuePair {
                    Key = key, Values = values
                });
            }
            if (count == 0)
            {
                //Read(reader);
                Read(reader);
            }
        }
예제 #6
0
        static void Main(string[] args)
        {
            Console.WriteLine();
            Console.WriteLine(@"  __           __");
            Console.WriteLine(@" /__ \  / /\  (_ ");
            Console.WriteLine(@" \_|  \/ /--\ __) v" + GetAppVersion());
            Console.WriteLine();

            if (args.Length != 1)
            {
                Console.WriteLine();
                Console.WriteLine("Usage:");
                Console.WriteLine();
                Console.WriteLine("  gvas-converter [path_to_save_file]");
                Console.WriteLine();
                return;
            }

            Console.WriteLine("Parsing UE4 save file structure...");
            Gvas save;

            if (!File.Exists(args[0]))
            {
                Console.WriteLine("Error: File not found");
                return;
            }

            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[0] + ".json", FileMode.Create, FileAccess.Write, FileShare.Read))
                using (var writer = new StreamWriter(stream, new UTF8Encoding(false)))
                    writer.Write(json);

            Console.WriteLine("Done");
            Console.ReadKey(true);
        }
예제 #7
0
        static void ReadSave(FileInfo file)
        {
            var bytes      = ReadBytes(file.FullName);
            var parsedFile = new SaveFile(file, bytes);

            Console.WriteLine($"{bytes.Length} bytes in {file.Name}: {bytes[0]}, {bytes[1]}, {bytes[2]}, {bytes[3]}");
            Gvas save;

            using (var stream = File.Open(file.FullName, FileMode.Open, FileAccess.Read, FileShare.Read))
                save = UESerializer.Read(stream);
            var json = JsonConvert.SerializeObject(save, new JsonSerializerSettings {
                Formatting = Formatting.Indented
            });

            using (var stream = File.Open(file.FullName + ".json", FileMode.Create, FileAccess.Write, FileShare.Read))
                using (var writer = new StreamWriter(stream, new UTF8Encoding(false)))
                    writer.Write(json);
            //Console.WriteLine(FormatSave(parsedFile.Text));
        }
        private void SavePlaylist(object sender, EventArgs e)
        {
            var dir     = Path.GetDirectoryName(_playlistPath);
            var pname   = _playlistNameTextbox.Text;
            var path    = Path.Combine(dir, pname + KOVAAK_PLAYLIST_EXTENSION);
            var fexists = File.Exists(path);

            if (!fexists || overwriteCheckbox.Checked)
            {
                PlaylistName.Value      = pname;
                PlaylistScenarios.Items = new KovaakHandler().ExportPlaylist(_shuffledPlaylist, (UEGenericStructProperty)PlaylistScenarios.Items[0]);

                File.WriteAllText(path, string.Empty);
                using (var stream = File.Open(path, FileMode.Append))
                    UESerializer.WriteKovaakSpecific(_playlist, stream);
                new UserMessages().ValidIO();
            }
            else if (fexists && !overwriteCheckbox.Checked)
            {
                new UserMessages().InvalidOverwrite();
            }
        }
예제 #9
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.");
        }
예제 #10
0
        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();
            }
        }
예제 #11
0
        public UESetProperty(BinaryReader reader, long valueLength)
        {
            var ItemType = reader.ReadUEString();

            if (ItemType == "IntProperty")
            {
                ItemType += "Array";
            }

            var terminator = reader.ReadByte();

            if (terminator != 0)
            {
                throw new FormatException($"Offset: 0x{reader.BaseStream.Position - 1:x8}. Expected terminator (0x00), but was (0x{terminator:x2})");
            }

            reader.ReadInt32();
            var count = reader.ReadInt32();

            Address = $"0x{ reader.BaseStream.Position - 1:x8}";

            Items = new UEProperty[count];
            switch (ItemType)
            {
            case "StructProperty":
                Items = Read(reader, count);
                break;

            case "ByteProperty":
                Items = UEByteProperty.Read(reader, valueLength, count);
                break;

            case "IntPropertyArray":
                for (var i = 0; i < count; i++)
                {
                    var value = reader.ReadInt32();
                    Items[i] = new UEIntProperty()
                    {
                        Value = value
                    };
                    Debug.WriteLine(String.Format("  {0} {1}", ((UEIntProperty)Items[i]).Value, $"0x{reader.BaseStream.Position - 1:x8}"));
                }
                break;

            case "EnumProperty":
                for (var i = 0; i < count; i++)
                {
                    Items[i] = new UEEnumProperty()
                    {
                        Value = reader.ReadUEString(),
                    };
                    Debug.WriteLine(String.Format("  {0} ({1}) {2}", ((UEEnumProperty)Items[i]).EnumType, ((UEEnumProperty)Items[i]).Value, $"0x{reader.BaseStream.Position - 1:x8}"));
                }
                break;

            case "SoftObjectProperty":
                for (var i = 0; i < count; i++)
                {
                    Items[i] = new UEStringProperty()
                    {
                        Value = reader.ReadUEString(),
                    };
                    Debug.WriteLine(String.Format("  {0} {1}", ((UEStringProperty)Items[i]).Value, $"0x{reader.BaseStream.Position - 1:x8}"));
                }
                break;

            default:
            {
                for (var i = 0; i < count; i++)
                {
                    Items[i] = UESerializer.Deserialize(null, ItemType, -1, reader);
                }
                break;
            }
            }
        }
예제 #12
0
        public UEMapProperty(BinaryReader reader, long valueLength)
        {
            var keyType   = reader.ReadUEString();
            var valueType = reader.ReadUEString();

            if (valueType == "IntProperty")
            {
                valueType += "Array";
            }

            var unknown = reader.ReadBytes(5);

            if (unknown.Any(b => b != 0))
            {
                throw new InvalidOperationException($"Offset: 0x{reader.BaseStream.Position-5:x8}. Expected ??? to be 0, but was 0x{unknown.AsHex()}");
            }

            var count = reader.ReadInt32();

            for (var i = 0; i < count; i++)
            {
                UEProperty key, value;

                if (keyType == "StructProperty")
                {
                    key = Read(reader);
                }
                else
                {
                    key = UESerializer.Deserialize(null, keyType, -1, reader);
                }
                var values = new List <UEProperty>();

                switch (valueType)
                {
                case "StructProperty":
                    value = Read(reader);
                    break;

                case "BoolProperty":
                    value = new UEBoolProperty()
                    {
                        Value = reader.ReadBoolean()
                    };
                    Debug.WriteLine(String.Format("  {0}: {1}", ((UEStringProperty)key).Value, ((UEBoolProperty)value).Value));
                    break;

                case "FloatProperty":
                    var bytes = reader.ReadBytes(4);
                    value = new UEFloatProperty()
                    {
                        Value = System.BitConverter.ToSingle(bytes, 0)
                    };
                    Debug.WriteLine(String.Format("  {0}: {1}", ((UEStringProperty)key).Value, ((UEFloatProperty)value).Value));
                    break;

                case "EnumProperty":
                    var      length     = reader.ReadInt32();
                    var      valueBytes = reader.ReadBytes(length);
                    Encoding Utf8       = new UTF8Encoding(false);

                    if (length > 0)
                    {
                        value = new UEEnumProperty()
                        {
                            Value = Utf8.GetString(valueBytes, 0, valueBytes.Length - 1)
                        };
                        Debug.WriteLine(String.Format("  {0}: {1}", ((UEStringProperty)key).Value, ((UEFloatProperty)value).Value));
                    }
                    else
                    {
                        value = new UEEnumProperty();
                        Debug.WriteLine(String.Format("  {0}: {1}", ((UEStringProperty)key).Value, ""));
                    }

                    break;

                default:
                    value = UESerializer.Deserialize(null, valueType, -1, reader);
                    break;
                }

                values.Add(value);

                Map.Add(new UEKeyValuePair {
                    Key = key, Values = values
                });
            }
        }