Esempio n. 1
0
        public void Parse(AssetsReader reader)
        {
            Version      = reader.ReadCStr();
            Platform     = reader.ReadInt32();
            HasTypeTrees = reader.ReadBoolean();
            int numTypes = reader.ReadInt32();

            for (int i = 0; i < numTypes; i++)
            {
                Types.Add(new AssetsType(reader, HasTypeTrees));
            }
            int numObj = reader.ReadInt32();

            for (int i = 0; i < numObj; i++)
            {
                reader.AlignTo(4);
                var obj = ObjectInfo <AssetsObject> .Parse(ParentFile, reader);

                ObjectInfos.Add(obj);
            }
            int numAdds = reader.ReadInt32();

            for (int i = 0; i < numAdds; i++)
            {
                reader.AlignTo(4);
                Adds.Add(new RawPtr(reader));
            }
            int numExt = reader.ReadInt32();

            for (int i = 0; i < numExt; i++)
            {
                ExternalFiles.Add(new ExternalFile(reader));
            }
            reader.ReadCStr();
        }
Esempio n. 2
0
 private void Parse(AssetsReader reader)
 {
     AssetName = reader.ReadCStr();
     ID        = reader.ReadGuid();
     Type      = reader.ReadInt32();
     FileName  = reader.ReadCStr();
 }
Esempio n. 3
0
        public void Parse(AssetsReader reader)
        {
            Version      = reader.ReadCStr();
            Platform     = reader.ReadInt32();
            HasTypeTrees = reader.ReadBoolean();
            int numTypes = reader.ReadInt32();

            for (int i = 0; i < numTypes; i++)
            {
                Types.Add(new AssetsType(reader, HasTypeTrees));
            }

            List <ObjectRecord> records = new List <ObjectRecord>();
            int numObj = reader.ReadInt32();

            for (int i = 0; i < numObj; i++)
            {
                reader.AlignTo(4);
                var obj = new ObjectRecord(reader);
                records.Add(obj);
            }

            int numAdds = reader.ReadInt32();

            for (int i = 0; i < numAdds; i++)
            {
                reader.AlignTo(4);
                Adds.Add(new RawPtr(reader));
            }
            int numExt = reader.ReadInt32();

            for (int i = 0; i < numExt; i++)
            {
                ExternalFiles.Add(new ExternalFile(reader));
            }
            reader.ReadCStr();

            //load the object infos in order based on their type
            foreach (var record in records.OrderBy(x => PreloadObjectOrder(x)).ThenBy(x => x.ObjectID))
            {
                var obj = ObjectInfo <AssetsObject> .Parse(ParentFile, record);

                ObjectInfos.Add(obj);
                if (ShouldForceLoadObject(record))
                {
                    var o = obj.Object;
                }
            }
        }
Esempio n. 4
0
 private void Parse(AssetsReader reader)
 {
     Offset   = reader.ReadBEInt64();
     Size     = reader.ReadBEInt64();
     _flags   = reader.ReadBEUInt32();
     Filename = reader.ReadCStr();
 }
Esempio n. 5
0
        private void Parse(AssetsReader reader)
        {
            //basic header stuff
            var signature = reader.ReadCStr();

            if (signature != "UnityFS")
            {
                throw new NotSupportedException("Stream is not UnityFS");
            }
            var fileVersion = reader.ReadBEInt32();

            if (fileVersion != 6)
            {
                throw new NotSupportedException("File version is not supported");
            }
            PlayerVersion = reader.ReadCStr();
            EngineVersion = reader.ReadCStr();
            BundleSize    = reader.ReadBEInt64();

            //header info
            var compressedSize   = reader.ReadBEInt32();
            var decompressedSize = reader.ReadBEInt32();
            var flags            = reader.ReadBEUInt32();

            byte[] infoBytes;
            if (IsDirectoryAtEnd(flags))
            {
                var start = (int)reader.BaseStream.Position;
                reader.Seek((int)reader.BaseStream.Length - compressedSize);
                infoBytes = reader.ReadBytes(compressedSize);
                reader.Seek(start);
            }
            else
            {
                infoBytes = reader.ReadBytes(compressedSize);
            }

            Stream blockInfoStream = null;

            try
            {
                switch (CompressionMode(flags))
                {
                case UnityFSCompressionMode.LZ4:
                case UnityFSCompressionMode.LZ4HC:
                    blockInfoStream = new MemoryStream(LZ4.LZ4Codec.Decode(infoBytes, 0, infoBytes.Length, decompressedSize));
                    break;

                case UnityFSCompressionMode.NoCompression:
                    blockInfoStream = new MemoryStream(infoBytes);
                    break;

                case UnityFSCompressionMode.LZMA:
                    blockInfoStream = new MemoryStream(LZMADecode(infoBytes, decompressedSize));
                    break;
                }

                using (AssetsReader infoReader = new AssetsReader(blockInfoStream, false))
                    ParseDirectory(infoReader);
            }
            finally
            {
                if (blockInfoStream != null)
                {
                    blockInfoStream.Dispose();
                }
            }
            MemoryStream outputStream = new MemoryStream();

            foreach (var blockInfo in BlockInfos)
            {
                byte[] blockData = null;
                switch (blockInfo.CompressionMode)
                {
                case UnityFSCompressionMode.LZ4:
                case UnityFSCompressionMode.LZ4HC:
                    blockData = LZ4.LZ4Codec.Decode(reader.ReadBytes((int)blockInfo.CompressedSize), 0, (int)blockInfo.CompressedSize, (int)blockInfo.UncompressedSize);
                    break;

                case UnityFSCompressionMode.NoCompression:
                    blockData = reader.ReadBytes((int)blockInfo.UncompressedSize);
                    break;

                case UnityFSCompressionMode.LZMA:
                    blockData = LZMADecode(reader.BaseStream, (int)blockInfo.CompressedSize, (int)blockInfo.UncompressedSize);
                    break;
                }

                outputStream.Write(blockData, 0, blockData.Length);
            }
            using (outputStream)
            {
                foreach (var entry in Entries)
                {
                    outputStream.Seek(entry.Offset, SeekOrigin.Begin);
                    entry.Data = outputStream.ReadBytes((int)entry.Size);
                }
            }
        }