Exemplo n.º 1
0
        private void AssetInfo_Load(object sender, EventArgs e)
        {
            AssetsFileHeader header   = file.header;
            TypeTree         typeTree = file.typeTree;

            //header
            hdr_mds.Text = header.metadataSize.ToString();
            hdr_fs.Text  = header.fileSize.ToString();
            hdr_fmt.Text = $"{header.format.ToString()} (0x{header.format.ToString("x")})";
            hdr_ffo.Text = $"{header.firstFileOffset.ToString()} (0x{header.firstFileOffset.ToString("x")})";
            hdr_en.Text  = header.endianness == 1 ? "big endian" : "little endian";
            hdr_uvr.Text = typeTree.unityVersion;
            hdr_ver.Text = $"{typeTree.version.ToString()} (0x{typeTree.version.ToString("x")})";
            hdr_htt.Text = typeTree.hasTypeTree == true ? "true" : "false";
            //type tree
            if (!typeTree.hasTypeTree)
            {
                ttr_tree.Nodes.Add("There is no type tree data available.");
            }
            else
            {
                ttr_tree.Nodes.Add("Select a type to show the type tree data.");
            }
            foreach (Type_0D type in typeTree.unity5Types)
            {
                if (type.typeFieldsExCount == 0)
                {
                    ClassDatabaseType cldt = cldb.classes.First(c => c.classId == type.classId);
                    ttr_list.Items.Add($"[{cldt.name.GetString(cldb)}] (0x{type.classId.ToString("x")})");
                }
                else
                {
                    TypeField_0D baseField = type.typeFieldsEx[0];
                    ttr_list.Items.Add($"{baseField.GetTypeString(type.stringTable)} (0x{type.classId.ToString("x")})");
                }
            }
            //preload list
            foreach (AssetPPtr pptr in file.preloadTable.items)
            {
                string pptrFileName = "[self]";
                if (pptr.fileID != 0)
                {
                    pptrFileName = file.dependencies.dependencies[pptr.fileID - 1].assetPath;
                }
                plt_list.Items.Add(new ListViewItem(new[] { pptrFileName, pptr.pathID.ToString() }));
            }
            plt_list.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
            //dependencies
            foreach (AssetsFileDependency dep in file.dependencies.dependencies)
            {
                string guid = string.Empty;
                if (dep.guid.mostSignificant != 0 || dep.guid.leastSignificant != 0)
                {
                    guid = $"{dep.guid.mostSignificant.ToString("x8")}{dep.guid.leastSignificant.ToString("x8")}";
                }
                dep_list.Items.Add(new ListViewItem(new[] { dep.assetPath, "0x" + dep.type.ToString(), guid }));
            }
            dep_list.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
        }
Exemplo n.º 2
0
        public static byte[] CreateBlankAssets(string engineVersion, List <Type_0D> types)
        {
            using (MemoryStream ms = new MemoryStream())
                using (AssetsFileWriter writer = new AssetsFileWriter(ms))
                {
                    AssetsFileHeader header = new AssetsFileHeader()
                    {
                        metadataSize   = 0,
                        fileSize       = 0x1000,
                        format         = 0x11,
                        offs_firstFile = 0x1000,
                        endianness     = 0,
                        unknown        = new byte[] { 0, 0, 0 }
                    };
                    TypeTree typeTree = new TypeTree()
                    {
                        unityVersion  = engineVersion,
                        version       = 0x5,
                        hasTypeTree   = true,
                        fieldCount    = (uint)types.Count(),
                        pTypes_Unity5 = types.ToArray()
                    };


                    header.Write(writer.Position, writer);
                    writer.bigEndian = false;
                    typeTree.Write(writer.Position, writer, 0x11);
                    writer.Write((uint)0);
                    writer.Align();
                    //preload table and dependencies
                    writer.Write((uint)0);
                    writer.Write((uint)0);

                    //due to a write bug in at.net we have to pad to 0x1000
                    while (ms.Position < 0x1000)
                    {
                        writer.Write((byte)0);
                    }

                    return(ms.ToArray());
                }
        }
Exemplo n.º 3
0
        public static void CreateBlankAssets(MemoryStream ms, string engineVersion, uint formatVersion, uint typeTreeVersion, bool hasTypeTree = false)
        {
            AssetsFileWriter writer = new AssetsFileWriter(ms);

            AssetsFileHeader header = new AssetsFileHeader()
            {
                metadataSize    = 0,
                fileSize        = -1,
                format          = formatVersion,
                firstFileOffset = -1,
                endianness      = 0,
                unknown         = new byte[] { 0, 0, 0 }
            };

            TypeTree typeTree = new TypeTree()
            {
                unityVersion = engineVersion,
                version      = typeTreeVersion,
                hasTypeTree  = hasTypeTree,
                fieldCount   = 0,
                unity5Types  = new List <Type_0D>()
            };

            header.Write(writer);
            typeTree.Write(writer, formatVersion);

            writer.Write((uint)0); //AssetCount
            writer.Align();

            //preload table and dependencies
            writer.Write((uint)0);
            writer.Write((uint)0);

            //secondaryTypeCount
            if (header.format >= 0x14)
            {
                writer.Write(0);
            }

            uint metadataSize = (uint)(writer.Position - 0x13);

            if (header.format >= 0x16)
            {
                metadataSize -= 0x1c;
            }

            if (writer.Position < 0x1000)
            {
                while (writer.Position < 0x1000)
                {
                    writer.Write((byte)0x00);
                }
            }
            else
            {
                if (writer.Position % 16 == 0)
                {
                    writer.Position += 16;
                }
                else
                {
                    writer.Align16();
                }
            }

            long endPosition = writer.Position;

            header.fileSize        = endPosition;
            header.firstFileOffset = endPosition;
            header.metadataSize    = metadataSize;

            writer.Position = 0;
            header.Write(writer);

            writer.Position = endPosition;
        }