Пример #1
0
        public void LoadData()
        {
            BaseStream.Seek(Header.HeaderSize, SeekOrigin.Begin);
            using (AssetsReader reader = new AssetsReader(BaseStream, false))
            {
                Metadata = new AssetsMetadata(this);
                Metadata.Parse(reader);
            }
            BaseStream.Seek(Header.ObjectDataOffset, SeekOrigin.Begin);

            if (Manager.ForceLoadAllFiles)
            {
                foreach (var ext in Metadata.ExternalFiles)
                {
                    Manager.GetAssetsFile(ext.FileName);
                }
            }
            if (!Manager.LazyLoad)
            {
                foreach (var oi in Metadata.ObjectInfos)
                {
                    var o = oi.Object;
                }
                BaseStream.Close();
                BaseStream.Dispose();
                BaseStream = null;
            }
        }
Пример #2
0
 public BundleFile(Stream stream)
 {
     using (var reader = new AssetsReader(stream, false))
     {
         Parse(reader);
     }
 }
Пример #3
0
        public static SmartPtr <T> Read(AssetsFile assetsFile, AssetsObject owner, AssetsReader reader)
        {
            if (owner == null)
            {
                Log.LogErr("WARNING: SmartPtr created without an owner!");
            }
            int fileID = reader.ReadInt32();

            reader.AlignTo(4);
            Int64 pathID = reader.ReadInt64();

            if (fileID == 0 && pathID == 0)
            {
                return(new SmartPtr <T>());
            }

            var objInfo = assetsFile.GetObjectInfo <T>(fileID, pathID);

            if (objInfo == null)
            {
                Log.LogErr($"WARNING: Could not find objectinfo for creating SmartPtr of type {typeof(T).Name} on owner type {owner?.GetType()?.Name ?? "(null owner)"}!  Returned a null pointer instead.");
                return(null);
            }

            SmartPtr <T> ptr = new SmartPtr <T>(owner, assetsFile.GetObjectInfo <T>(fileID, pathID));

            //TODO: not sure this is only ever called by existing objects
            ptr.IsNew = false;

            return(ptr);
        }
Пример #4
0
        public AssetsFile(AssetsManager manager, IFileProvider fileProvider, string assetsRootPath, string assetsFileName, bool loadData = true)
        {
            Manager        = manager;
            FileProvider   = fileProvider;
            AssetsRootPath = assetsRootPath;
            AssetsFilename = assetsFileName;

            OpenBaseStream();

            BaseStream.Seek(0, SeekOrigin.Begin);
            using (AssetsReader reader = new AssetsReader(BaseStream, false))
            {
                Header = new AssetsFileHeader(reader);
            }

            if (Header.MetadataSize > Header.FileSize || Header.ObjectDataOffset < Header.MetadataSize || (Header.Version != 17 && Header.Version != 20))
            {
                throw new NotSupportedException($"{AssetsFilename} doesn't appear to be a valid assets file, or {Header.Version} is unsupported!");
            }

            if (loadData)
            {
                LoadData();
            }
        }
Пример #5
0
 private void Parse(AssetsReader reader)
 {
     Offset   = reader.ReadBEInt64();
     Size     = reader.ReadBEInt64();
     _flags   = reader.ReadBEUInt32();
     Filename = reader.ReadCStr();
 }
Пример #6
0
        private void Parse(AssetsReader reader)
        {
            UncompressedSize = reader.ReadBEUInt32();
            CompressedSize   = reader.ReadBEUInt32();

            _flags = reader.ReadBEUInt16();
        }
Пример #7
0
 private void Parse(AssetsReader reader)
 {
     ObjectID   = reader.ReadInt64();
     DataOffset = reader.ReadInt32();
     DataSize   = reader.ReadInt32();
     TypeIndex  = reader.ReadInt32();
 }
Пример #8
0
        private void Parse(AssetsReader reader)
        {
            int numTreeNodes     = reader.ReadInt32();
            int stringBufferSize = reader.ReadInt32();

            for (int i = 0; i < numTreeNodes; i++)
            {
                Entries.Add(new TypeTreeEntry(reader));
            }
            StringBuffer = new String(reader.ReadChars(stringBufferSize));
        }
Пример #9
0
 private void Parse(AssetsReader reader)
 {
     Version    = reader.ReadInt16();
     Depth      = reader.ReadSByte();
     IsArray    = reader.ReadBoolean();
     TypeOffset = reader.ReadInt32();
     NameOffset = reader.ReadInt32();
     Size       = reader.ReadInt32();
     Index      = reader.ReadInt32();
     Flags      = reader.ReadInt32();
 }
Пример #10
0
 private void Parse(AssetsReader reader)
 {
     MetadataSize     = reader.ReadBEInt32();
     FileSize         = reader.ReadBEInt32();
     Version          = reader.ReadBEInt32();
     ObjectDataOffset = reader.ReadBEInt32();
     IsBigEndian      = reader.ReadBoolean();
     //padding apparently
     //reader.ReadBytes(3);
     reader.AlignTo(4);
 }
Пример #11
0
 public AssetsObject(IObjectInfo <AssetsObject> objectInfo, AssetsReader reader, bool parseObject = false)
 {
     ObjectInfo = objectInfo;
     if (parseObject)
     {
         ParseObject(reader);
     }
     else
     {
         Parse(reader);
     }
 }
Пример #12
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;
                }
            }
        }
Пример #13
0
 private void Parse(AssetsReader reader, bool hasTypeTree)
 {
     ClassID  = reader.ReadInt32();
     Unknown1 = reader.ReadSByte();
     Unknown2 = reader.ReadInt16();
     if (IsScriptType)
     {
         ScriptHash = reader.ReadGuid();
     }
     TypeHash = reader.ReadGuid();
     if (hasTypeTree)
     {
         TypeTree = new TypeTree(reader);
     }
 }
Пример #14
0
        private void ParseDirectory(AssetsReader reader)
        {
            //unknown?
            _directoryUnknown = reader.ReadBytes(16);
            int numBlocks = reader.ReadBEInt32();

            for (int i = 0; i < numBlocks; i++)
            {
                BlockInfos.Add(new BlockInfo(reader));
            }

            int numEntries = reader.ReadBEInt32();

            for (int i = 0; i < numEntries; i++)
            {
                Entries.Add(new DirectoryEntry(reader));
            }
        }
Пример #15
0
            public void Parse(AssetsFile assetsFile, AssetsObject owner, AssetsReader reader)
            {
                Texture = SmartPtr <Texture2DObject> .Read(assetsFile, owner, reader);

                AlphaTexture = SmartPtr <Texture2DObject> .Read(assetsFile, owner, reader);

                SubMeshes   = reader.ReadArrayOf(r => new Submesh(reader));
                IndexBuffer = reader.ReadArray();
                reader.AlignTo(4);
                VertexData          = new VertexData(reader);
                BindPose            = reader.ReadArrayOf(r => r.ReadSingle());
                TextureRect         = new RectF(reader);
                TextureRectOffset   = new Vector2F(reader);
                AtlasRectOffset     = new Vector2F(reader);
                SettingsRaw         = reader.ReadUInt32();
                UVTransform         = new Vector4F(reader);
                DownscaleMultiplier = reader.ReadSingle();
            }
Пример #16
0
        public override void ParseObject(AssetsReader reader)
        {
            Name          = reader.ReadString();
            Rect          = new RectF(reader);
            Offset        = new Vector2F(reader);
            Border        = new Vector4F(reader);
            PixelsToUnits = reader.ReadSingle();
            Pivot         = new Vector2F(reader);
            Extrude       = reader.ReadUInt32();
            IsPolygon     = reader.ReadBoolean();
            reader.AlignTo(4);
            RenderDataKey = new Map <Guid, long>(reader.ReadGuid(), reader.ReadInt64());
            AtlasTags     = reader.ReadArrayOf(r => r.ReadString());
            SpriteAtlas   = SmartPtr <AssetsObject> .Read(ObjectInfo.ParentFile, this, reader);

            RenderData   = new SpriteRenderData(ObjectInfo.ParentFile, this, reader);
            PhysicsShape = reader.ReadArrayOf(r => r.ReadArrayOf(r2 => new Vector2F(r2)));
            Bones        = reader.ReadArrayOf(r => (ISmartPtr <Transform>)SmartPtr <Transform> .Read(ObjectInfo.ParentFile, this, reader));
        }
Пример #17
0
 public TypeTreeEntry(AssetsReader reader)
 {
     Parse(reader);
 }
Пример #18
0
 public void Parse(AssetsReader reader)
 {
     ParseBase(reader);
     ParseObject(reader);
 }
Пример #19
0
 public SpriteObject(IObjectInfo <AssetsObject> objectInfo, AssetsReader reader) : base(objectInfo)
 {
     Parse(reader);
 }
Пример #20
0
        private void Parse(AssetsReader reader)
        {
            //basic header stuff
            signature = reader.ReadCStr();
            if (signature != "UnityFS")
            {
                throw new NotSupportedException("Stream is not UnityFS");
            }
            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
            int compressedSize   = reader.ReadBEInt32();
            int decompressedSize = reader.ReadBEInt32();

            flags = reader.ReadBEUInt32();

            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:
                    // TODO Better way of encoding/decoding
                    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);
                }
            }
        }
Пример #21
0
 public SpriteRenderData(AssetsFile assetsFile, AssetsObject owner, AssetsReader reader)
 {
     Parse(assetsFile, owner, reader);
 }
Пример #22
0
 public BlockInfo(AssetsReader reader)
 {
     Parse(reader);
 }
Пример #23
0
 public virtual void ParseObject(AssetsReader reader)
 {
     Data = reader.ReadBytes(ObjectInfo.DataSize);
 }
Пример #24
0
 public DirectoryEntry(AssetsReader reader)
 {
     Parse(reader);
 }
Пример #25
0
 public AssetsFileHeader(AssetsReader reader)
 {
     Parse(reader);
 }
Пример #26
0
 public AssetInfo(AssetsFile assetsFile, AssetsObject owner, AssetsReader reader)
 {
     Parse(assetsFile, owner, reader);
 }
Пример #27
0
 private void Parse(AssetsFile assetsFile, AssetsObject owner, AssetsReader reader)
 {
     PreloadIndex = reader.ReadInt32();
     PreloadSize  = reader.ReadInt32();
     Asset        = SmartPtr <AssetsObject> .Read(assetsFile, owner, reader);
 }
Пример #28
0
 public RawPtr(AssetsReader reader)
 {
     Parse(reader);
 }
Пример #29
0
 public AssetsType(AssetsReader reader, bool hasTypeTrees = false)
 {
     Parse(reader, hasTypeTrees);
 }
Пример #30
0
 private void Parse(AssetsReader reader)
 {
     FileID = reader.ReadInt32();
     reader.AlignTo(4);
     PathID = reader.ReadInt64();
 }