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); }
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()); } }
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; }