public static AssetTypeValueField GetMonoBaseField(AssetsManager am, AssetsFileInstance inst, AssetFileInfoEx info, string managedPath) { AssetsFile file = inst.file; AssetTypeTemplateField baseField = new AssetTypeTemplateField(); baseField.FromClassDatabase(am.classFile, AssetHelper.FindAssetClassByID(am.classFile, info.curFileType), 0); AssetTypeInstance mainAti = new AssetTypeInstance(baseField, file.reader, false, info.absoluteFilePos); if (file.typeTree.pTypes_Unity5[info.curFileTypeOrIndex].scriptIndex != 0xFFFF) { AssetTypeInstance scriptAti = am.GetExtAsset(inst, mainAti.GetBaseField().Get("m_Script")).instance; string scriptName = scriptAti.GetBaseField().Get("m_Name").GetValue().AsString(); string assemblyName = scriptAti.GetBaseField().Get("m_AssemblyName").GetValue().AsString(); string assemblyPath = Path.Combine(managedPath, assemblyName); if (File.Exists(assemblyPath)) { MonoClass mc = new MonoClass(); mc.Read(scriptName, assemblyPath, inst.file.header.format); AssetTypeTemplateField[] monoTemplateFields = mc.children; AssetTypeTemplateField[] templateField = baseField.children.Concat(monoTemplateFields).ToArray(); baseField.children = templateField; baseField.childrenCount = (uint)baseField.children.Length; mainAti = new AssetTypeInstance(baseField, file.reader, false, info.absoluteFilePos); } } return(mainAti.GetBaseField()); }
public AssetTypeInstance GetATI(AssetsFile file, AssetFileInfoEx info, bool fromTypeTree = false) { //do we still need pooling? //(it accumulates memory over time and we don't // really need to read the same ati twice) ushort scriptIndex = file.typeTree.pTypes_Unity5[info.curFileTypeOrIndex].scriptIndex; //unity is wack uint fixedId = info.curFileType; if (fixedId == 0xf1) //AudioMixerController { fixedId = 0xf0; //AudioMixer } else if (fixedId == 0xf3) //AudioMixerGroupController { fixedId = 0x111; //AudioMixerGroup } else if (fixedId == 0xf5) //AudioMixerSnapshotController { fixedId = 0x110; //AudioMixerSnapshot } AssetTypeTemplateField pBaseField = null; if (useTemplateFieldCache) { if (templateFieldCache.ContainsKey(fixedId)) { pBaseField = templateFieldCache[fixedId]; } else { pBaseField = new AssetTypeTemplateField(); if (fromTypeTree) { pBaseField.From0D(file.typeTree.pTypes_Unity5.First(t => (t.classId == fixedId || t.classId == info.curFileType) && t.scriptIndex == scriptIndex), 0); } else { pBaseField.FromClassDatabase(classFile, AssetHelper.FindAssetClassByID(classFile, fixedId), 0); } templateFieldCache[fixedId] = pBaseField; } } else { pBaseField = new AssetTypeTemplateField(); if (fromTypeTree) { pBaseField.From0D(file.typeTree.pTypes_Unity5.First(t => (t.classId == fixedId || t.classId == info.curFileType) && t.scriptIndex == scriptIndex), 0); } else { pBaseField.FromClassDatabase(classFile, AssetHelper.FindAssetClassByID(classFile, fixedId), 0); } } return(new AssetTypeInstance(pBaseField, file.reader, false, info.absoluteFilePos)); }
public AssetTypeTemplateField GetTemplateBaseField(AssetsFile file, AssetFileInfoEx info, bool forceFromCldb = false) { ushort scriptIndex = AssetHelper.GetScriptIndex(file, info); uint fixedId = AssetHelper.FixAudioID(info.curFileType); bool hasTypeTree = file.typeTree.hasTypeTree; AssetTypeTemplateField baseField; if (useTemplateFieldCache && templateFieldCache.ContainsKey(fixedId)) { baseField = templateFieldCache[fixedId]; } else { baseField = new AssetTypeTemplateField(); if (hasTypeTree && !forceFromCldb) { baseField.From0D(AssetHelper.FindTypeTreeTypeByID(file.typeTree, fixedId, scriptIndex), 0); } else { baseField.FromClassDatabase(classFile, AssetHelper.FindAssetClassByID(classFile, fixedId), 0); } if (useTemplateFieldCache) { templateFieldCache[fixedId] = baseField; } } return(baseField); }
public AssetTypeInstance GetATI(AssetsFile file, AssetFileInfoEx info, bool forceFromCldb = false) { ushort scriptIndex = file.typeTree.unity5Types[info.curFileTypeOrIndex].scriptIndex; //unity is wack uint fixedId = info.curFileType; if (fixedId == 0xf1) //AudioMixerController { fixedId = 0xf0; //AudioMixer } else if (fixedId == 0xf3) //AudioMixerGroupController { fixedId = 0x111; //AudioMixerGroup } else if (fixedId == 0xf5) //AudioMixerSnapshotController { fixedId = 0x110; //AudioMixerSnapshot } bool hasTypeTree = file.typeTree.hasTypeTree; AssetTypeTemplateField baseField = null; if (useTemplateFieldCache) { if (templateFieldCache.ContainsKey(fixedId)) { baseField = templateFieldCache[fixedId]; } else { baseField = new AssetTypeTemplateField(); if (hasTypeTree && !forceFromCldb) { baseField.From0D(file.typeTree.unity5Types.First(t => (t.classId == fixedId || t.classId == info.curFileType) && t.scriptIndex == scriptIndex), 0); } else { baseField.FromClassDatabase(classFile, AssetHelper.FindAssetClassByID(classFile, fixedId), 0); } templateFieldCache[fixedId] = baseField; } } else { baseField = new AssetTypeTemplateField(); if (hasTypeTree && !forceFromCldb) { baseField.From0D(file.typeTree.unity5Types.First(t => (t.classId == fixedId || t.classId == info.curFileType) && t.scriptIndex == scriptIndex), 0); } else { baseField.FromClassDatabase(classFile, AssetHelper.FindAssetClassByID(classFile, fixedId), 0); } } return(new AssetTypeInstance(baseField, file.reader, info.absoluteFilePos)); }
public static AssetTypeValueField GetMonoBaseField(AssetsManager am, AssetsFileInstance inst, AssetFileInfoEx info, string managedPath, bool cached = true) { AssetsFile file = inst.file; AssetTypeTemplateField baseField = new AssetTypeTemplateField(); baseField.FromClassDatabase(am.classFile, AssetHelper.FindAssetClassByID(am.classFile, info.curFileType), 0); AssetTypeInstance mainAti = new AssetTypeInstance(baseField, file.reader, info.absoluteFilePos); ushort scriptIndex = AssetHelper.GetScriptIndex(file, info); if (scriptIndex != 0xFFFF) { AssetTypeInstance scriptAti = am.GetExtAsset(inst, mainAti.GetBaseField().Get("m_Script")).instance; string scriptName = scriptAti.GetBaseField().Get("m_ClassName").GetValue().AsString(); string scriptNamespace = scriptAti.GetBaseField().Get("m_Namespace").GetValue().AsString(); string assemblyName = scriptAti.GetBaseField().Get("m_AssemblyName").GetValue().AsString(); string assemblyPath = Path.Combine(managedPath, assemblyName); if (scriptNamespace != string.Empty) { scriptName = scriptNamespace + "." + scriptName; } if (File.Exists(assemblyPath)) { AssemblyDefinition asmDef; if (cached) { if (!loadedAssemblies.ContainsKey(assemblyName)) { loadedAssemblies.Add(assemblyName, GetAssemblyWithDependencies(assemblyPath)); } asmDef = loadedAssemblies[assemblyName]; } else { asmDef = GetAssemblyWithDependencies(assemblyPath); } MonoDeserializer mc = new MonoDeserializer(); mc.Read(scriptName, asmDef, inst.file.header.format); List <AssetTypeTemplateField> monoTemplateFields = mc.children; AssetTypeTemplateField[] templateField = baseField.children.Concat(monoTemplateFields).ToArray(); baseField.children = templateField; baseField.childrenCount = baseField.children.Length; mainAti = new AssetTypeInstance(baseField, file.reader, info.absoluteFilePos); } } return(mainAti.GetBaseField()); }
public AssetTypeInstance GetATI(AssetsFile file, AssetFileInfoEx info, bool forceFromCldb = false) { ushort scriptIndex = AssetHelper.GetScriptIndex(file, info); uint fixedId = AssetHelper.FixAudioID(info.curFileType); bool hasTypeTree = file.typeTree.hasTypeTree; AssetTypeTemplateField baseField; if (useTemplateFieldCache && templateFieldCache.ContainsKey(fixedId)) { baseField = templateFieldCache[fixedId]; } else { baseField = new AssetTypeTemplateField(); if (hasTypeTree && !forceFromCldb) { if (file.header.format < 0x10) { if (scriptIndex == 0xFFFF) { baseField.From0D(AssetHelper.FindTypeTreeTypeByID(file.typeTree, fixedId), 0); } else { baseField.From0D(AssetHelper.FindTypeTreeTypeByScriptIndex(file.typeTree, scriptIndex), 0); } } else { baseField.From0D(AssetHelper.FindTypeTreeTypeByID(file.typeTree, fixedId), 0); } } else { baseField.FromClassDatabase(classFile, AssetHelper.FindAssetClassByID(classFile, fixedId), 0); } if (useTemplateFieldCache) { templateFieldCache[fixedId] = baseField; } } return(new AssetTypeInstance(baseField, file.reader, info.absoluteFilePos)); }
public AssetTypeInstance GetATI(AssetsFile file, AssetFileInfoEx info) { //do we still need pooling? //(it accumulates memory over time and we don't // really need to read the same ati twice) //unity is wack uint fixedId = info.curFileType; if (fixedId == 0xf1) //AudioMixerController { fixedId = 0xf0; //AudioMixer } else if (fixedId == 0xf3) //AudioMixerGroupController { fixedId = 0x111; //AudioMixerGroup } else if (fixedId == 0xf5) //AudioMixerSnapshotController { fixedId = 0x110; //AudioMixerSnapshot } AssetTypeTemplateField pBaseField = null; if (useTemplateFieldCache) { if (templateFieldCache.ContainsKey(fixedId)) { pBaseField = templateFieldCache[fixedId]; } else { pBaseField = new AssetTypeTemplateField(); pBaseField.FromClassDatabase(classFile, AssetHelper.FindAssetClassByID(classFile, fixedId), 0); templateFieldCache[fixedId] = pBaseField; } } else { pBaseField = new AssetTypeTemplateField(); pBaseField.FromClassDatabase(classFile, AssetHelper.FindAssetClassByID(classFile, fixedId), 0); } return(new AssetTypeInstance(pBaseField, file.reader, false, info.absoluteFilePos)); }
public static Type_0D Cldb2TypeTree(ClassDatabaseFile classes, int id) { ClassDatabaseType type = AssetHelper.FindAssetClassByID(classes, (uint)id); return(Cldb2TypeTree(classes, type)); }