Esempio n. 1
0
        private void SetSerialized(AssetTypeTemplateField field, TypeDefinition type)
        {
            List <AssetTypeTemplateField> types = new List <AssetTypeTemplateField>();

            RecursiveTypeLoad(type, types);
            field.childrenCount = types.Count;
            field.children      = types.ToArray();
        }
        private AssetTypeTemplateField[] VECf()
        {
            AssetTypeTemplateField x = CreateTemplateField("x", "float", EnumValueTypes.ValueType_Float);
            AssetTypeTemplateField y = CreateTemplateField("y", "float", EnumValueTypes.ValueType_Float);
            AssetTypeTemplateField z = CreateTemplateField("z", "float", EnumValueTypes.ValueType_Float);

            return(new AssetTypeTemplateField[] { x, y, z });
        }
 private void SetSerialized(AssetTypeTemplateField field, TypeDefinition type)
 {
     AssetTypeTemplateField[] types = new AssetTypeTemplateField[] { };
     types = RecursiveTypeLoad(assembly.MainModule, type, types);
     //AssetTypeTemplateField[] types = ReadTypes(type);
     field.childrenCount = (uint)types.Length;
     field.children      = types;
 }
Esempio n. 4
0
        private void RecurseTextDump(AssetTypeValueField field, int depth)
        {
            AssetTypeTemplateField template = field.GetTemplateField();
            string align     = template.align ? "1" : "0";
            string typeName  = template.type;
            string fieldName = template.name;
            bool   isArray   = template.isArray;

            //string's field isn't aligned but its array is
            if (template.valueType == EnumValueTypes.String)
            {
                align = "1";
            }

            if (isArray)
            {
                AssetTypeTemplateField sizeTemplate = template.children[0];
                string sizeAlign     = sizeTemplate.align ? "1" : "0";
                string sizeTypeName  = sizeTemplate.type;
                string sizeFieldName = sizeTemplate.name;
                int    size          = field.GetValue().AsArray().size;
                sw.WriteLine($"{new string(' ', depth)}{align} {typeName} {fieldName} ({size} items)");
                sw.WriteLine($"{new string(' ', depth+1)}{sizeAlign} {sizeTypeName} {sizeFieldName} = {size}");
                for (int i = 0; i < field.childrenCount; i++)
                {
                    sw.WriteLine($"{new string(' ', depth+1)}[{i}]");
                    RecurseTextDump(field.children[i], depth + 2);
                }
            }
            else
            {
                string value = "";
                if (field.GetValue() != null)
                {
                    EnumValueTypes evt = field.GetValue().GetValueType();
                    if (evt == EnumValueTypes.String)
                    {
                        //only replace \ with \\ but not " with \" lol
                        //you just have to find the last "
                        string fixedStr = field.GetValue().AsString()
                                          .Replace("\\", "\\\\")
                                          .Replace("\r", "\\r")
                                          .Replace("\n", "\\n");
                        value = $" = \"{fixedStr}\"";
                    }
                    else if (1 <= (int)evt && (int)evt <= 12)
                    {
                        value = $" = {field.GetValue().AsString()}";
                    }
                }
                sw.WriteLine($"{new string(' ', depth)}{align} {typeName} {fieldName}{value}");

                for (int i = 0; i < field.childrenCount; i++)
                {
                    RecurseTextDump(field.children[i], depth + 1);
                }
            }
        }
Esempio n. 5
0
        private AssetTypeTemplateField[] RectOffset()
        {
            AssetTypeTemplateField m_Left   = CreateTemplateField("m_Left", "int", EnumValueTypes.Int32);
            AssetTypeTemplateField m_Right  = CreateTemplateField("m_Right", "int", EnumValueTypes.Int32);
            AssetTypeTemplateField m_Top    = CreateTemplateField("m_Top", "int", EnumValueTypes.Int32);
            AssetTypeTemplateField m_Bottom = CreateTemplateField("m_Bottom", "int", EnumValueTypes.Int32);

            return(new AssetTypeTemplateField[] { m_Left, m_Right, m_Top, m_Bottom });
        }
Esempio n. 6
0
        private void SetBitField(AssetTypeTemplateField field)
        {
            field.childrenCount = 1;
            AssetTypeTemplateField m_Bits = CreateTemplateField("m_Bits", "unsigned int", EnumValueTypes.UInt32);

            field.children = new AssetTypeTemplateField[] {
                m_Bits
            };
        }
Esempio n. 7
0
        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));
        }
Esempio n. 8
0
        private void SetGradientRGBAb(AssetTypeTemplateField field)
        {
            field.childrenCount = 1;
            AssetTypeTemplateField rgba = CreateTemplateField("rgba", "unsigned int", EnumValueTypes.UInt32);

            field.children = new AssetTypeTemplateField[] {
                rgba
            };
        }
Esempio n. 9
0
        private AssetTypeTemplateField[] RGBAf()
        {
            AssetTypeTemplateField r = CreateTemplateField("r", "float", EnumValueTypes.Float);
            AssetTypeTemplateField g = CreateTemplateField("g", "float", EnumValueTypes.Float);
            AssetTypeTemplateField b = CreateTemplateField("b", "float", EnumValueTypes.Float);
            AssetTypeTemplateField a = CreateTemplateField("a", "float", EnumValueTypes.Float);

            return(new AssetTypeTemplateField[] { r, g, b, a });
        }
Esempio n. 10
0
        private void SetAABB(AssetTypeTemplateField field)
        {
            field.childrenCount = 2;
            AssetTypeTemplateField m_Center = CreateTemplateField("m_Center", "Vector3f", EnumValueTypes.None, 3, Vec3f());
            AssetTypeTemplateField m_Extent = CreateTemplateField("m_Extent", "Vector3f", EnumValueTypes.None, 3, Vec3f());

            field.children = new AssetTypeTemplateField[] {
                m_Center, m_Extent
            };
        }
Esempio n. 11
0
 static AssetTypeValueField StringField(string str, AssetTypeTemplateField template)
 {
     return(new AssetTypeValueField()
     {
         children = null,
         childrenCount = 0,
         templateField = template,
         value = new AssetTypeValue(EnumValueTypes.ValueType_String, str)
     });
 }
Esempio n. 12
0
        private void SetVec2Int(AssetTypeTemplateField field)
        {
            field.childrenCount = 2;
            AssetTypeTemplateField m_X = CreateTemplateField("m_X", "int", EnumValueTypes.Int32);
            AssetTypeTemplateField m_Y = CreateTemplateField("m_Y", "int", EnumValueTypes.Int32);

            field.children = new AssetTypeTemplateField[] {
                m_X, m_Y
            };
        }
Esempio n. 13
0
        private AssetTypeTemplateField[] String()
        {
            AssetTypeTemplateField size  = CreateTemplateField("size", "int", EnumValueTypes.Int32);
            AssetTypeTemplateField data  = CreateTemplateField("char", "data", EnumValueTypes.UInt8);
            AssetTypeTemplateField Array = CreateTemplateField("Array", "Array", EnumValueTypes.Array, true, true, 2, new AssetTypeTemplateField[] {
                size, data
            });

            return(new AssetTypeTemplateField[] { Array });
        }
Esempio n. 14
0
        public static AssetTypeValueField DefaultValueFieldFromArrayTemplate(AssetTypeTemplateField arrayField)
        {
            if (!arrayField.isArray)
            {
                return(null);
            }

            AssetTypeTemplateField templateField = arrayField.children[1];

            return(DefaultValueFieldFromTemplate(templateField));
        }
Esempio n. 15
0
        private void SetRectf(AssetTypeTemplateField field)
        {
            field.childrenCount = 4;
            AssetTypeTemplateField x      = CreateTemplateField("x", "float", EnumValueTypes.Float);
            AssetTypeTemplateField y      = CreateTemplateField("y", "float", EnumValueTypes.Float);
            AssetTypeTemplateField width  = CreateTemplateField("width", "float", EnumValueTypes.Float);
            AssetTypeTemplateField height = CreateTemplateField("height", "float", EnumValueTypes.Float);

            field.children = new AssetTypeTemplateField[] {
                x, y, width, height
            };
        }
Esempio n. 16
0
        public static AssetTypeValue DefaultValueFromTemplate(AssetTypeTemplateField templateField)
        {
            object obj;

            switch (templateField.valueType)
            {
            case EnumValueTypes.Int8:
                obj = (sbyte)0; break;

            case EnumValueTypes.UInt8:
                obj = (byte)0; break;

            case EnumValueTypes.Bool:
                obj = false; break;

            case EnumValueTypes.Int16:
                obj = (short)0; break;

            case EnumValueTypes.UInt16:
                obj = (ushort)0; break;

            case EnumValueTypes.Int32:
                obj = 0; break;

            case EnumValueTypes.UInt32:
                obj = 0u; break;

            case EnumValueTypes.Int64:
                obj = 0L; break;

            case EnumValueTypes.UInt64:
                obj = 0uL; break;

            case EnumValueTypes.Float:
                obj = 0f; break;

            case EnumValueTypes.Double:
                obj = 0d; break;

            case EnumValueTypes.String:
                obj = string.Empty; break;

            case EnumValueTypes.Array:
                obj = new AssetTypeArray(); break;

            case EnumValueTypes.ByteArray:
                obj = new AssetTypeByteArray(); break;

            default:
                obj = null; break;
            }
            return(new AssetTypeValue(templateField.valueType, obj));
        }
Esempio n. 17
0
        public AssetTypeValueField GetMonoBaseFieldCached(AssetsFileInstance inst, AssetFileInfoEx info, string managedPath)
        {
            AssetsFile file        = inst.file;
            ushort     scriptIndex = AssetHelper.GetScriptIndex(file, info);

            if (scriptIndex == 0xFFFF)
            {
                return(null);
            }

            string scriptName;

            if (!inst.monoIdToName.ContainsKey(scriptIndex))
            {
                AssetTypeInstance scriptAti = GetExtAsset(inst, GetTypeInstance(inst.file, info).GetBaseField().Get("m_Script")).instance;

                //couldn't find asset
                if (scriptAti == null)
                {
                    return(null);
                }

                scriptName = scriptAti.GetBaseField().Get("m_Name").GetValue().AsString();
                string scriptNamespace = scriptAti.GetBaseField().Get("m_Namespace").GetValue().AsString();
                string assemblyName    = scriptAti.GetBaseField().Get("m_AssemblyName").GetValue().AsString();

                if (scriptNamespace == string.Empty)
                {
                    scriptNamespace = "-";
                }

                scriptName = $"{assemblyName}.{scriptNamespace}.{scriptName}";
                inst.monoIdToName[scriptIndex] = scriptName;
            }
            else
            {
                scriptName = inst.monoIdToName[scriptIndex];
            }

            if (monoTemplateFieldCache.ContainsKey(scriptName))
            {
                AssetTypeTemplateField baseTemplateField = monoTemplateFieldCache[scriptName];
                AssetTypeInstance      baseAti           = new AssetTypeInstance(baseTemplateField, file.reader, info.absoluteFilePos);
                return(baseAti.GetBaseField());
            }
            else
            {
                AssetTypeValueField baseValueField = MonoDeserializer.GetMonoBaseField(this, inst, info, managedPath);
                monoTemplateFieldCache[scriptName] = baseValueField.templateField;
                return(baseValueField);
            }
        }
Esempio n. 18
0
 public AssetTypeInstance(AssetTypeTemplateField[] baseFields, AssetsFileReader reader, long filePos)
 {
     reader.bigEndian    = false;
     reader.Position     = filePos;
     this.baseFieldCount = baseFields.Length;
     this.baseFields     = new AssetTypeValueField[baseFieldCount];
     for (int i = 0; i < baseFieldCount; i++)
     {
         AssetTypeTemplateField templateBaseField = baseFields[i];
         AssetTypeValueField    atvf = templateBaseField.MakeValue(reader);
         this.baseFields[i] = atvf;
     }
 }
Esempio n. 19
0
        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());
        }
Esempio n. 20
0
        public AssetTypeValueField GetMonoBaseField(AssetContainer cont, string managedPath)
        {
            var file     = cont.FileInstance.file;
            var item     = cont.Item;
            var baseTemp = new AssetTypeTemplateField();

            baseTemp.FromClassDatabase(Am.classFile, AssetHelper.FindAssetClassByID(Am.classFile, item.TypeID), 0);
            var mainAti     = new AssetTypeInstance(baseTemp, cont.FileReader, item.Position);
            var scriptIndex = item.MonoID;

            if (scriptIndex != 0xFFFF)
            {
                var monoScriptCont = GetAssetContainer(mainAti.GetBaseField().Get("m_Script"));
                if (monoScriptCont == null)
                {
                    return(null);
                }

                var scriptBaseField = monoScriptCont.TypeInstance.GetBaseField();
                var scriptName      = scriptBaseField.Get("m_Name").GetValue().AsString();
                var scriptNamespace = scriptBaseField.Get("m_Namespace").GetValue().AsString();
                var assemblyName    = scriptBaseField.Get("m_AssemblyName").GetValue().AsString();
                var assemblyPath    = Path.Combine(managedPath, assemblyName);

                if (scriptNamespace != string.Empty)
                {
                    scriptName = scriptNamespace + "." + scriptName;
                }

                if (File.Exists(assemblyPath))
                {
                    if (!LoadedAssemblies.ContainsKey(assemblyName))
                    {
                        LoadedAssemblies.Add(assemblyName, MonoDeserializer.GetAssemblyWithDependencies(assemblyPath));
                    }
                    var asmDef = LoadedAssemblies[assemblyName];

                    var mc = new MonoDeserializer();
                    mc.Read(scriptName, asmDef, file.header.format);
                    var monoTemplateFields = mc.children;

                    var templateField = baseTemp.children.Concat(monoTemplateFields).ToArray();
                    baseTemp.children      = templateField;
                    baseTemp.childrenCount = baseTemp.children.Length;

                    mainAti = new AssetTypeInstance(baseTemp, cont.FileReader, item.Position);
                }
            }
            return(mainAti.GetBaseField());
        }
Esempio n. 21
0
        public static AssetTypeInstance GetByteArrayTexture(AssetWorkspace workspace, AssetContainer tex)
        {
            AssetTypeTemplateField textureTemp = workspace.GetTemplateField(tex.FileInstance.file, tex.ClassId, tex.MonoId);
            AssetTypeTemplateField image_data  = textureTemp.children.FirstOrDefault(f => f.name == "image data");

            if (image_data == null)
            {
                return(null);
            }
            image_data.valueType = EnumValueTypes.ByteArray;
            AssetTypeInstance textureTypeInstance = new AssetTypeInstance(new[] { textureTemp }, tex.FileReader, tex.FilePosition);

            return(textureTypeInstance);
        }
Esempio n. 22
0
 public AssetTypeInstance(uint baseFieldCount, AssetTypeTemplateField[] ppBaseFields, AssetsFileReader reader, bool bigEndian, ulong filePos = 0)
 {
     this.baseFieldCount = baseFieldCount;
     reader.bigEndian = false;
     reader.BaseStream.Position = (long)filePos;
     baseFields = new AssetTypeValueField[this.baseFieldCount];
     for (int i = 0; i < baseFieldCount; i++)
     {
         AssetTypeTemplateField templateBaseField = ppBaseFields[i];
         AssetTypeValueField atvf;
         templateBaseField.MakeValue(reader, reader.Position, out atvf, reader.bigEndian);
         baseFields[i] = atvf;
     }
 }
Esempio n. 23
0
        private void SetSpecialUnity(AssetTypeTemplateField field, TypeDefWithSelfRef type)
        {
            switch (type.typeDef.Name)
            {
            case "Gradient":
                SetGradient(field);
                break;

            case "AnimationCurve":
                SetAnimationCurve(field);
                break;

            case "LayerMask":
                SetBitField(field);
                break;

            case "Bounds":
                SetAABB(field);
                break;

            case "Rect":
                SetRectf(field);
                break;

            case "Color32":
                SetGradientRGBAb(field);
                break;

            case "GUIStyle":
                SetGUIStyle(field);
                break;

            case "BoundsInt":
                SetAABBInt(field);
                break;

            case "Vector2Int":
                SetVec2Int(field);
                break;

            case "Vector3Int":
                SetVec3Int(field);
                break;

            default:
                SetSerialized(field, type);
                break;
            }
        }
Esempio n. 24
0
        private AssetTypeTemplateField CreateTemplateField(string name, string type, EnumValueTypes valueType, bool isArray, bool align, int childrenCount, AssetTypeTemplateField[] children)
        {
            AssetTypeTemplateField field = new AssetTypeTemplateField();

            field.name          = name;
            field.type          = type;
            field.valueType     = valueType;
            field.isArray       = isArray;
            field.align         = align;
            field.hasValue      = valueType != EnumValueTypes.None;
            field.childrenCount = childrenCount;
            field.children      = children;

            return(field);
        }
Esempio n. 25
0
        public AssetTypeTemplateField CreateTemplateField(string name, string type, EnumValueTypes valueType, bool isArray, bool align, uint childrenCount, AssetTypeTemplateField[] children)
        {
            AssetTypeTemplateField field = new AssetTypeTemplateField();

            field.name          = name;
            field.type          = type;
            field.valueType     = valueType;
            field.isArray       = isArray;
            field.align         = align;
            field.hasValue      = (valueType == EnumValueTypes.ValueType_None) ? false : true;
            field.childrenCount = childrenCount;
            field.children      = children;

            return(field);
        }
Esempio n. 26
0
        private void GameObjectViewer_Load(object sender, EventArgs e)
        {
            //mono won't be able to do this so ignore it
            if (Type.GetType("Mono.Runtime") == null)
            {
                PInvoke.SetWindowTheme(goTree.Handle, "explorer", null);
            }
            valueGrid.PropertySort = PropertySort.Categorized;

            ClassDatabaseFile      classFile    = helper.classFile;
            AssetFileInfoEx        info         = inst.table.GetAssetInfo(selectedId);
            AssetTypeTemplateField typeTemplate = helper.GetTemplateBaseField(inst.file, info);
            string typeName = typeTemplate.type;

            if (typeName == "GameObject")
            {
                selectedGameObjectId = selectedId;
                AssetExternal firstExt = helper.GetExtAsset(inst, 0, selectedId);
                AssetExternal rootExt  = GetRootGameObject(firstExt);
                PopulateHierarchyTree(null, rootExt);
            }
            else
            {
                bool hasGameObjectField = typeTemplate.children.Any(f => f.name == "m_GameObject");
                if (hasGameObjectField)
                {
                    AssetTypeValueField firstBaseField = helper.GetTypeInstance(inst.file, info).GetBaseField();
                    AssetExternal       firstExt       = helper.GetExtAsset(inst, firstBaseField.Get("m_GameObject"));
                    if (firstExt.info != null)
                    {
                        selectedGameObjectId = firstExt.info.index;
                        AssetExternal rootExt = GetRootGameObject(firstExt);
                        PopulateHierarchyTree(null, rootExt);
                    }
                    else
                    {
                        TreeNode node = goTree.Nodes.Add($"[{typeName} (parentless)]");
                        node.Tag = helper.GetExtAsset(inst, 0, info.index);
                    }
                }
                else
                {
                    TreeNode node = goTree.Nodes.Add($"[{typeName}]");
                    node.Tag = helper.GetExtAsset(inst, 0, info.index);
                }
            }
            GetSelectedNodeData();
        }
Esempio n. 27
0
        public static AssetTypeValueField GetMonoBaseFieldCached(this AssetsManager am, AssetsFileInstance inst, AssetFileInfoEx info, string managedPath, List <string> fileNames, Dictionary <AssetID, long> aidToPid)
        {
            AssetsFile file        = inst.file;
            ushort     scriptIndex = file.typeTree.unity5Types[info.curFileTypeOrIndex].scriptIndex;

            if (scriptIndex != 0xFFFF && inst.templateFieldCache.ContainsKey(scriptIndex))
            {
                AssetTypeTemplateField baseTemplateField = inst.templateFieldCache[scriptIndex];
                AssetTypeInstance      baseAti           = new AssetTypeInstance(baseTemplateField, file.reader, info.absoluteFilePos);
                return(baseAti.GetBaseField());
            }
            else
            {
                AssetTypeTemplateField baseField = new AssetTypeTemplateField();
                baseField.FromClassDatabase(am.classFile, AssetHelper.FindAssetClassByID(am.classFile, info.curFileType), 0);
                AssetTypeInstance mainAti = new AssetTypeInstance(baseField, file.reader, info.absoluteFilePos);
                if (file.typeTree.unity5Types[info.curFileTypeOrIndex].scriptIndex != 0xFFFF)
                {
                    AssetTypeValueField m_Script         = mainAti.GetBaseField().Get("m_Script");
                    int               m_ScriptFileId     = m_Script.Get("m_FileID").GetValue().AsInt();
                    long              m_ScriptPathId     = m_Script.Get("m_PathID").GetValue().AsInt64();
                    AssetID           id                 = new AssetID(fileNames[-m_ScriptFileId], m_ScriptPathId);
                    long              m_ScriptRealPathId = aidToPid[id];
                    AssetTypeInstance scriptAti          = am.GetExtAsset(inst, 0, m_ScriptRealPathId).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);
                    Console.WriteLine("checking " + scriptName + " in " + assemblyName + " from id " + info.index);
                    if (File.Exists(assemblyPath))
                    {
                        MonoDeserializer mc = new MonoDeserializer();
                        mc.Read(scriptName, assemblyPath, 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);
                    }
                }

                AssetTypeValueField baseValueField = mainAti.GetBaseField();
                inst.templateFieldCache[scriptIndex] = baseValueField.templateField;
                return(baseValueField);
            }
        }
        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));
        }
Esempio n. 29
0
        public AssetTypeValueField GetConcatMonoBaseField(AssetContainer cont, string managedPath)
        {
            AssetsFile file = cont.FileInstance.file;
            AssetTypeTemplateField baseTemp = new AssetTypeTemplateField();
            baseTemp.FromClassDatabase(am.classFile, AssetHelper.FindAssetClassByID(am.classFile, cont.ClassId), 0);
            AssetTypeInstance mainAti = new AssetTypeInstance(baseTemp, cont.FileReader, cont.FilePosition);
            ushort scriptIndex = cont.MonoId;
            if (scriptIndex != 0xFFFF)
            {
                AssetContainer monoScriptCont = GetAssetContainer(cont.FileInstance, mainAti.GetBaseField().Get("m_Script"), false);
                if (monoScriptCont == null)
                    return null;

                AssetTypeValueField scriptBaseField = monoScriptCont.TypeInstance.GetBaseField();
                string scriptName = scriptBaseField.Get("m_Name").GetValue().AsString();
                string scriptNamespace = scriptBaseField.Get("m_Namespace").GetValue().AsString();
                string assemblyName = scriptBaseField.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 (!LoadedAssemblies.ContainsKey(assemblyName))
                    {
                        LoadedAssemblies.Add(assemblyName, MonoDeserializer.GetAssemblyWithDependencies(assemblyPath));
                    }
                    asmDef = LoadedAssemblies[assemblyName];

                    MonoDeserializer mc = new MonoDeserializer();
                    mc.Read(scriptName, asmDef, file.header.format);
                    List<AssetTypeTemplateField> monoTemplateFields = mc.children;

                    AssetTypeTemplateField[] templateField = baseTemp.children.Concat(monoTemplateFields).ToArray();
                    baseTemp.children = templateField;
                    baseTemp.childrenCount = baseTemp.children.Length;

                    mainAti = new AssetTypeInstance(baseTemp, cont.FileReader, cont.FilePosition);
                }
            }
            return mainAti.GetBaseField();
        }
Esempio n. 30
0
        private void SetPPtr(AssetTypeTemplateField field, bool dollar)
        {
            if (dollar)
            {
                field.type = $"PPtr<${field.type}>";
            }
            else
            {
                field.type = $"PPtr<{field.type}>";
            }
            field.childrenCount = 2;

            AssetTypeTemplateField fileID = new AssetTypeTemplateField();

            fileID.name          = "m_FileID";
            fileID.type          = "int";
            fileID.valueType     = EnumValueTypes.Int32;
            fileID.isArray       = false;
            fileID.align         = false;
            fileID.hasValue      = true;
            fileID.childrenCount = 0;
            fileID.children      = new AssetTypeTemplateField[] { };

            AssetTypeTemplateField pathID = new AssetTypeTemplateField();

            pathID.name = "m_PathID";
            if (format < 0x0E)
            {
                pathID.type      = "int";
                pathID.valueType = EnumValueTypes.Int32;
            }
            else
            {
                pathID.type      = "SInt64";
                pathID.valueType = EnumValueTypes.Int64;
            }
            pathID.isArray       = false;
            pathID.align         = false;
            pathID.hasValue      = true;
            pathID.childrenCount = 0;
            pathID.children      = new AssetTypeTemplateField[] { };
            field.children       = new AssetTypeTemplateField[] {
                fileID, pathID
            };
        }