Example #1
0
 public FAnimCurveType(FArchive Ar)
 {
     bMaterial    = Ar.ReadBoolean();
     bMorphtarget = Ar.ReadBoolean();
 }
Example #2
0
 public virtual void Deserialize(FArchive reader) => TokenOffset = reader.Tell();
Example #3
0
 protected static Token Read(FArchive reader) => TokenFactory.Read(reader);
Example #4
0
        public IoStoreReader(FArchive tocStream, Func <string, FArchive> openContainerStreamFunc, EIoStoreTocReadOptions readOptions = EIoStoreTocReadOptions.ReadDirectoryIndex)
            : base(tocStream.Name, tocStream.Versions)
        {
            Length      = tocStream.Length;
            TocResource = new FIoStoreTocResource(tocStream, readOptions);

            List <FArchive> containerStreams;

            if (TocResource.Header.PartitionCount <= 0)
            {
                containerStreams = new List <FArchive>(1);
                try
                {
                    containerStreams.Add(openContainerStreamFunc(tocStream.Name.SubstringBeforeLast('.') + ".ucas"));
                }
                catch (Exception e)
                {
                    throw new FIoStatusException(EIoErrorCode.FileOpenFailed, $"Failed to open container partition 0 for {tocStream.Name}", e);
                }
            }
            else
            {
                containerStreams = new List <FArchive>((int)TocResource.Header.PartitionCount);
                var environmentPath = tocStream.Name.SubstringBeforeLast('.');
                for (int i = 0; i < TocResource.Header.PartitionCount; i++)
                {
                    try
                    {
                        var path = i > 0 ? string.Concat(environmentPath, "_s", i, ".ucas") : string.Concat(environmentPath, ".ucas");
                        containerStreams.Add(openContainerStreamFunc(path));
                    }
                    catch (Exception e)
                    {
                        throw new FIoStatusException(EIoErrorCode.FileOpenFailed, $"Failed to open container partition {i} for {tocStream.Name}", e);
                    }
                }
            }

            Length          += containerStreams.Sum(x => x.Length);
            ContainerStreams = containerStreams;
            if (TocResource.ChunkPerfectHashSeeds != null)
            {
                TocImperfectHashMapFallback = new();
                if (TocResource.ChunkIndicesWithoutPerfectHash != null)
                {
                    foreach (var chunkIndexWithoutPerfectHash in TocResource.ChunkIndicesWithoutPerfectHash)
                    {
                        TocImperfectHashMapFallback[TocResource.ChunkIds[chunkIndexWithoutPerfectHash]] = TocResource.ChunkOffsetLengths[chunkIndexWithoutPerfectHash];
                    }
                }
            }
#if GENERATE_CHUNK_ID_DICT
            else
            {
                TocImperfectHashMapFallback = new Dictionary <FIoChunkId, FIoOffsetAndLength>((int)TocResource.Header.TocEntryCount);
                for (var i = 0; i < TocResource.ChunkIds.Length; i++)
                {
                    TocImperfectHashMapFallback[TocResource.ChunkIds[i]] = TocResource.ChunkOffsetLengths[i];
                }
            }
#endif
            Info = TocResource.Header;
            if (TocResource.Header.Version > EIoStoreTocVersion.Latest)
            {
                log.Warning("Io Store \"{0}\" has unsupported version {1}", Path, (int)Info.Version);
            }
        }
Example #5
0
 public override void Deserialize(FArchive reader)
 {
     base.Deserialize(reader);
     reader.Read(out _value);
 }
Example #6
0
        protected virtual PlayerElimination ParseElimination(FArchive archive, EventInfo info)
        {
            try
            {
                var elim = new PlayerElimination
                {
                    Info = info,
                };

                if (archive.EngineNetworkVersion >= EngineNetworkVersionHistory.HISTORY_FAST_ARRAY_DELTA_STRUCT && Major >= 9)
                {
                    archive.SkipBytes(9);

                    elim.EliminatedInfo = new PlayerEliminationInfo
                    {
                        Unknown1 = new FVector(archive.ReadSingle(), archive.ReadSingle(), archive.ReadSingle()),
                        Location = new FVector(archive.ReadSingle(), archive.ReadSingle(), archive.ReadSingle()),
                        Unknown2 = new FVector(archive.ReadSingle(), archive.ReadSingle(), archive.ReadSingle()),
                    };

                    archive.ReadSingle(); //?

                    elim.EliminatorInfo = new PlayerEliminationInfo
                    {
                        Unknown1 = new FVector(archive.ReadSingle(), archive.ReadSingle(), archive.ReadSingle()),
                        Location = new FVector(archive.ReadSingle(), archive.ReadSingle(), archive.ReadSingle()),
                        Unknown2 = new FVector(archive.ReadSingle(), archive.ReadSingle(), archive.ReadSingle()),
                    };

                    ParsePlayer(archive, elim.EliminatedInfo);
                    ParsePlayer(archive, elim.EliminatorInfo);
                }
                else
                {
                    if (Major <= 4 && Minor < 2)
                    {
                        archive.SkipBytes(12);
                    }
                    else if (Major == 4 && Minor <= 2)
                    {
                        archive.SkipBytes(40);
                    }
                    else
                    {
                        archive.SkipBytes(45);
                    }

                    elim.EliminatedInfo = new PlayerEliminationInfo
                    {
                        Id = archive.ReadFString()
                    };

                    elim.EliminatorInfo = new PlayerEliminationInfo
                    {
                        Id = archive.ReadFString()
                    };
                }

                elim.GunType   = archive.ReadByte();
                elim.Knocked   = archive.ReadUInt32AsBoolean();
                elim.Timestamp = info.StartTime;

                return(elim);
            }
            catch (Exception ex)
            {
                _logger?.LogError($"Error while parsing PlayerElimination at timestamp {info.StartTime}");
                throw new PlayerEliminationException($"Error while parsing PlayerElimination at timestamp {info.StartTime}", ex);
            }
        }
Example #7
0
 public override FArchive Serialize(FArchive archive)
 => base.Serialize(archive)
 .Read(ref _value);
Example #8
0
        public FRigVMByteCode(FArchive Ar)
        {
            InstructionCount = Ar.Read <int>();
            OpCode           = Ar.Read <ERigVMOpCode>();

            switch (OpCode)
            {
            case ERigVMOpCode.Execute_0_Operands:
            case ERigVMOpCode.Execute_1_Operands:
            case ERigVMOpCode.Execute_2_Operands:
            case ERigVMOpCode.Execute_3_Operands:
            case ERigVMOpCode.Execute_4_Operands:
            case ERigVMOpCode.Execute_5_Operands:
            case ERigVMOpCode.Execute_6_Operands:
            case ERigVMOpCode.Execute_7_Operands:
            case ERigVMOpCode.Execute_8_Operands:
            case ERigVMOpCode.Execute_9_Operands:
            case ERigVMOpCode.Execute_10_Operands:
            case ERigVMOpCode.Execute_11_Operands:
            case ERigVMOpCode.Execute_12_Operands:
            case ERigVMOpCode.Execute_13_Operands:
            case ERigVMOpCode.Execute_14_Operands:
            case ERigVMOpCode.Execute_15_Operands:
            case ERigVMOpCode.Execute_16_Operands:
            case ERigVMOpCode.Execute_17_Operands:
            case ERigVMOpCode.Execute_18_Operands:
            case ERigVMOpCode.Execute_19_Operands:
            case ERigVMOpCode.Execute_20_Operands:
            case ERigVMOpCode.Execute_21_Operands:
            case ERigVMOpCode.Execute_22_Operands:
            case ERigVMOpCode.Execute_23_Operands:
            case ERigVMOpCode.Execute_24_Operands:
            case ERigVMOpCode.Execute_25_Operands:
            case ERigVMOpCode.Execute_26_Operands:
            case ERigVMOpCode.Execute_27_Operands:
            case ERigVMOpCode.Execute_28_Operands:
            case ERigVMOpCode.Execute_29_Operands:
            case ERigVMOpCode.Execute_30_Operands:
            case ERigVMOpCode.Execute_31_Operands:
            case ERigVMOpCode.Execute_32_Operands:
            case ERigVMOpCode.Execute_33_Operands:
            case ERigVMOpCode.Execute_34_Operands:
            case ERigVMOpCode.Execute_35_Operands:
            case ERigVMOpCode.Execute_36_Operands:
            case ERigVMOpCode.Execute_37_Operands:
            case ERigVMOpCode.Execute_38_Operands:
            case ERigVMOpCode.Execute_39_Operands:
            case ERigVMOpCode.Execute_40_Operands:
            case ERigVMOpCode.Execute_41_Operands:
            case ERigVMOpCode.Execute_42_Operands:
            case ERigVMOpCode.Execute_43_Operands:
            case ERigVMOpCode.Execute_44_Operands:
            case ERigVMOpCode.Execute_45_Operands:
            case ERigVMOpCode.Execute_46_Operands:
            case ERigVMOpCode.Execute_47_Operands:
            case ERigVMOpCode.Execute_48_Operands:
            case ERigVMOpCode.Execute_49_Operands:
            case ERigVMOpCode.Execute_50_Operands:
            case ERigVMOpCode.Execute_51_Operands:
            case ERigVMOpCode.Execute_52_Operands:
            case ERigVMOpCode.Execute_53_Operands:
            case ERigVMOpCode.Execute_54_Operands:
            case ERigVMOpCode.Execute_55_Operands:
            case ERigVMOpCode.Execute_56_Operands:
            case ERigVMOpCode.Execute_57_Operands:
            case ERigVMOpCode.Execute_58_Operands:
            case ERigVMOpCode.Execute_59_Operands:
            case ERigVMOpCode.Execute_60_Operands:
            case ERigVMOpCode.Execute_61_Operands:
            case ERigVMOpCode.Execute_62_Operands:
            case ERigVMOpCode.Execute_63_Operands:
            case ERigVMOpCode.Execute_64_Operands:
            {
                var op    = Ar.Read <FRigVMExecuteOp>();
                var count = op.OpCode - ERigVMOpCode.Execute_0_Operands;

                for (var idx = 0; idx < count; idx++)
                {
                    var _ = Ar.Read <FRigVMOperand>();
                }

                break;
            }

            case ERigVMOpCode.Copy:
            {
                var _ = Ar.Read <FRigVMCopyOp>();
                break;
            }

            case ERigVMOpCode.Zero:
            case ERigVMOpCode.BoolFalse:
            case ERigVMOpCode.BoolTrue:
            case ERigVMOpCode.Increment:
            case ERigVMOpCode.Decrement:
            {
                var _ = Ar.Read <FRigVMUnaryOp>();
                break;
            }

            case ERigVMOpCode.Equals:
            case ERigVMOpCode.NotEquals:
            {
                var _ = Ar.Read <FRigVMComparisonOp>();
                break;
            }

            case ERigVMOpCode.JumpAbsolute:
            case ERigVMOpCode.JumpForward:
            case ERigVMOpCode.JumpBackward:
            {
                var _ = Ar.Read <FRigVMJumpOp>();
                break;
            }

            case ERigVMOpCode.JumpAbsoluteIf:
            case ERigVMOpCode.JumpForwardIf:
            case ERigVMOpCode.JumpBackwardIf:
            {
                var _ = Ar.Read <FRigVMJumpIfOp>();
                break;
            }

            case ERigVMOpCode.BeginBlock:
            {
                var _ = Ar.Read <FRigVMBinaryOp>();
                break;
            }
            }
        }
Example #9
0
 public override void Deserialize(FArchive reader)
 {
     base.Deserialize(reader);
     _value = true;
 }
Example #10
0
 public override FArchive Serialize(FArchive archive)
 => archive.Read(ref _sourceDateTime)
 .ReadUnsafe(ref _timeStyle)
 .Read(ref _timeZone)
 .Read(ref _cultureName);
Example #11
0
 public override TaggedObject?Read(FArchive reader) => null;
Example #12
0
        public static EAudioFormat GetAudioFormat(FArchive Ar)
        {
            var rfId = Ar.Read <EChunkIdentifier>();

            if (rfId != EChunkIdentifier.RIFF)
            {
                throw new Exception($"Invalid RIFF identifier (should be {EChunkIdentifier.RIFF} but actually is {rfId})");
            }

            var fileSize = Ar.Read <uint>();

            var wvId = Ar.Read <EChunkIdentifier>();

            if (wvId != EChunkIdentifier.WAVE)
            {
                throw new Exception($"Invalid WAVE identifier (should be {EChunkIdentifier.WAVE} but actually is {wvId})");
            }

            var ftId = Ar.Read <EChunkIdentifier>();

            if (ftId != EChunkIdentifier.FMT)
            {
                throw new Exception($"Invalid FMT identifier (should be {EChunkIdentifier.FMT} but actually is {ftId})");
            }

            var ftSize          = Ar.Read <uint>();
            var savePos         = Ar.Position;
            var wFormatTag      = Ar.Read <EAudioFormat>();
            var nChannels       = Ar.Read <ushort>();
            var nSamplesPerSec  = Ar.Read <uint>();
            var nAvgBytesPerSec = Ar.Read <uint>();
            var nBlockAlign     = Ar.Read <ushort>();
            var wBitsPerSample  = Ar.Read <ushort>();

            if (wFormatTag <= EAudioFormat.WAVE_FORMAT_PCM)
            {
                Ar.Position = savePos + ftSize;
                return(wFormatTag);
            }

            var cbSize = Ar.Read <ushort>();

            if (wFormatTag < EAudioFormat.WAVE_FORMAT_EXTENSIBLE)
            {
                Ar.Position = savePos + ftSize;
                return(wFormatTag);
            }

            if (wBitsPerSample != (8 * nBlockAlign / nChannels))
            {
                throw new Exception("The original bits/sample field does not match the container size");
            }

            var wValidBitsPerSample = Ar.Read <ushort>();
            var dwChannelMask       = Ar.Read <uint>();

            wFormatTag   = Ar.Read <EAudioFormat>();
            Ar.Position -= sizeof(EAudioFormat);
            var subFormat = Ar.Read <FGuid>();

            Ar.Position = savePos + ftSize;
            return(wFormatTag);
        }
 public FIoStoreTocEntryMeta(FArchive Ar)
 {
     ChunkHash = new FIoChunkHash(Ar);
     Flags     = Ar.Read <FIoStoreTocEntryMetaFlags>();
 }
Example #14
0
 public override void Deserialize(FArchive reader, PropertyTag tag) => reader.Read(out _value);
Example #15
0
 protected override void ReadReplayHeader(FArchive archive)
 {
     base.ReadReplayHeader(archive);
     Branch = Replay.Header.Branch;
 }
 public FAssetRegistryArchive(FArchive Ar)
 {
     baseArchive = Ar;
 }
Example #17
0
        /// <summary>
        /// see https://github.com/EpicGames/UnrealEngine/blob/70bc980c6361d9a7d23f6d23ffe322a2d6ef16fb/Engine/Source/Runtime/NetworkReplayStreaming/LocalFileNetworkReplayStreaming/Private/LocalFileNetworkReplayStreaming.cpp#L363
        /// </summary>
        /// <param name="archive"></param>
        /// <returns></returns>
        protected override void ReadEvent(FArchive archive)
        {
            var info = new EventInfo
            {
                Id          = archive.ReadFString(),
                Group       = archive.ReadFString(),
                Metadata    = archive.ReadFString(),
                StartTime   = archive.ReadUInt32(),
                EndTime     = archive.ReadUInt32(),
                SizeInBytes = archive.ReadInt32()
            };

            _logger?.LogDebug($"Encountered event {info.Group} ({info.Metadata}) at {info.StartTime} of size {info.SizeInBytes}");

            if (archive.NetworkVersion == 0)
            {
                _logger?.LogWarning($"Event occurred before header written. Ignoring ...");

                return;
            }

            using var decryptedReader = Decrypt(archive, info.SizeInBytes);

            // Every event seems to start with some unknown int
            if (info.Group == ReplayEventTypes.PLAYER_ELIMINATION)
            {
                var elimination = ParseElimination(decryptedReader, info);
                Replay.Eliminations.Add(elimination);
                return;
            }
            else if (info.Metadata == ReplayEventTypes.MATCH_STATS)
            {
                Replay.Stats = ParseMatchStats(decryptedReader, info);
                return;
            }
            else if (info.Metadata == ReplayEventTypes.TEAM_STATS)
            {
                Replay.TeamStats = ParseTeamStats(decryptedReader, info);
                return;
            }
            else if (info.Metadata == ReplayEventTypes.ENCRYPTION_KEY)
            {
                Replay.GameInformation.PlayerStateEncryptionKey = ParseEncryptionKeyEvent(decryptedReader, info);
                return;
            }
            else if (info.Metadata == ReplayEventTypes.CHARACTER_SAMPLE)
            {
                ParseCharacterSample(decryptedReader, info);
                return;
            }
            else if (info.Group == ReplayEventTypes.ZONE_UPDATE)
            {
                ParseZoneUpdateEvent(decryptedReader, info);
                return;
            }
            else if (info.Group == ReplayEventTypes.BATTLE_BUS)
            {
                ParseBattleBusFlightEvent(decryptedReader, info);
                return;
            }
            else if (info.Group == "fortBenchEvent")
            {
                return;
            }

            _logger?.LogWarning($"Unknown event {info.Group} ({info.Metadata}) of size {info.SizeInBytes}");
            // optionally throw?
            throw new UnknownEventException($"Unknown event {info.Group} ({info.Metadata}) of size {info.SizeInBytes}");
        }
Example #18
0
 public TaggedObject(FArchive reader) => Deserialize(reader);
Example #19
0
 public void Deserialize(FArchive reader)
 {
     reader.Read(out _min);
     reader.Read(out _max);
     reader.Read(out _isValid);
 }
Example #20
0
 public void Deserialize(FArchive reader)
 {
     throw new NotImplementedException();
 }