public static FSaveHeader Parse(BinaryReader reader)
        {
            var header = new FSaveHeader
            {
                HeaderVersion = (SaveHeaderVersion)reader.ReadInt32(),
                SaveVersion   = (FSaveCustomVersion)reader.ReadInt32(),
                BuildVersion  = reader.ReadInt32(),

                MapName     = reader.ReadLengthPrefixedString(),
                MapOptions  = reader.ReadLengthPrefixedString(),
                SessionName = reader.ReadLengthPrefixedString(),

                PlayDuration = reader.ReadInt32(),
                SaveDateTime = reader.ReadInt64()
            };

            log.Debug($"Read save header: Version={header.HeaderVersion}, Build={(int)header.SaveVersion}, Magic={header.BuildVersion}, MapName={header.MapName}, MapOpts={header.MapOptions}, Session={header.SessionName}, PlayTime={header.PlayDuration}, SaveTime={header.SaveDateTime}");

            if (header.HeaderVersion > SaveHeaderVersion.LatestVersion)
            {
                throw new UnknownSaveVersionException(header.HeaderVersion);
            }

            if (header.SaveVersion < FSaveCustomVersion.WireSpanFromConnnectionComponents || header.SaveVersion > FSaveCustomVersion.LatestVersion)
            {
                throw new UnknownBuildVersionException(header.SaveVersion);
            }

            if (header.HeaderVersion >= SaveHeaderVersion.AddedSessionVisibility)
            {
                header.SessionVisibility = (ESessionVisibility)reader.ReadByte();
            }

            return(header);
        }
예제 #2
0
        public static FSaveHeader Parse(BinaryReader reader)
        {
            var header = new FSaveHeader
            {
                HeaderVersion = (SaveHeaderVersion)reader.ReadInt32(),
                SaveVersion   = (FSaveCustomVersion)reader.ReadInt32(),
                BuildVersion  = reader.ReadInt32(),

                MapName     = reader.ReadLengthPrefixedString(),
                MapOptions  = reader.ReadLengthPrefixedString(),
                SessionName = reader.ReadLengthPrefixedString(),

                PlayDuration = reader.ReadInt32(),
                SaveDateTime = reader.ReadInt64()
            };

            log.Debug($"Read save header: HeaderVersion={header.HeaderVersion}, SaveVersion={(int)header.SaveVersion}, BuildVersion={header.BuildVersion}, MapName={header.MapName}, MapOpts={header.MapOptions}, Session={header.SessionName}, PlayTime={header.PlayDuration}, SaveTime={header.SaveDateTime}");

            if (header.HeaderVersion > SaveHeaderVersion.LatestVersion)
            {
                throw new UnknownSaveVersionException(header.HeaderVersion);
            }

            if (header.SaveVersion < FSaveCustomVersion.DROPPED_WireSpanFromConnnectionComponents || header.SaveVersion > FSaveCustomVersion.LatestVersion)
            {
                throw new UnknownBuildVersionException(header.SaveVersion);
            }

            if (header.HeaderVersion >= SaveHeaderVersion.AddedSessionVisibility)
            {
                header.SessionVisibility = (ESessionVisibility)reader.ReadByte();
                log.Debug($"SessionVisibility={header.SessionVisibility}");
            }

            if (header.HeaderVersion >= SaveHeaderVersion.UE425EngineUpdate)
            {
                header.EditorObjectVersion = reader.ReadInt32();
                log.Debug($"EditorObjectVersion={header.EditorObjectVersion}");
            }

            if (header.HeaderVersion >= SaveHeaderVersion.AddedModdingParams)
            {
                header.ModMetadata  = reader.ReadLengthPrefixedString();
                header.IsModdedSave = reader.ReadInt32() > 0;
                log.Debug($"ModMetadata={header.ModMetadata}, IsModdedSave={header.IsModdedSave}");
            }

            return(header);
        }