Beispiel #1
0
        public FActorInstanceRecord(FLevelSaveRecordArchive Ar)
        {
            if (Ar.Version < ELevelSaveRecordVersion.TimestampConversion)
            {
                RecordID = Ar.Read <ulong>();
            }
            else
            {
                RecordID = Ar.Read <ulong>(); // There's something stripped out in the above block, so it's the same
            }

            TemplateRecordID = Ar.Read <ulong>();

            if (Ar.Version < ELevelSaveRecordVersion.UsingSaveActorGUID)
            {
                ActorId = Ar.ReadFName();
                // TODO hash or something that results in a unique GUID based on the name?
            }
            else
            {
                if (Ar.Version != ELevelSaveRecordVersion.UsingSaveActorGUID)
                {
                    ActorId = Ar.ReadFName();
                }

                ActorGuid = Ar.Read <FGuid>();
            }

            Transform = Ar.Read <FTransform>();
        }
Beispiel #2
0
        public FActorTemplateRecord(FLevelSaveRecordArchive Ar)
        {
            ID = Ar.Read <ulong>();

            if (Ar.Version < ELevelSaveRecordVersion.SoftActorClassReferences)
            {
                var obj = Ar.ReadUObject(); // TODO untested code path
                if (obj != null)
                {
                    var pathName = obj.GetPathName();
                    ActorClass = new FSoftObjectPath(pathName.SubstringBeforeLast(':'), ""); // TODO SubPathString
                }
                else
                {
                    ActorClass = new();
                }
            }
            else
            {
                ActorClass = new FSoftObjectPath(Ar);
            }

            // var redirectsObj = GetDefaultObject<ULevelSaveRecordActorClassRedirects>();
            // var redirects = redirectsObj.LevelSaveRecordActorClassRedirects;
            // ... We don't care about redirects anyways

            ActorComponents = Ar.ReadArray(() => new FActorComponentRecord(Ar));

            // skip, idk what it's doing

            ActorData = Ar.ReadArray <byte>();

            var crc = new CRC32();

            crc.SlurpBlock(ActorData, 0, ActorData.Length);
            var hash = (uint)crc.Crc32Result;

            if (Ar.Version < ELevelSaveRecordVersion.AddingDataHash)
            {
                DataHash = hash;
            }
            else
            {
                DataHash = Ar.Read <uint>();
                if (DataHash != hash)
                {
                    Log.Error("FActorTemplateRecord::Serialize failed to deserialize data for: {0} dropping corrupted data.", ActorClass.ToString());
                    ActorData = null;
                    DataHash  = 0;
                }
            }
        }
Beispiel #3
0
        public FActorComponentRecord(FLevelSaveRecordArchive Ar)
        {
            ComponentName = Ar.ReadFName();

            if (Ar.Version < ELevelSaveRecordVersion.SoftActorComponentClassReferences)
            {
                var obj = Ar.ReadUObject(); // TODO untested code path
                if (obj != null)
                {
                    var pathName = obj.GetPathName();
                    ComponentClass = new FSoftObjectPath(pathName.SubstringBeforeLast(':'), ""); // TODO SubPathString
                }
                else
                {
                    ComponentClass = new();
                }
            }
            else
            {
                ComponentClass = new FSoftObjectPath(Ar);
            }

            // skip, idk what it's doing with /Game/ and /Script/

            ComponentData = Ar.ReadArray <byte>();

            var crc = new CRC32();

            crc.SlurpBlock(ComponentData, 0, ComponentData.Length);
            var hash = (uint)crc.Crc32Result;

            if (Ar.Version < ELevelSaveRecordVersion.AddingDataHash)
            {
                DataHash = hash;
            }
            else
            {
                DataHash = Ar.Read <uint>();
                if (DataHash != hash)
                {
                    Log.Error("FActorComponentRecord::Serialize failed to deserialize data for: {0} dropping corrupted data.", ComponentClass.ToString());
                    ComponentData = null;
                    DataHash      = 0;
                }
            }
        }
Beispiel #4
0
        public override void Deserialize(FAssetArchive Ar, long validPos)
        {
            DeserializeHeader(Ar);

            if (SaveVersion < ELevelSaveRecordVersion.SwitchingToCoreSerialization)
            {
                var wrappedAr = new FLevelSaveRecordArchive(Ar, SaveVersion);
                DeserializeLevelSaveRecordData(wrappedAr);
            }
            else
            {
                if (SaveVersion <= ELevelSaveRecordVersion.AddedLevelInstance)
                {
                    Ar.Position += 1; //var _ = Ar.ReadByte(); // 2 almost? every time
                }
                base.Deserialize(Ar, validPos);
            }
        }