private static byte[] FixTexture2DFast(AssetsFileInstance inst, AssetFileInfoEx inf) { AssetsFileReader r = inst.file.reader; r.Position = inf.absoluteFilePos; r.Position += (ulong)r.ReadInt32() + 4; r.Align(); r.Position += 0x48; r.Position += (ulong)r.ReadInt32() + 4; r.Align(); r.Position += 0x8; ulong filePathPos = r.Position; int assetLengthMinusFP = (int)(filePathPos - inf.absoluteFilePos); string filePath = r.ReadCountStringInt32(); string directory = Path.GetDirectoryName(inst.path); string fixedPath = Path.Combine(directory, filePath); byte[] newData = new byte[assetLengthMinusFP + 4 + fixedPath.Length]; r.Position = inf.absoluteFilePos; //imo easier to write it with binary writer than manually copy the bytes using (MemoryStream ms = new MemoryStream()) using (AssetsFileWriter w = new AssetsFileWriter(ms)) { w.bigEndian = false; w.Write(r.ReadBytes(assetLengthMinusFP)); w.WriteCountStringInt32(fixedPath); var ret = ms.ToArray(); if (ret == null) { return(null); } return(ret); } }
public override void Parse(AssetIdentifier identifier, AssetsFileReader reader, ResourceAssets resourceAssets, Dictionary <int, string> relativeFileIdToPath) { string assetName = reader.ReadCountStringInt32(); if (assetName == "RandomStart") { reader.Position += 9; int width = reader.ReadInt32(); int height = reader.ReadInt32(); int imageSize = reader.ReadInt32(); reader.Position += 52; byte[] data = reader.ReadBytes(imageSize); byte[] decodedData = AssetsTools.NET.Extra.DXTDecoders.ReadDXT1(data, width, height); using (MemoryStream stream = new MemoryStream(decodedData)) { Bitmap bmp = new Bitmap(width, height, PixelFormat.Format32bppArgb); Rectangle dimension = new Rectangle(0, 0, bmp.Width, bmp.Height); BitmapData picData = bmp.LockBits(dimension, ImageLockMode.ReadWrite, bmp.PixelFormat); picData.Stride = width * 4; IntPtr pixelStartAddress = picData.Scan0; Marshal.Copy(decodedData, 0, pixelStartAddress, decodedData.Length); bmp.UnlockBits(picData); resourceAssets.NitroxRandom = new RandomStartGenerator(bmp); } } }
public override void Parse(AssetIdentifier identifier, AssetsFileReader reader, ResourceAssets resourceAssets) { MonobehaviourAsset monobehaviour = new MonobehaviourAsset(); monobehaviour.GameObjectIdentifier = new AssetIdentifier((uint)reader.ReadInt32(), (ulong)reader.ReadInt64()); monobehaviour.Enabled = reader.ReadInt32(); // unknown but assume this is what it is monobehaviour.MonoscriptIdentifier = new AssetIdentifier((uint)reader.ReadInt32(), (ulong)reader.ReadInt64()); monobehaviour.Name = reader.ReadCountStringInt32(); // Hack - If we have not yet loaded monoscripts then we are currently processing unit monobehaviours // that we do not care about. Monoscripts should be fully loaded before we actually parse anything // we do care about in resource.assets. If this becomes a problem later, we can do two passes and // load monobeahviours in the second pass. if (!MonoscriptAssetParser.MonoscriptsByAssetId.ContainsKey(monobehaviour.MonoscriptIdentifier)) { return; } MonoscriptAsset monoscript = MonoscriptAssetParser.MonoscriptsByAssetId[monobehaviour.MonoscriptIdentifier]; monobehaviour.MonoscriptName = monoscript.Name; MonobehaviourParser monoResourceParser; if (monobehaviourParsersByMonoscriptName.TryGetValue(monoscript.Name, out monoResourceParser)) { monoResourceParser.Parse(identifier, monobehaviour.GameObjectIdentifier, reader, resourceAssets); } MonobehavioursByAssetId.Add(identifier, monobehaviour); }
///void Free(); public void Read(long filePos, AssetsFileReader reader) { reader.Position = filePos; checksumLow = reader.ReadUInt64(); checksumHigh = reader.ReadUInt64(); blockCount = reader.ReadInt32(); blockInf = new AssetBundleBlockInfo06[blockCount]; for (int i = 0; i < blockCount; i++) { blockInf[i] = new AssetBundleBlockInfo06(); blockInf[i].decompressedSize = reader.ReadUInt32(); blockInf[i].compressedSize = reader.ReadUInt32(); blockInf[i].flags = reader.ReadUInt16(); } directoryCount = reader.ReadInt32(); dirInf = new AssetBundleDirectoryInfo06[directoryCount]; for (int i = 0; i < directoryCount; i++) { dirInf[i] = new AssetBundleDirectoryInfo06(); dirInf[i].offset = reader.ReadInt64(); dirInf[i].decompressedSize = reader.ReadInt64(); dirInf[i].flags = reader.ReadUInt32(); dirInf[i].name = reader.ReadNullTerminated(); } }
public bool Read(AssetsFileReader reader, bool prefReplacersInMemory = false) { reader.bigEndian = false; magic = reader.ReadStringLength(4); if (magic != "EMIP") { return(false); } includesCldb = reader.ReadByte() != 0; modName = reader.ReadCountStringInt16(); modCreators = reader.ReadCountStringInt16(); modDescription = reader.ReadCountStringInt16(); if (includesCldb) { addedTypes = new ClassDatabaseFile(); addedTypes.Read(reader); //get past the string table since the reader goes back to the beginning reader.Position = addedTypes.header.stringTablePos + addedTypes.header.stringTableLen; } else { addedTypes = null; } int affectedFilesCount = reader.ReadInt32(); affectedFiles = new List <InstallerPackageAssetsDesc>(); for (int i = 0; i < affectedFilesCount; i++) { List <object> replacers = new List <object>(); InstallerPackageAssetsDesc desc = new InstallerPackageAssetsDesc() { isBundle = reader.ReadByte() != 0, path = reader.ReadCountStringInt16() }; int replacerCount = reader.ReadInt32(); for (int j = 0; j < replacerCount; j++) { object repObj = ParseReplacer(reader, prefReplacersInMemory); if (repObj is AssetsReplacer repAsset) { replacers.Add(repAsset); } else if (repObj is BundleReplacer repBundle) { replacers.Add(repBundle); } } desc.replacers = replacers; affectedFiles.Add(desc); } return(true); }
public override void Parse(AssetIdentifier identifier, AssetIdentifier gameObjectIdentifier, AssetsFileReader reader, ResourceAssets resourceAssets) { List <AssetIdentifier> prefabPlaceholderIds = new List <AssetIdentifier>(); int placeholders = reader.ReadInt32(); for (int i = 0; i < placeholders; i++) { AssetIdentifier prefabPlaceholderId = new AssetIdentifier(reader.ReadInt32(), reader.ReadInt64()); prefabPlaceholderIds.Add(prefabPlaceholderId); } PrefabPlaceholderIdsByGameObjectId.Add(gameObjectIdentifier, prefabPlaceholderIds); }
public override void Parse(AssetIdentifier identifier, AssetIdentifier gameObjectIdentifier, AssetsFileReader reader, ResourceAssets resourceAssets) { int count = reader.ReadInt32(); // Array Count string[] allowedTypes = new string[count]; for (int i = 0; i < count; i++) { allowedTypes[i] = ((EntitySlot.Type)reader.ReadInt32()).ToString(); } string biomeType = ((BiomeType)reader.ReadInt32()).AsString(); // Yes EntitySlotsByIdentifier.Add(gameObjectIdentifier, new NitroxEntitySlot(biomeType, allowedTypes)); }
public static string GetAssetNameFast(AssetsFile file, ClassDatabaseFile cldb, AssetFileInfoEx info) { ClassDatabaseType type = FindAssetClassByID(cldb, info.curFileType); AssetsFileReader reader = file.reader; if (type.fields.Count == 0) { return(type.name.GetString(cldb)); } if (type.fields[1].fieldName.GetString(cldb) == "m_Name") { reader.Position = info.absoluteFilePos; return(reader.ReadCountStringInt32()); } else if (type.name.GetString(cldb) == "GameObject") { reader.Position = info.absoluteFilePos; int size = reader.ReadInt32(); reader.Position += size * 12; reader.Position += 4; return(reader.ReadCountStringInt32()); } else if (type.name.GetString(cldb) == "MonoBehaviour") { reader.Position = info.absoluteFilePos; reader.Position += 28; string name = reader.ReadCountStringInt32(); if (name != "") { return(name); } } return(type.name.GetString(cldb)); }
//no classdatabase but may not work public static string GetAssetNameFastNaive(AssetsFile file, AssetFileInfoEx info) { AssetsFileReader reader = file.reader; if (AssetsFileExtra.HasName(info.curFileType)) { reader.Position = info.absoluteFilePos; return(reader.ReadCountStringInt32()); } else if (info.curFileType == 0x01) { reader.Position = info.absoluteFilePos; int size = reader.ReadInt32(); int componentSize = file.header.format > 0x10 ? 0xC : 0x10; reader.Position += size * componentSize; reader.Position += 4; return(reader.ReadCountStringInt32()); } else if (info.curFileType == 0x72) { reader.Position = info.absoluteFilePos; reader.Position += 28; string name = reader.ReadCountStringInt32(); if (name != "") { return(name); } } return(string.Empty); }
private string GetAssetNameFast(AssetFileInfoEx afi, ClassDatabaseFile cldb, ClassDatabaseType type, AssetsFileReader reader) { if (type.fields.Count <= 1) { return(type.name.GetString(cldb)); } if (type.fields[1].fieldName.GetString(cldb) == "m_Name") { reader.Position = afi.absoluteFilePos; return(reader.ReadCountStringInt32()); } else if (type.name.GetString(cldb) == "GameObject") { reader.Position = afi.absoluteFilePos; int size = reader.ReadInt32(); reader.Position += (ulong)(size * 12); reader.Position += 4; return(reader.ReadCountStringInt32()); } else if (type.name.GetString(cldb) == "MonoBehaviour") { reader.Position = afi.absoluteFilePos; reader.Position += 28; string name = reader.ReadCountStringInt32(); if (name != "") { return(name); } } return(type.name.GetString(cldb)); }
public override void Parse(AssetIdentifier identifier, AssetsFileReader reader, ResourceAssets resourceAssets, Dictionary <int, string> relativeFileIdToPath) { MonobehaviourAsset monobehaviour = new MonobehaviourAsset(); int fileId = reader.ReadInt32(); monobehaviour.GameObjectIdentifier = new AssetIdentifier(relativeFileIdToPath[fileId], reader.ReadInt64()); monobehaviour.Enabled = reader.ReadBoolean(); reader.Align(); monobehaviour.MonoscriptIdentifier = new AssetIdentifier(relativeFileIdToPath[reader.ReadInt32()], reader.ReadInt64()); monobehaviour.Name = reader.ReadCountStringInt32(); // Hack - If we have not yet loaded monoscripts then we are currently processing unit monobehaviours // that we do not care about. Monoscripts should be fully loaded before we actually parse anything // we do care about in resource.assets. If this becomes a problem later, we can do two passes and // load monobeahviours in the second pass. if (!MonoscriptAssetParser.MonoscriptsByAssetId.ContainsKey(monobehaviour.MonoscriptIdentifier)) { return; } MonoscriptAsset monoscript = MonoscriptAssetParser.MonoscriptsByAssetId[monobehaviour.MonoscriptIdentifier]; monobehaviour.MonoscriptName = monoscript.Name; if (monobehaviourParsersByMonoscriptName.TryGetValue(monoscript.Name, out MonobehaviourParser monoResourceParser)) { monoResourceParser.Parse(identifier, monobehaviour.GameObjectIdentifier, reader, resourceAssets, relativeFileIdToPath); } MonobehavioursByAssetId.Add(identifier, monobehaviour); }
public static string GetAssetNameFast(AssetFileInfoEx afi, ClassDatabaseFile cldb, ClassDatabaseType type, AssetsFileInstance inst) { AssetsFileReader reader = inst.file.reader; if (type.fields.Count < 2) { return(type.name.GetString(cldb)); } else if (type.fields[1].fieldName.GetString(cldb) == "m_Name") { reader.Position = afi.absoluteFilePos; return(reader.ReadCountStringInt32()); } else if (type.name.GetString(cldb) == "GameObject") { reader.Position = afi.absoluteFilePos; int size = reader.ReadInt32(); reader.Position += size * 12; reader.Position += 4; return(reader.ReadCountStringInt32()); } else if (type.name.GetString(cldb) == "MonoBehaviour") { reader.Position = afi.absoluteFilePos; reader.Position += 28; string name = reader.ReadCountStringInt32(); if (name != "") { return(name); } } return(type.name.GetString(cldb)); }
private static byte[] AddMetadataMonobehaviour(byte[] data, long behaviourId) { //it seems unity is so broken that after something other than //gameobjects are added to the asset list, you can't add any //monobehaviour components to gameobjects after it or it crashes //anyway, since I'm stuck on this one and I can't really push //to the beginning of the list, I'll just put the info onto //the first gameobject in the scene using (MemoryStream fms = new MemoryStream(data)) using (AssetsFileReader fr = new AssetsFileReader(fms)) { fr.bigEndian = false; int componentSize = fr.ReadInt32(); List <AssetPPtr> pptrs = new List <AssetPPtr>(); for (int i = 0; i < componentSize; i++) { int fileId = fr.ReadInt32(); long pathId = fr.ReadInt64(); //this gets rid of assets that have no reference if (!(fileId == 0 && pathId == 0)) { pptrs.Add(new AssetPPtr((uint)fileId, (ulong)pathId)); } } //add reference to Metadata mb pptrs.Add(new AssetPPtr(0, (ulong)behaviourId)); int assetLengthMinusCP = (int)(data.Length - 4 - (componentSize * 12)); using (MemoryStream ms = new MemoryStream()) using (AssetsFileWriter w = new AssetsFileWriter(ms)) { w.bigEndian = false; w.Write(pptrs.Count); foreach (AssetPPtr pptr in pptrs) { w.Write(pptr.fileID); w.Write(pptr.pathID); } w.Write(fr.ReadBytes(assetLengthMinusCP)); return(ms.ToArray()); } } }
public ulong Read(AssetsFileReader reader, ulong filePos, int version) { classId = reader.ReadInt32(); baseClass = reader.ReadInt32(); name = new ClassDatabaseFileString(); name.Read(reader, reader.Position); uint fieldCount = reader.ReadUInt32(); fields = new List <ClassDatabaseTypeField>(); for (int j = 0; j < fieldCount; j++) { ClassDatabaseTypeField cdtf = new ClassDatabaseTypeField(); cdtf.Read(reader, filePos, version); fields.Add(cdtf); } return(reader.Position); }
//this one has to work differently since we already modified the value field //so we save it to a stream and read from it manually so it works faster //note it may be better to loop through all objects but this would be slower //in the future, all components should be added so we won't need this private static byte[] FixGameObjectFast(AssetsFileInstance inst, AssetFileInfoEx inf, AssetTypeValueField field, ulong editDifferPid) { //dump current data to ms using (MemoryStream fms = new MemoryStream()) using (AssetsFileWriter fw = new AssetsFileWriter(fms)) { fw.bigEndian = false; field.Write(fw); fms.Position = 0; AssetsFileReader r = new AssetsFileReader(fms); r.bigEndian = false; int componentSize = r.ReadInt32(); List <AssetPPtr> pptrs = new List <AssetPPtr>(); for (int i = 0; i < componentSize; i++) { int fileId = r.ReadInt32(); long pathId = r.ReadInt64(); //this gets rid of assets that have no reference if (!(fileId == 0 && pathId == 0)) { pptrs.Add(new AssetPPtr((uint)fileId, (ulong)pathId)); } } //add reference to EditDiffer mb pptrs.Add(new AssetPPtr(0, editDifferPid)); int assetLengthMinusCP = (int)(inf.curFileSize - 4 - (componentSize * 12)); using (MemoryStream ms = new MemoryStream()) using (AssetsFileWriter w = new AssetsFileWriter(ms)) { w.bigEndian = false; w.Write(pptrs.Count); foreach (AssetPPtr pptr in pptrs) { w.Write(pptr.fileID); w.Write(pptr.pathID); } w.Write(r.ReadBytes(assetLengthMinusCP)); return(ms.ToArray()); } } }
public override void Parse(AssetIdentifier identifier, AssetsFileReader reader, ResourceAssets resourceAssets, Dictionary <int, string> relativeFileIdToPath) { TransformAsset transformAsset = new TransformAsset(); transformAsset.Identifier = identifier; transformAsset.GameObjectIdentifier = new AssetIdentifier(relativeFileIdToPath[reader.ReadInt32()], reader.ReadInt64()); transformAsset.LocalRotation = new NitroxQuaternion( reader.ReadSingle(), // Quaternion X reader.ReadSingle(), // Quaternion Y reader.ReadSingle(), // Quaternion Z reader.ReadSingle()); // Quaternion W transformAsset.LocalPosition = new NitroxVector3( reader.ReadSingle(), // Position X reader.ReadSingle(), // Position Y reader.ReadSingle()); // Position Z transformAsset.LocalScale = new NitroxVector3( reader.ReadSingle(), // Scale X reader.ReadSingle(), // Scale Y reader.ReadSingle()); // Scale Z // Children may be parsed out of order so we don't directly assign them to TransformAsset // instead, we rely on a call back to index ChildrenIdsByPatentId (same access pattern as // the other data structures throughout this process). List <AssetIdentifier> children = new List <AssetIdentifier>(); ChildrenIdsByParentId.Add(identifier, children); int childrenCount = reader.ReadInt32(); for (int i = 0; i < childrenCount; i++) { AssetIdentifier child = new AssetIdentifier(relativeFileIdToPath[reader.ReadInt32()], reader.ReadInt64()); ChildrenIdToParentId.Add(child, identifier); children.Add(child); } transformAsset.ParentIdentifier = new AssetIdentifier(relativeFileIdToPath[reader.ReadInt32()], reader.ReadInt64()); TransformsByAssetId.Add(identifier, transformAsset); }
private void BackgroundWork(object sender, DoWorkEventArgs e) { List <AssetID> assetIds = new List <AssetID>(); foreach (string fileName in fileNames) { AssetsFileInstance inst = am.LoadAssetsFile(fileName, true); inst.table.GenerateQuickLookupTree(); am.LoadClassDatabaseFromPackage(inst.file.typeTree.unityVersion); foreach (AssetFileInfoEx inf in inst.table.GetAssetsOfType(0x73)) { AssetsFileReader fr = new AssetsFileReader(inst.file.readerPar); fr.bigEndian = false; fr.Position = inf.absoluteFilePos; fr.ReadCountStringInt32(); fr.Align(); fr.Position += 20; string m_ClassName = fr.ReadCountStringInt32(); fr.Align(); string m_Namespace = fr.ReadCountStringInt32(); fr.Align(); string m_AssemblyName = fr.ReadCountStringInt32(); fr.Align(); AssetID assetId = new AssetID(Path.GetFileName(fileName), inf.index); ScriptInfo scriptInfo = new ScriptInfo(m_AssemblyName, m_Namespace, m_ClassName); assetIds.Add(assetId); monoScriptToInfo.Add(assetId, scriptInfo); monoScriptRefs.Add(assetId, new List <AssetID>()); bw.ReportProgress(0, assetId); } } foreach (string fileName in fileNames) { //don't worry, this doesn't load them twice AssetsFileInstance inst = am.LoadAssetsFile(fileName, true); foreach (AssetFileInfoEx inf in inst.table.GetAssetsOfType(0x72)) { AssetsFileReader fr = new AssetsFileReader(inst.file.readerPar); fr.bigEndian = false; fr.Position = inf.absoluteFilePos; fr.Position += 16; int m_FileID = fr.ReadInt32(); long m_PathID = fr.ReadInt64(); string refFileName = fileName; if (m_FileID != 0) { refFileName = inst.file.dependencies.dependencies[m_FileID - 1].assetPath; } AssetID scriptId = new AssetID(Path.GetFileName(refFileName), m_PathID); AssetID selfId = new AssetID(Path.GetFileName(fileName), inf.index); if (monoScriptRefs.ContainsKey(scriptId)) { monoScriptRefs[scriptId].Add(selfId); } } } bw.ReportProgress(0); }
public override void Parse(AssetIdentifier identifier, AssetIdentifier gameObjectIdentifier, AssetsFileReader reader, ResourceAssets resourceAssets, Dictionary <int, string> relativeFileIdToPath) { reader.Align(); uint size = reader.ReadUInt32(); WorldEntityInfo wei; for (int i = 0; i < size; i++) { wei = new WorldEntityInfo(); wei.classId = reader.ReadCountStringInt32(); wei.techType = (TechType)reader.ReadInt32(); wei.slotType = (EntitySlot.Type)reader.ReadInt32(); wei.prefabZUp = reader.ReadBoolean(); reader.Align(); wei.cellLevel = (LargeWorldEntity.CellLevel)reader.ReadInt32(); wei.localScale = new UnityEngine.Vector3(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()); resourceAssets.WorldEntitiesByClassId.Add(wei.classId, wei); } }
public ulong Read(ulong absFilePos, AssetsFileReader reader, bool bigEndian) { guid = new GUID128(); guid.Read(reader.Position, reader); bufferedPath = new byte[] { reader.ReadByte() }; //todo: why type = reader.ReadInt32(); assetPath = reader.ReadNullTerminated(); if (assetPath.StartsWith("library/")) { assetPath = "Resources\\" + assetPath.Substring(8); } return(reader.Position); }
public override void Parse(AssetIdentifier identifier, AssetsFileReader reader, ResourceAssets resourceAssets, Dictionary <int, string> relativeFileIdToPath) { GameObjectAsset gameObjectAsset = new GameObjectAsset(); gameObjectAsset.Identifier = identifier; uint componentCount = reader.ReadUInt32(); for (int i = 0; i < componentCount; i++) { AssetIdentifier component = new AssetIdentifier(relativeFileIdToPath[reader.ReadInt32()], reader.ReadInt64()); gameObjectAsset.Components.Add(component); } reader.ReadUInt32(); // Layer (not used) int length = reader.ReadInt32(); gameObjectAsset.Name = reader.ReadStringLength(length); GameObjectsByAssetId.Add(identifier, gameObjectAsset); }
private void addFileToolStripMenuItem_Click(object sender, EventArgs e) { OpenFileDialog ofd = new OpenFileDialog(); ofd.DefaultExt = ""; if (ofd.ShowDialog() == DialogResult.OK) { string possibleBundleHeader; int possibleFormat; string emptyVersion; using (FileStream fs = File.OpenRead(ofd.FileName)) using (AssetsFileReader reader = new AssetsFileReader(fs)) { if (fs.Length < 0x20) { MessageBox.Show("File too small. Are you sure this is a unity file?", "Assets View"); return; } possibleBundleHeader = reader.ReadStringLength(7); reader.Position = 0x08; possibleFormat = reader.ReadInt32(); reader.Position = 0x14; string possibleVersion = ""; char curChar; while (reader.Position < reader.BaseStream.Length && (curChar = (char)reader.ReadByte()) != 0x00) { possibleVersion += curChar; if (possibleVersion.Length < 0xFF) { break; } } emptyVersion = Regex.Replace(possibleVersion, "[a-zA-Z0-9\\.]", ""); } if (possibleBundleHeader == "UnityFS") { LoadBundleFile(ofd.FileName); IEManager.Init(helper, currentFile, ofd.FileName, true); } else if (possibleFormat < 0xFF && emptyVersion == "") { LoadAssetsFile(ofd.FileName); IEManager.Init(helper, currentFile, ofd.FileName, false); } else { MessageBox.Show("Couldn't detect file type. Are you sure this is a unity file?", "Assets View"); } } }
public override void Parse(AssetIdentifier identifier, AssetIdentifier gameObjectIdentifier, AssetsFileReader reader, ResourceAssets resourceAssets, Dictionary <int, string> relativeFileIdToPath) { List <AssetIdentifier> prefabPlaceholderIds = new List <AssetIdentifier>(); int placeholders = reader.ReadInt32(); for (int i = 0; i < placeholders; i++) { AssetIdentifier prefabPlaceholderId = new AssetIdentifier(relativeFileIdToPath[reader.ReadInt32()], reader.ReadInt64()); prefabPlaceholderIds.Add(prefabPlaceholderId); } PrefabPlaceholderIdsByGameObjectId.Add(gameObjectIdentifier, prefabPlaceholderIds); }
private static string GetAssetNameFast(int fileId, long pathId, AssetsFileInstance inst) { if (pathId == 0) { return(""); } AssetsFile file = null; AssetsFileTable table = null; if (fileId == 0) { file = inst.file; table = inst.table; } else { AssetsFileInstance dep = inst.dependencies[fileId - 1]; file = dep.file; table = dep.table; } AssetFileInfoEx inf = table.getAssetInfo((ulong)pathId); AssetsFileReader reader = file.reader; if (allowed.Contains(inf.curFileType)) { reader.Position = inf.absoluteFilePos; return(reader.ReadCountStringInt32()); } if (inf.curFileType == 0x1) { reader.Position = inf.absoluteFilePos; int size = reader.ReadInt32(); reader.Position += (ulong)(size * 12); reader.Position += 4; return(reader.ReadCountStringInt32()); } else if (inf.curFileType == 0x72) { reader.Position = inf.absoluteFilePos; reader.Position += 28; string name = reader.ReadCountStringInt32(); if (name != "") { return(name); } } return(""); }
public override void Parse(AssetIdentifier identifier, AssetsFileReader reader, ResourceAssets resourceAssets) { TransformAsset transformAsset = new TransformAsset(); transformAsset.Identifier = identifier; reader.Position += 12; transformAsset.LocalRotation = new NitroxQuaternion( reader.ReadSingle(), // Quaternion X reader.ReadSingle(), // Quaternion Y reader.ReadSingle(), // Quaternion Z reader.ReadSingle()); // Quaternion W transformAsset.LocalPosition = new NitroxVector3( reader.ReadSingle(), // Position X reader.ReadSingle(), // Position Y reader.ReadSingle()); // Position Z transformAsset.LocalScale = new NitroxVector3( reader.ReadSingle(), // Scale X reader.ReadSingle(), // Scale Y reader.ReadSingle()); // Scale Z int childrenCount = reader.ReadInt32(); for (int i = 0; i < childrenCount; i++) { AssetIdentifier child = new AssetIdentifier(reader.ReadInt32(), reader.ReadInt64()); ChildrenIdToParentId.Add(child, identifier); } transformAsset.ParentIdentifier = new AssetIdentifier(reader.ReadInt32(), reader.ReadInt64()); TransformsByAssetId.Add(identifier, transformAsset); }
public override void Parse(AssetIdentifier identifier, AssetsFileReader reader, ResourceAssets resourceAssets) { GameObjectAsset gameObjectAsset = new GameObjectAsset(); gameObjectAsset.Identifier = identifier; uint componentCount = reader.ReadUInt32(); for (int i = 0; i < componentCount; i++) { AssetIdentifier component = new AssetIdentifier(reader.ReadInt32(), reader.ReadInt64()); gameObjectAsset.Components.Add(component); } GameObjectsByAssetId.Add(identifier, gameObjectAsset); }
public static DetectedFileType DetectFileType(string filePath) { string possibleBundleHeader; int possibleFormat; string emptyVersion; using (var fs = File.OpenRead(filePath)) using (var reader = new AssetsFileReader(fs)) { if (fs.Length < 0x20) { return(DetectedFileType.Unknown); } possibleBundleHeader = reader.ReadStringLength(7); reader.Position = 0x08; possibleFormat = reader.ReadInt32(); reader.Position = 0x14; if (possibleFormat >= 0x16) { reader.Position += 0x1c; } var possibleVersion = ""; char curChar; while (reader.Position < reader.BaseStream.Length && (curChar = (char)reader.ReadByte()) != 0x00) { possibleVersion += curChar; if (possibleVersion.Length > 0xFF) { break; } } emptyVersion = Regex.Replace(possibleVersion, "[a-zA-Z0-9\\.]", ""); } if (possibleBundleHeader == "UnityFS") { return(DetectedFileType.BundleFile); } if (possibleFormat < 0xFF && emptyVersion == "") { return(DetectedFileType.AssetsFile); } return(DetectedFileType.Unknown); }
public void Read(AssetsFileReader reader, int version) { typeName = new ClassDatabaseFileString(); typeName.Read(reader); fieldName = new ClassDatabaseFileString(); fieldName.Read(reader); depth = reader.ReadByte(); isArray = reader.ReadByte(); size = reader.ReadInt32(); switch (version) { case 1: flags2 = reader.ReadUInt32(); break; case 3: case 4: this.version = reader.ReadUInt16(); flags2 = reader.ReadUInt32(); break; } }
public ulong Read(bool hasTypeTree, ulong absFilePos, AssetsFileReader reader, uint version, uint typeVersion, bool bigEndian) { classId = reader.ReadInt32(); if (version >= 0x10) { unknown16_1 = reader.ReadByte(); } if (version >= 0x11) { scriptIndex = reader.ReadUInt16(); } if ((version < 0x11 && classId < 0) || (version >= 0x11 && scriptIndex != 0xFFFF)) { unknown1 = reader.ReadUInt32(); unknown2 = reader.ReadUInt32(); unknown3 = reader.ReadUInt32(); unknown4 = reader.ReadUInt32(); } unknown5 = reader.ReadUInt32(); unknown6 = reader.ReadUInt32(); unknown7 = reader.ReadUInt32(); unknown8 = reader.ReadUInt32(); if (hasTypeTree) { typeFieldsExCount = reader.ReadUInt32(); stringTableLen = reader.ReadUInt32(); pTypeFieldsEx = new TypeField_0D[typeFieldsExCount]; for (int i = 0; i < typeFieldsExCount; i++) { TypeField_0D typefield0d = new TypeField_0D(); typefield0d.Read(reader.Position, reader, bigEndian); pTypeFieldsEx[i] = typefield0d; } string rawStringTable = Encoding.UTF8.GetString(reader.ReadBytes((int)stringTableLen)); pStringTable = rawStringTable.Split('\0'); Array.Resize(ref pStringTable, pStringTable.Length - 1); } return(reader.Position); }
public static string GetAssetNameFast(AssetFileInfoEx afi, ClassDatabaseFile cldb, ClassDatabaseType type, AssetsFileInstance inst) { AssetsFileReader reader = inst.file.reader; if (type.fields.Count == 0) { return(type.name.GetString(cldb)); } else if (type.fields.Count == 1) { // the dreamers lay sleeping to protect the vessel return(type.name.GetString(cldb)); } else if (type.fields[1].fieldName.GetString(cldb) == "m_Name") { reader.Position = afi.absoluteFilePos; return(reader.ReadCountStringInt32()); } else if (type.name.GetString(cldb) == "GameObject") { reader.Position = afi.absoluteFilePos; int size = reader.ReadInt32(); reader.Position += (ulong)size * 12; reader.Position += 4UL; return(reader.ReadCountStringInt32()); } else if (type.name.GetString(cldb) == "MonoBehaviour") { reader.Position = afi.absoluteFilePos; reader.Position += 28UL; string name = reader.ReadCountStringInt32(); if (name != "") { return(name); } } return(type.name.GetString(cldb)); }
private string GetAssetNameFastModded(AssetsFile file, ClassDatabaseFile cldb, AssetFileInfoEx info) { ClassDatabaseType type = AssetHelper.FindAssetClassByID(cldb, info.curFileType); AssetsFileReader reader = file.reader; if (type.fields.Count == 0) { return(type.name.GetString(cldb)); } if (type.fields.Count > 1 && type.fields[1].fieldName.GetString(cldb) == "m_Name") { reader.Position = info.absoluteFilePos; return(reader.ReadCountStringInt32()); } else if (type.name.GetString(cldb) == "GameObject") { reader.Position = info.absoluteFilePos; int size = reader.ReadInt32(); int componentSize = file.header.format > 0x10 ? 0xC : 0x10; reader.Position += size * componentSize; reader.Position += 4; return(reader.ReadCountStringInt32()); } else if (type.name.GetString(cldb) == "MonoBehaviour") { reader.Position = info.absoluteFilePos; reader.Position += 28; string name = reader.ReadCountStringInt32(); if (name != "") { return(name); } } return($"pathId_{info.index}"); }