Beispiel #1
0
 public void Read(AssetsFileReader reader)
 {
     len   = reader.ReadInt32();
     items = new List <AssetPPtr>();
     for (int i = 0; i < len; i++)
     {
         items.Add(new AssetPPtr(reader.ReadInt32(), reader.ReadInt64()));
     }
 }
Beispiel #2
0
 public void Read(AssetsFileReader reader)
 {
     len   = reader.ReadInt32();
     items = new List <AssetPPtr>();
     for (int i = 0; i < len; i++)
     {
         int fileId = reader.ReadInt32();
         reader.Align();
         long pathId = reader.ReadInt64();
         reader.Align();
         items.Add(new AssetPPtr(fileId, pathId));
     }
 }
Beispiel #3
0
 public void Read(bool hasTypeTree, AssetsFileReader reader, uint version)
 {
     classId = reader.ReadInt32();
     if (version >= 0x10)
     {
         unknown16_1 = reader.ReadByte();
     }
     if (version >= 0x11)
     {
         scriptIndex = reader.ReadUInt16();
     }
     else
     {
         scriptIndex = 0xffff;
     }
     if ((version < 0x11 && classId < 0) || (version >= 0x11 && classId == 0x72))
     {
         scriptHash1 = reader.ReadUInt32();
         scriptHash2 = reader.ReadUInt32();
         scriptHash3 = reader.ReadUInt32();
         scriptHash4 = reader.ReadUInt32();
     }
     typeHash1 = reader.ReadUInt32();
     typeHash2 = reader.ReadUInt32();
     typeHash3 = reader.ReadUInt32();
     typeHash4 = reader.ReadUInt32();
     if (hasTypeTree)
     {
         typeFieldsExCount = reader.ReadUInt32();
         stringTableLen    = reader.ReadUInt32();
         typeFieldsEx      = new TypeField_0D[typeFieldsExCount];
         for (int i = 0; i < typeFieldsExCount; i++)
         {
             TypeField_0D typefield0d = new TypeField_0D();
             typefield0d.Read(reader, version);
             typeFieldsEx[i] = typefield0d;
         }
         stringTable = Encoding.UTF8.GetString(reader.ReadBytes((int)stringTableLen));
         if (version >= 0x15)
         {
             dependenciesCount = reader.ReadInt32();
             dependencies      = new int[dependenciesCount];
             for (int i = 0; i < dependenciesCount; i++)
             {
                 dependencies[i] = reader.ReadInt32();
             }
         }
     }
 }
        ///public bool Pack(AssetsFileReader reader, LPARAM lPar, AssetsFileWriter writer, LPARAM writerPar);
        public bool IsAssetsFile(AssetsFileReader reader, AssetBundleDirectoryInfo06 entry)
        {
            //todo - not fully implemented
            long offset = bundleHeader6.GetFileDataOffset() + entry.offset;

            if (entry.decompressedSize < 0x20)
            {
                return(false);
            }

            reader.Position = offset;
            string possibleBundleHeader = reader.ReadStringLength(7);

            if (possibleBundleHeader == "UnityFS")
            {
                return(false);
            }

            reader.Position = offset + 0x08;
            int possibleFormat = reader.ReadInt32();

            if (possibleFormat > 99)
            {
                return(false);
            }

            reader.Position = offset + 0x14;
            string possibleVersion = reader.ReadNullTerminated();
            string emptyVersion    = Regex.Replace(possibleVersion, "[a-zA-Z0-9\\.]", "");
            string fullVersion     = Regex.Replace(possibleVersion, "[^a-zA-Z0-9\\.]", "");

            return(emptyVersion == "" && fullVersion.Length > 0);
        }
 public void Read(uint version, AssetsFileReader reader)
 {
     if (version >= 0x0E)
     {
         index = reader.ReadInt64();
     }
     else
     {
         index = reader.ReadUInt32();
     }
     curFileOffset      = reader.ReadUInt32();
     curFileSize        = reader.ReadUInt32();
     curFileTypeOrIndex = reader.ReadInt32();
     if (version < 0x10)
     {
         inheritedUnityClass = reader.ReadUInt16();
     }
     if (version <= 0x10)
     {
         scriptIndex = reader.ReadUInt16();
     }
     if (0x0F <= version && version <= 0x10)
     {
         unknown1 = reader.ReadByte();
         reader.ReadBytes(3);
     }
 }
        public void Read(AssetsFileReader reader)
        {
            bufferedPath = reader.ReadNullTerminated();
            guid         = new GUID128();
            guid.Read(reader);
            type              = reader.ReadInt32();
            assetPath         = reader.ReadNullTerminated();
            originalAssetPath = assetPath;

            //because lowercase "resources" is read by unity fine on linux, it either uses
            //hardcoded replaces like below or it has case insensitive pathing somehow
            //this isn't consistent with the original assetstools but it only supported
            //windows anyway, so this will only create issues if more than these three
            //pop up in the future. also, the reason I don't just replace all "library"
            //with "Resources" is so that when saving, I can change it back to the original
            //(like how unity_builtin_extra goes back to "resources", not "library")
            if (assetPath == "resources/unity_builtin_extra")
            {
                assetPath = "Resources/unity_builtin_extra";
            }
            else if (assetPath == "library/unity default resources" || assetPath == "Library/unity default resources")
            {
                assetPath = "Resources/unity default resources";
            }
            else if (assetPath == "library/unity editor resources" || assetPath == "Library/unity editor resources")
            {
                assetPath = "Resources/unity editor resources";
            }
        }
Beispiel #7
0
        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 i = 0; i < fieldCount; i++)
            {
                ClassDatabaseTypeField cdtf = new ClassDatabaseTypeField();
                cdtf.Read(reader, filePos, version);
                fields.Add(cdtf);
            }
            return(reader.Position);
        }
Beispiel #8
0
 public void Read(AssetsFileReader reader)
 {
     dependencyCount = reader.ReadInt32();
     dependencies    = new List <AssetsFileDependency>();
     for (int i = 0; i < dependencyCount; i++)
     {
         AssetsFileDependency dependency = new AssetsFileDependency();
         dependency.Read(reader);
         dependencies.Add(dependency);
     }
 }
        public void Read(AssetsFileReader reader, int version, byte flags)
        {
            classId   = reader.ReadInt32();
            baseClass = reader.ReadInt32();
            name      = new ClassDatabaseFileString();
            name.Read(reader);
            if ((flags & 1) != 0)
            {
                assemblyFileName = new ClassDatabaseFileString();
                assemblyFileName.Read(reader);
            }
            uint fieldCount = reader.ReadUInt32();

            fields = new List <ClassDatabaseTypeField>();
            for (int i = 0; i < fieldCount; i++)
            {
                ClassDatabaseTypeField cdtf = new ClassDatabaseTypeField();
                cdtf.Read(reader, version);
                fields.Add(cdtf);
            }
        }
Beispiel #10
0
 public string  assetPath; //path to the .assets file
 public void Read(AssetsFileReader reader)
 {
     bufferedPath = reader.ReadNullTerminated();
     guid         = new GUID128();
     guid.Read(reader);
     type      = reader.ReadInt32();
     assetPath = reader.ReadNullTerminated();
     //todo: the switchero was here for testing purposes, should be handled by application for full control
     if (assetPath.StartsWith("library/"))
     {
         assetPath = "Resources/" + assetPath.Substring(8);
     }
 }
 public byte[]  bufferedPath; //for buffered (type=1)
 public ulong Read(ulong absFilePos, AssetsFileReader reader, bool bigEndian)
 {
     bufferedPath = new byte[] { reader.ReadByte() }; //-Dunno why it's here but it is
     guid         = new GUID128();
     guid.Read(reader.Position, reader);
     type      = reader.ReadInt32();
     assetPath = reader.ReadNullTerminated();
     //todo: the switchero was here for testing purposes, should be handled by application for full control
     if (assetPath.StartsWith("library/"))
     {
         assetPath = "Resources\\" + assetPath.Substring(8);
     }
     return(reader.Position);
 }
        public bool IsAssetsFile(AssetsFileReader reader, AssetBundleDirectoryInfo06 entry)
        {
            //todo - not fully implemented
            long offset = bundleHeader6.GetFileDataOffset() + entry.offset;

            if (entry.decompressedSize < 0x30)
            {
                return(false);
            }

            reader.Position = offset;
            string possibleBundleHeader = reader.ReadStringLength(7);

            if (possibleBundleHeader == "UnityFS")
            {
                return(false);
            }

            reader.Position = offset + 0x08;
            int possibleFormat = reader.ReadInt32();

            if (possibleFormat > 99)
            {
                return(false);
            }

            reader.Position = offset + 0x14;

            if (possibleFormat >= 0x16)
            {
                reader.Position += 0x1c;
            }

            string possibleVersion = "";
            char   curChar;

            while (reader.Position < reader.BaseStream.Length && (curChar = (char)reader.ReadByte()) != 0x00)
            {
                possibleVersion += curChar;
                if (possibleVersion.Length > 0xFF)
                {
                    return(false);
                }
            }

            string emptyVersion = Regex.Replace(possibleVersion, "[a-zA-Z0-9\\.]", "");
            string fullVersion  = Regex.Replace(possibleVersion, "[^a-zA-Z0-9\\.]", "");

            return(emptyVersion == "" && fullVersion.Length > 0);
        }
Beispiel #13
0
        //recommend GetAssetNameFast if at possible
        public bool ReadName(AssetsFile file, out string str)
        {
            str = string.Empty;
            AssetsFileReader reader = file.reader;

            if (AssetsFileExtra.HasName(curFileType))
            {
                reader.Position = absoluteFilePos;
                int length = Math.Min(reader.ReadInt32(), 99);
                str = reader.ReadStringLength(length);
                return(true);
            }
            return(false);
        }
Beispiel #14
0
        public static bool IsAssetsFile(AssetsFileReader reader, long offset, long length)
        {
            //todo - not fully implemented
            if (length < 0x30)
            {
                return(false);
            }

            reader.Position = offset;
            string possibleBundleHeader = reader.ReadStringLength(5);

            if (possibleBundleHeader == "Unity")
            {
                return(false);
            }

            reader.Position = offset + 0x08;
            int possibleFormat = reader.ReadInt32();

            if (possibleFormat > 99)
            {
                return(false);
            }

            reader.Position = offset + 0x14;

            if (possibleFormat >= 0x16)
            {
                reader.Position += 0x1c;
            }

            string possibleVersion = "";
            char   curChar;

            while (reader.Position < reader.BaseStream.Length && (curChar = (char)reader.ReadByte()) != 0x00)
            {
                possibleVersion += curChar;
                if (possibleVersion.Length > 0xFF)
                {
                    return(false);
                }
            }

            string emptyVersion = Regex.Replace(possibleVersion, "[a-zA-Z0-9\\.\\n]", "");
            string fullVersion  = Regex.Replace(possibleVersion, "[^a-zA-Z0-9\\.\\n]", "");

            return(emptyVersion == "" && fullVersion.Length > 0);
        }
Beispiel #15
0
        public uint           dwUnknown;   //actually belongs to the asset list; stored for .assets format < 14

        public void Read(AssetsFileReader reader, uint version)
        {
            unityVersion = reader.ReadNullTerminated();
            this.version = reader.ReadUInt32();
            hasTypeTree  = reader.ReadBoolean();
            fieldCount   = reader.ReadInt32();
            unity5Types  = new List <Type_0D>();
            for (int i = 0; i < fieldCount; i++)
            {
                Type_0D type0d = new Type_0D();
                type0d.Read(hasTypeTree, reader, version);
                unity5Types.Add(type0d);
            }
            if (version < 0x0E)
            {
                dwUnknown = reader.ReadUInt24();
            }
        }//Minimum AssetsFile format : 6
Beispiel #16
0
 public void Read(AssetsFileReader reader, uint format)
 {
     version          = reader.ReadUInt16();
     depth            = reader.ReadByte();
     isArray          = reader.ReadByte();
     typeStringOffset = reader.ReadUInt32();
     nameStringOffset = reader.ReadUInt32();
     size             = reader.ReadInt32();
     index            = reader.ReadUInt32();
     flags            = reader.ReadUInt32();
     if (format >= 0x12)
     {
         unknown = reader.ReadBytes(8);
     }
     else
     {
         unknown = new byte[0];
     }
 }
Beispiel #17
0
 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)) //original is if (classId == 114)
     //if ((version < 0x11 && classId < 0) || (version >= 0x11 && scriptIndex != 0xFFFF))
     if ((version < 0x11 && classId < 0) || (version >= 0x11 && classId == 114))
     {
         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, version, bigEndian);
             pTypeFieldsEx[i] = typefield0d;
         }
         pStringTable = Encoding.UTF8.GetString(reader.ReadBytes((int)stringTableLen));
     }
     return(reader.Position);
 }
        public AssetTypeValueField ReadType(AssetsFileReader reader, ulong filePos, AssetTypeValueField valueField, bool bigEndian)
        {
            if (valueField.templateField.isArray)
            {
                if (valueField.templateField.childrenCount == 2)
                {
                    EnumValueTypes sizeType = valueField.templateField.children[0].valueType;
                    if (sizeType == EnumValueTypes.ValueType_Int32 ||
                        sizeType == EnumValueTypes.ValueType_UInt32)
                    {
                        valueField.childrenCount = reader.ReadUInt32();
                        valueField.pChildren     = new AssetTypeValueField[valueField.childrenCount];
                        for (int i = 0; i < valueField.childrenCount; i++)
                        {
                            valueField.pChildren[i] = new AssetTypeValueField();
                            valueField.pChildren[i].templateField = valueField.templateField.children[1];
                            valueField.pChildren[i] = ReadType(reader, reader.Position, valueField.pChildren[i], bigEndian);
                        }
                        if (valueField.templateField.align)
                        {
                            reader.Align();
                        }
                        AssetTypeArray ata = new AssetTypeArray();
                        ata.size         = valueField.childrenCount;
                        valueField.value = new AssetTypeValue(EnumValueTypes.ValueType_Array, 0);
                        valueField.value.Set(ata);
                    }
                    else
                    {
                        Debug.WriteLine("Invalid array value type! Found an unexpected " + sizeType.ToString() + " type instead!");
                    }
                }
                else
                {
                    Debug.WriteLine("Invalid array!");
                }
            }
            else
            {
                EnumValueTypes type = valueField.templateField.valueType;
                if (type != 0)
                {
                    valueField.value = new AssetTypeValue(type, 0);
                }
                if (type == EnumValueTypes.ValueType_String)
                {
                    valueField.value.Set(reader.ReadCountStringInt32());
                    reader.Align();
                }
                else
                {
                    valueField.childrenCount = valueField.templateField.childrenCount;
                    if (valueField.childrenCount == 0)
                    {
                        valueField.pChildren = new AssetTypeValueField[0];
                        switch (valueField.templateField.valueType)
                        {
                        case EnumValueTypes.ValueType_Int8:
                            valueField.value.Set(reader.ReadSByte());
                            if (valueField.templateField.align)
                            {
                                reader.Align();
                            }
                            break;

                        case EnumValueTypes.ValueType_UInt8:
                        case EnumValueTypes.ValueType_Bool:
                            valueField.value.Set(reader.ReadByte());
                            if (valueField.templateField.align)
                            {
                                reader.Align();
                            }
                            break;

                        case EnumValueTypes.ValueType_Int16:
                            valueField.value.Set(reader.ReadInt16());
                            if (valueField.templateField.align)
                            {
                                reader.Align();
                            }
                            break;

                        case EnumValueTypes.ValueType_UInt16:
                            valueField.value.Set(reader.ReadUInt16());
                            if (valueField.templateField.align)
                            {
                                reader.Align();
                            }
                            break;

                        case EnumValueTypes.ValueType_Int32:
                            valueField.value.Set(reader.ReadInt32());
                            break;

                        case EnumValueTypes.ValueType_UInt32:
                            valueField.value.Set(reader.ReadUInt32());
                            break;

                        case EnumValueTypes.ValueType_Int64:
                            valueField.value.Set(reader.ReadInt64());
                            break;

                        case EnumValueTypes.ValueType_UInt64:
                            valueField.value.Set(reader.ReadUInt64());
                            break;

                        case EnumValueTypes.ValueType_Float:
                            valueField.value.Set(reader.ReadSingle());
                            break;

                        case EnumValueTypes.ValueType_Double:
                            valueField.value.Set(reader.ReadDouble());
                            break;
                        }
                    }
                    else
                    {
                        valueField.pChildren = new AssetTypeValueField[valueField.childrenCount];
                        for (int i = 0; i < valueField.childrenCount; i++)
                        {
                            valueField.pChildren[i] = new AssetTypeValueField();
                            valueField.pChildren[i].templateField = valueField.templateField.children[i];
                            valueField.pChildren[i] = ReadType(reader, reader.Position, valueField.pChildren[i], bigEndian);
                        }
                        if (valueField.templateField.align)
                        {
                            reader.Align();
                        }
                    }
                }
            }
            return(valueField);
        }
        public AssetTypeValueField ReadType(AssetsFileReader reader, AssetTypeValueField valueField)
        {
            if (valueField.templateField.isArray)
            {
                if (valueField.templateField.childrenCount == 2)
                {
                    EnumValueTypes sizeType = valueField.templateField.children[0].valueType;
                    if (sizeType == EnumValueTypes.Int32 ||
                        sizeType == EnumValueTypes.UInt32)
                    {
                        if (valueField.templateField.valueType == EnumValueTypes.ByteArray)
                        {
                            valueField.childrenCount = 0;
                            valueField.children      = new AssetTypeValueField[0];
                            int    size = reader.ReadInt32();
                            byte[] data = reader.ReadBytes(size);
                            if (valueField.templateField.align)
                            {
                                reader.Align();
                            }
                            AssetTypeByteArray atba = new AssetTypeByteArray();
                            atba.size        = (uint)size;
                            atba.data        = data;
                            valueField.value = new AssetTypeValue(EnumValueTypes.ByteArray, atba);
                        }
                        else
                        {
                            valueField.childrenCount = reader.ReadInt32();
                            valueField.children      = new AssetTypeValueField[valueField.childrenCount];
                            for (int i = 0; i < valueField.childrenCount; i++)
                            {
                                valueField.children[i] = new AssetTypeValueField();
                                valueField.children[i].templateField = valueField.templateField.children[1];
                                valueField.children[i] = ReadType(reader, valueField.children[i]);
                            }
                            if (valueField.templateField.align)
                            {
                                reader.Align();
                            }
                            AssetTypeArray ata = new AssetTypeArray();
                            ata.size         = valueField.childrenCount;
                            valueField.value = new AssetTypeValue(EnumValueTypes.Array, ata);
                        }
                    }
                    else
                    {
                        throw new Exception("Invalid array value type! Found an unexpected " + sizeType.ToString() + " type instead!");
                    }
                }
                else
                {
                    throw new Exception("Invalid array!");
                }
            }
            else
            {
                EnumValueTypes type = valueField.templateField.valueType;
                if (type != 0)
                {
                    valueField.value = new AssetTypeValue(type, null);
                }
                if (type == EnumValueTypes.String)
                {
                    int length = reader.ReadInt32();
                    valueField.value.Set(reader.ReadBytes(length));
                    reader.Align();
                }
                else
                {
                    valueField.childrenCount = valueField.templateField.childrenCount;
                    if (valueField.childrenCount == 0)
                    {
                        valueField.children = new AssetTypeValueField[0];
                        switch (valueField.templateField.valueType)
                        {
                        case EnumValueTypes.Int8:
                            valueField.value.Set(reader.ReadSByte());
                            if (valueField.templateField.align)
                            {
                                reader.Align();
                            }
                            break;

                        case EnumValueTypes.UInt8:
                        case EnumValueTypes.Bool:
                            valueField.value.Set(reader.ReadByte());
                            if (valueField.templateField.align)
                            {
                                reader.Align();
                            }
                            break;

                        case EnumValueTypes.Int16:
                            valueField.value.Set(reader.ReadInt16());
                            if (valueField.templateField.align)
                            {
                                reader.Align();
                            }
                            break;

                        case EnumValueTypes.UInt16:
                            valueField.value.Set(reader.ReadUInt16());
                            if (valueField.templateField.align)
                            {
                                reader.Align();
                            }
                            break;

                        case EnumValueTypes.Int32:
                            valueField.value.Set(reader.ReadInt32());
                            break;

                        case EnumValueTypes.UInt32:
                            valueField.value.Set(reader.ReadUInt32());
                            break;

                        case EnumValueTypes.Int64:
                            valueField.value.Set(reader.ReadInt64());
                            break;

                        case EnumValueTypes.UInt64:
                            valueField.value.Set(reader.ReadUInt64());
                            break;

                        case EnumValueTypes.Float:
                            valueField.value.Set(reader.ReadSingle());
                            break;

                        case EnumValueTypes.Double:
                            valueField.value.Set(reader.ReadDouble());
                            break;
                        }
                    }
                    else
                    {
                        valueField.children = new AssetTypeValueField[valueField.childrenCount];
                        for (int i = 0; i < valueField.childrenCount; i++)
                        {
                            valueField.children[i] = new AssetTypeValueField();
                            valueField.children[i].templateField = valueField.templateField.children[i];
                            valueField.children[i] = ReadType(reader, valueField.children[i]);
                        }
                        if (valueField.templateField.align)
                        {
                            reader.Align();
                        }
                    }
                }
            }
            return(valueField);
        }