示例#1
0
        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);
                }
        }
示例#2
0
        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);
                }
            }
        }
示例#3
0
        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);
        }
示例#4
0
 ///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();
     }
 }
示例#5
0
        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);
        }
示例#6
0
        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);
        }
示例#7
0
        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));
        }
示例#8
0
        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));
        }
示例#9
0
        //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);
        }
示例#10
0
 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);
        }
示例#12
0
        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));
        }
示例#13
0
        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());
                        }
                }
        }
示例#14
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 j = 0; j < fieldCount; j++)
            {
                ClassDatabaseTypeField cdtf = new ClassDatabaseTypeField();
                cdtf.Read(reader, filePos, version);
                fields.Add(cdtf);
            }
            return(reader.Position);
        }
示例#15
0
        //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());
                        }
                }
        }
示例#16
0
        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);
        }
示例#18
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);
            }
        }
示例#19
0
 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);
        }
示例#21
0
        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);
        }
示例#23
0
        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("");
        }
示例#24
0
        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);
        }
示例#25
0
        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);
        }
示例#26
0
        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;
            }
        }
示例#28
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))
     {
         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);
 }
示例#29
0
        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));
        }
示例#30
0
        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}");
        }