コード例 #1
0
 public void Write(AssetsFileWriter writer)
 {
     writer.WriteNullTerminated(signature);
     writer.Write(fileVersion);
     writer.WriteNullTerminated(minPlayerVersion);
     writer.WriteNullTerminated(fileEngineVersion);
     writer.Write(totalFileSize);
     writer.Write(compressedSize);
     writer.Write(decompressedSize);
     writer.Write(flags);
 }
コード例 #2
0
 public static byte[] WriteToByteArray(this AssetTypeInstance instance)
 {
     byte[] data;
     using (MemoryStream ms = new MemoryStream())
         using (AssetsFileWriter w = new AssetsFileWriter(ms))
         {
             instance.Write(w);
             data = ms.ToArray();
         }
     return(data);
 }
コード例 #3
0
 public static byte[] WriteToByteArray(this AssetTypeValueField valueField)
 {
     byte[] data;
     using (MemoryStream ms = new MemoryStream())
         using (AssetsFileWriter w = new AssetsFileWriter(ms))
         {
             valueField.Write(w);
             data = ms.ToArray();
         }
     return(data);
 }
コード例 #4
0
 public ulong Write(ulong curFilePos, AssetsFileWriter writer)
 {
     writer.Write(version);
     writer.Write(depth);
     writer.Write(isArray);
     writer.Write(typeStringOffset);
     writer.Write(nameStringOffset);
     writer.Write(size);
     writer.Write(index);
     writer.Write(flags);
     return(writer.Position);
 }
コード例 #5
0
        public static AssetsReplacer ConvertTexture(AssetTypeValueField baseField, ulong pathId, string folderPath)
        {
            //byte[] data = null;
            AssetTypeValueField m_StreamData = baseField.Get("m_StreamData");

            //int offset = (int)m_StreamData.Get("offset").GetValue().AsUInt();
            //int size = (int)m_StreamData.Get("size").GetValue().AsUInt();
            //
            //if (size != 0)
            //{
            //    string path = m_StreamData.Get("path").GetValue().AsString();
            //    using (FileStream stream = new FileStream(Path.Combine(folderPath, path), FileMode.Open))
            //    using (MemoryStream memStream = new MemoryStream())
            //    {
            //        long fileSize = stream.Length;
            //        data = new byte[size];
            //        stream.Position = offset;
            //
            //        int bytesRead;
            //        var buffer = new byte[2048];
            //        while (((bytesRead = stream.Read(buffer, 0, Math.Min(2048, (offset + size) - (int)stream.Position))) > 0))
            //        {
            //            memStream.Write(buffer, 0, bytesRead);
            //            if (stream.Position >= offset + size)
            //            {
            //                break;
            //            }
            //        }
            //        data = memStream.ToArray();
            //    }
            //}

            //this may not be needed, instead change the path to a hardcoded path to the resS
            //m_StreamData.Get("offset").value.value.asUInt32 = 0;
            //m_StreamData.Get("size").value.value.asUInt32 = 0;
            m_StreamData.Get("path").value.value.asString = Path.Combine(folderPath, m_StreamData.Get("path").GetValue().AsString());
            //baseField.Get("image data").GetValue().type = EnumValueTypes.ValueType_ByteArray;
            //baseField.Get("image data").GetValue().Set(new AssetTypeByteArray() {
            //    data = data,
            //    size = (uint)data.Length
            //});
            //baseField.Get("image data").templateField.valueType = EnumValueTypes.ValueType_ByteArray;
            byte[] textureAsset;
            using (MemoryStream memStream = new MemoryStream())
                using (AssetsFileWriter writer = new AssetsFileWriter(memStream))
                {
                    writer.bigEndian = false;
                    baseField.Write(writer);
                    textureAsset = memStream.ToArray();
                }
            return(new AssetsReplacerFromMemory(0, pathId, 0x1C, 0xFFFF, textureAsset));
        }
コード例 #6
0
 public bool Write(AssetsFileWriter writer, ulong curFilePos /*, AssetsFileVerifyLogger errorLogger = NULL*/)
 {
     writer.Position = curFilePos;
     writer.WriteNullTerminated(signature);
     writer.Write(fileVersion);
     writer.WriteNullTerminated(minPlayerVersion);
     writer.WriteNullTerminated(fileEngineVersion);
     writer.Write(totalFileSize);
     writer.Write(compressedSize);
     writer.Write(decompressedSize);
     writer.Write(flags);
     return(true);
 }
コード例 #7
0
        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();

            if (ofd.ShowDialog() != DialogResult.OK)
            {
                return;
            }

            string mainFile = ofd.FileName;
            string outFile  = Path.Combine(Path.GetDirectoryName(ofd.FileName), "out.assets");
            //string classFile = "U5.6.0f3_AT.NET.dat";

            FileStream       mffs            = new FileStream(mainFile, FileMode.Open);
            FileStream       offs            = new FileStream(outFile, FileMode.Create);
            AssetsFile       assetsFile      = new AssetsFile(new AssetsFileReader(mffs));
            AssetsFileWriter writer          = new AssetsFileWriter(offs);
            AssetsReplacer   assetsReplacer1 = new AssetsReplacerFromFile(0, 100, 0x1, 0xFFFF, new FileStream("testasset.dat", FileMode.Open), 0, 0x0E);

            assetsFile.Write(writer, 0, new AssetsReplacer[] { assetsReplacer1 }, 0);
            writer.Close();
            writer.Dispose();
            //AssetsFileTable assetsFileTable = new AssetsFileTable(assetsFile);
            //AssetFileInfoEx assetsFileInfo = assetsFileTable.getAssetInfo(289578);

            //FileStream cffs = new FileStream(classFile, FileMode.Open);
            //AssetTypeTemplateField pBaseField = new AssetTypeTemplateField();
            //ClassDatabaseFile classDatabaseFile = new ClassDatabaseFile();
            //classDatabaseFile.Read(new AssetsFileReader(cffs));

            //ClassDatabaseType classDatabaseType = AssetHelper.FindAssetClassByName(classDatabaseFile, "MonoBehaviour");

            //pBaseField.FromClassDatabase(classDatabaseFile, classDatabaseType, 0);

            //AssetTypeInstance ati = new AssetTypeInstance(1, new[] { pBaseField }, new AssetsFileReader(mffs), false, assetsFileInfo.absoluteFilePos);

            //MonoClass mc = new MonoClass();
            //mc.Read("Peeper", "E:\\Steam\\steamapps\\common\\Subnautica\\Subnautica_Data\\Managed\\Assembly-CSharp.dll");
            //AssetTypeTemplateField[] templateField = pBaseField.children.Concat(mc.children).ToArray();
            //pBaseField.children = templateField;
            //pBaseField.childrenCount = (uint)pBaseField.children.Length;

            //AssetTypeInstance ati2 = new AssetTypeInstance(1, new[] { pBaseField }, new AssetsFileReader(mffs), false, assetsFileInfo.absoluteFilePos);

            //MessageBox.Show("" + ati.GetBaseField().childrenCount);
            //MessageBox.Show("" + ati.GetBaseField().childrenCount);
            //MessageBox.Show("" + ati.GetBaseField().Get("m_Component").Get("Array").Get(0).Get("component").Get("m_PathID").GetValue().AsInt64());
            //MessageBox.Show("" + ati2.GetBaseField().Get("rechargeInterval").GetValue().AsFloat());
            //Console.WriteLine(ati.GetBaseField().Get(2).GetValue().asString);
            //Console.ReadLine();
        }
コード例 #8
0
ファイル: Loader.cs プロジェクト: crmaxx/HKWorldLoad
        //todo- not guaranteed to get texture in sharedassets
        private static byte[] FixTexture2D(AssetTypeValueField baseField, byte[] saData)
        {
            AssetTypeValueField m_StreamData = baseField.Get("m_StreamData");
            int offset = (int)m_StreamData.Get("offset").GetValue().AsUInt();
            int size   = (int)m_StreamData.Get("size").GetValue().AsUInt();

            byte[] data = new byte[0];
            if (size != 0)
            {
                string path = m_StreamData.Get("path").GetValue().AsString();
                using (MemoryStream inStream = new MemoryStream(saData))
                    using (MemoryStream outStream = new MemoryStream())
                    {
                        long fileSize = inStream.Length;
                        data = new byte[size];
                        inStream.Position = offset;

                        int bytesRead;
                        var buffer = new byte[2048];
                        while ((bytesRead = inStream.Read(buffer, 0, Math.Min(2048, (offset + size) - (int)inStream.Position))) > 0)
                        {
                            outStream.Write(buffer, 0, bytesRead);
                            if (inStream.Position >= offset + size)
                            {
                                break;
                            }
                        }
                        data = outStream.ToArray();
                    }
            }
            m_StreamData.Get("offset").value.value.asUInt32 = 0;
            m_StreamData.Get("size").value.value.asUInt32   = 0;
            m_StreamData.Get("path").value.value.asString   = "";
            baseField.Get("image data").GetValue().type     = EnumValueTypes.ValueType_ByteArray;
            baseField.Get("image data").GetValue().Set(new AssetTypeByteArray()
            {
                data = data,
                size = (uint)data.Length
            });
            baseField.Get("image data").templateField.valueType = EnumValueTypes.ValueType_ByteArray;
            byte[] assetData;
            using (MemoryStream memStream = new MemoryStream())
                using (AssetsFileWriter writer = new AssetsFileWriter(memStream))
                {
                    writer.bigEndian = false;
                    baseField.Write(writer);
                    assetData = memStream.ToArray();
                }
            return(assetData);
        }
コード例 #9
0
        private void ImportAssets()
        {
            var inf       = currentFile.table.GetAssetInfo("MyBoringAsset");
            var baseField = helper.GetATI(currentFile.file, inf).GetBaseField();

            baseField.Get("m_Name")
            .GetValue()
            .Set("MyCoolAsset");
            var newGoBytes = baseField.WriteToByteArray();
            //AssetsReplacerFromMemory's monoScriptIndex should always be 0xFFFF unless it's a MonoBehaviour
            var repl   = new AssetsReplacerFromMemory(0, inf.index, (int)inf.curFileType, 0xFFFF, newGoBytes);
            var writer = new AssetsFileWriter(File.OpenWrite("resources-modified.assets"));

            currentFile.file.Write(writer, 1, new AssetsReplacer[] { repl }.ToList(), 1);
        }
コード例 #10
0
        }//Minimum AssetsFile format : 6

        public ulong Write(ulong absFilePos, AssetsFileWriter writer, uint version)
        {
            writer.WriteNullTerminated(unityVersion);
            writer.Write(this.version);
            writer.Write(hasTypeTree);
            writer.Write(fieldCount);
            for (int i = 0; i < fieldCount; i++)
            {
                pTypes_Unity5[i].Write(hasTypeTree, writer.Position, writer, version);
            }
            if (version < 0x0E)
            {
                writer.WriteUInt24(dwUnknown);
            }
            return(writer.Position);
        }
コード例 #11
0
        private byte[] CreateEditDifferMonoBehaviour(long goPid, AssetTypeValueField componentArray, AssetID origGoPptr)
        {
            byte[] data;
            using (MemoryStream ms = new MemoryStream())
                using (AssetsFileWriter w = new AssetsFileWriter(ms))
                {
                    w.bigEndian = false;
                    w.Write(0);
                    w.Write(goPid);
                    w.Write(1);
                    w.Write(2);
                    w.Write((long)11500000);
                    w.WriteCountStringInt32("");
                    w.Align();

                    w.Write(0);
                    w.Write(origGoPptr.pathId);
                    w.Write(origGoPptr.pathId);
                    w.Write(0);

                    int componentArrayLength = componentArray.GetValue().AsArray().size;
                    w.Write(componentArrayLength);
                    for (int i = 0; i < componentArrayLength; i++)
                    {
                        AssetTypeValueField component = componentArray[i].Get("component");
                        int  m_FileID = component.Get("m_FileID").GetValue().AsInt();
                        long m_PathID = component.Get("m_PathID").GetValue().AsInt64();
                        if (m_PathID == 0) //removed (monobehaviour)
                        {
                            w.Write((long)-1);
                        }
                        else if (m_FileID == 0) //correct file
                        {
                            w.Write(m_PathID);
                        }
                        else //another file (shouldn't happen?)
                        {
                            w.Write((long)0);
                        }
                    }

                    w.Write(0 /*rand.Next()*/);
                    data = ms.ToArray();
                }
            return(data);
        }
コード例 #12
0
ファイル: HKSave.cs プロジェクト: xueliuxing28/HKWorldEdit
    private void DecompressBundle(string path)
    {
        //from uabe
        AssetsFileReader reader = new AssetsFileReader(new FileStream(path, FileMode.Open));
        AssetsBundleFile bundle = new AssetsBundleFile();

        bundle.Read(reader, true);
        reader.Position = 0;
        AssetsFileWriter writer = new AssetsFileWriter(new FileStream(path + ".up", FileMode.Create));

        bundle.Unpack(reader, writer);
        //writer.BaseStream.Position = 0;
        //bundle = new AssetsBundleFile();
        //bundle.Read(new AssetsFileReader(writer.BaseStream), false);
        reader.BaseStream.Close();
        writer.BaseStream.Close();
    }
コード例 #13
0
ファイル: Menu.cs プロジェクト: Igor55x/UAAE
        private void SaveBundle(string path)
        {
            if (BundleInst == null)
            {
                return;
            }
            using (var fs = File.OpenWrite(path))
                using (var writer = new AssetsFileWriter(fs))
                {
                    BundleInst.file.Write(writer, ModifiedFiles.Values.ToList());
                }
            Modified = false;
            var items = cboxBundleContents.Items.Cast <string>().Select(i => i.Replace(" *", ""));

            cboxBundleContents.Items.Clear();
            cboxBundleContents.Items.AddRange((object[])items);
        }
コード例 #14
0
ファイル: Loader.cs プロジェクト: crmaxx/HKWorldEdit2
        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());
                        }
                }
        }
コード例 #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
        private byte[] CreateTk2DEmulatorMonoBehaviour(long goPid, Tk2dInfo tk2dInfo)
        {
            byte[] data;
            using (MemoryStream ms = new MemoryStream())
                using (AssetsFileWriter w = new AssetsFileWriter(ms))
                {
                    w.bigEndian = false;
                    w.Write(0);
                    w.Write(goPid);
                    w.Write(1);
                    w.Write(3);
                    w.Write((long)11500000);
                    w.WriteCountStringInt32("");
                    w.Align();

                    w.Write(tk2dInfo.positions.Length);
                    for (int i = 0; i < tk2dInfo.positions.Length; i++)
                    {
                        Vector3 position = tk2dInfo.positions[i];
                        w.Write(position.x);
                        w.Write(position.y);
                        w.Write(position.z);
                    }
                    w.Align();

                    w.Write(tk2dInfo.uvs.Length);
                    for (int i = 0; i < tk2dInfo.uvs.Length; i++)
                    {
                        Vector3 uv = tk2dInfo.uvs[i];
                        w.Write(uv.x);
                        w.Write(uv.y);
                    }
                    w.Align();

                    w.Write(tk2dInfo.indices.Length);
                    for (int i = 0; i < tk2dInfo.indices.Length; i++)
                    {
                        w.Write(tk2dInfo.indices[i]);
                    }
                    w.Align();

                    data = ms.ToArray();
                }
            return(data);
        }
コード例 #17
0
ファイル: AssetImportExport.cs プロジェクト: roffyy/UABEA
 public byte[]? ImportTextAsset(StreamReader sr)
 {
     this.sr = sr;
     using (MemoryStream ms = new MemoryStream())
     {
         aw           = new AssetsFileWriter(ms);
         aw.bigEndian = false;
         try
         {
             ImportTextAssetLoop();
         }
         catch
         {
             return(null);
         }
         return(ms.ToArray());
     }
 }
コード例 #18
0
        public Dictionary <BundleReplacer, MemoryStream> WriteFilesToMemory(List <AssetsReplacer> replacers)
        {
            var bunDict    = new Dictionary <BundleReplacer, MemoryStream>();
            var lastFileId = replacers.Max(r => r.GetFileID());

            for (var fileId = 0; fileId <= lastFileId; fileId++)
            {
                var id = fileId;
                var sortedAssetsList = replacers.Where(r => r.GetFileID() == id).ToList();
                using var ms     = new MemoryStream();
                using var writer = new AssetsFileWriter(ms);
                var fileInst = Workspace.LoadedFiles[fileId];

                fileInst.file.Write(writer, 0, sortedAssetsList, 0);
                bunDict.Add(AssetModifier.CreateBundleReplacer(fileInst.name, true, ms.ToArray()), ms);
            }
            return(bunDict);
        }
コード例 #19
0
        /// <summary>
        /// Unpack the specified bundle instance and return a new instance of the unpacked version.
        /// </summary>
        /// <param name="manager">The assets manager</param>
        /// <param name="bundle">The bundle to unpack</param>
        /// <param name="unpackedFile">The unpacked bundle file</param>
        /// <returns></returns>
        private static BundleFileInstance Unpack(
            AssetsManager manager,
            BundleFileInstance bundle,
            string unpackedFile
            )
        {
            using var unpackedStream = File.OpenWrite(unpackedFile);
            using var reader         = new AssetsFileReader(bundle.stream);
            using var writer         = new AssetsFileWriter(unpackedStream);

            bundle.file.Unpack(reader, writer);
            writer.Flush();

            // Close the stream so assetsManager can open the file
            unpackedStream.Close();

            return(manager.LoadBundleFile(unpackedFile));
        }
コード例 #20
0
        public void WriteFiles(List <AssetsReplacer> replacers, bool overwrite = false)
        {
            var lastFileId = replacers.Max(r => r.GetFileID());

            for (var fileId = 0; fileId <= lastFileId; fileId++)
            {
                var id = fileId;
                var sortedAssetsList = replacers.Where(r => r.GetFileID() == id).ToList();  // sort the list of replacers by fileID
                var fileInst         = Workspace.LoadedFiles[fileId];
                if (overwrite)
                {
                    var path     = fileInst.path;
                    var tempPath = Path.Combine(Path.GetTempPath(), fileInst.name);
                    using var fs     = File.OpenWrite(tempPath);
                    using var writer = new AssetsFileWriter(fs);
                    fileInst.file.Write(writer, 0, sortedAssetsList, 0);
                    Am.UnloadAssetsFile(path);
                    fs.Close();
                    File.Replace(tempPath, path, path + ".backup");
                    Workspace.LoadedFiles[fileId] = Am.LoadAssetsFile(path, false);
                }
                else
                {
                    var sfd = new SaveFileDialog
                    {
                        Title    = @"Save as...",
                        Filter   = @"All types (*.*)|*.*|Assets file (*.assets)|*.assets",
                        FileName = fileInst.name
                    };
                    if (sfd.ShowDialog() != DialogResult.OK)
                    {
                        continue;
                    }
                    if (fileInst.path == sfd.FileName)
                    {
                        MsgBoxUtils.ShowErrorDialog("If you want to overwrite files go to \"File->Save\" instead of \"File->Save as...\"!");
                        return;
                    }
                    using var fs     = File.OpenWrite(sfd.FileName);
                    using var writer = new AssetsFileWriter(fs);
                    fileInst.file.Write(writer, 0, sortedAssetsList, 0);
                }
            }
        }
コード例 #21
0
ファイル: AudioFixer.cs プロジェクト: Z4t4r/QModManager
        internal static void ChangeDisableUnityAudio(string path, bool newValue, QModGame game)
        {
            if (game != QModGame.Subnautica && game != QModGame.BelowZero)
            {
                throw new ArgumentException("Neither Subnautica nor Below Zero detected!");
            }
            AssetsManager      am  = new AssetsManager();
            AssetsFileInstance afi = am.LoadAssetsFile(path, false);

            if (game == QModGame.Subnautica)
            {
                am.LoadClassDatabase("cldb.dat");
            }
            else
            {
                am.LoadClassDatabase("cldb2018.dat");
            }
            AssetFileInfoEx     audioInfo      = afi.table.getAssetInfo(4);
            AssetTypeInstance   audioAti       = am.GetATI(afi.file, audioInfo);
            AssetTypeValueField audioBaseField = audioAti.GetBaseField();

            audioBaseField.Get("m_DisableAudio").GetValue().Set(newValue);
            byte[] audioAsset;
            using (MemoryStream memStream = new MemoryStream())
                using (AssetsFileWriter writer = new AssetsFileWriter(memStream))
                {
                    writer.bigEndian = false;
                    audioBaseField.Write(writer);
                    audioAsset = memStream.ToArray();
                }
            List <AssetsReplacer> rep = new List <AssetsReplacer>()
            {
                new AssetsReplacerFromMemory(0, 4, 0x0B, 0xFFFF, audioAsset)
            };

            using (MemoryStream memStream = new MemoryStream())
                using (AssetsFileWriter writer = new AssetsFileWriter(memStream))
                {
                    afi.file.Write(writer, 0, rep.ToArray(), 0);
                    afi.stream.Close();
                    File.WriteAllBytes(path, memStream.ToArray());
                }
        }
コード例 #22
0
ファイル: BundleCreator.cs プロジェクト: crmaxx/HKWorldLoad
        public static byte[] CreateBlankAssets(string engineVersion, List <Type_0D> types)
        {
            using (MemoryStream ms = new MemoryStream())
                using (AssetsFileWriter writer = new AssetsFileWriter(ms))
                {
                    AssetsFileHeader header = new AssetsFileHeader()
                    {
                        metadataSize   = 0,
                        fileSize       = 0x1000,
                        format         = 0x11,
                        offs_firstFile = 0x1000,
                        endianness     = 0,
                        unknown        = new byte[] { 0, 0, 0 }
                    };
                    TypeTree typeTree = new TypeTree()
                    {
                        unityVersion  = engineVersion,
                        version       = 0x5,
                        hasTypeTree   = true,
                        fieldCount    = (uint)types.Count(),
                        pTypes_Unity5 = types.ToArray()
                    };


                    header.Write(writer.Position, writer);
                    writer.bigEndian = false;
                    typeTree.Write(writer.Position, writer, 0x11);
                    writer.Write((uint)0);
                    writer.Align();
                    //preload table and dependencies
                    writer.Write((uint)0);
                    writer.Write((uint)0);

                    //due to a write bug in at.net we have to pad to 0x1000
                    while (ms.Position < 0x1000)
                    {
                        writer.Write((byte)0);
                    }

                    return(ms.ToArray());
                }
        }
コード例 #23
0
        public void Write(AssetsFileWriter writer, int version)
        {
            typeName.Write(writer);
            fieldName.Write(writer);
            writer.Write(depth);
            writer.Write(isArray);
            writer.Write(size);
            switch (version)
            {
            case 1:
                writer.Write(flags2);
                break;

            case 3:
            case 4:
                writer.Write(this.version);
                writer.Write(flags2);
                break;
            }
        }
コード例 #24
0
        public ulong Write(AssetsFileWriter writer, ulong filePos, int version)
        {
            typeName.Write(writer, filePos);
            fieldName.Write(writer, filePos);
            writer.Write(depth);
            writer.Write(isArray);
            writer.Write(size);
            switch (version)
            {
            case 1:
                writer.Write(flags2);
                break;

            case 3:
                writer.Write(this.version);
                writer.Write(flags2);
                break;
            }
            return(writer.Position);
        }
コード例 #25
0
ファイル: MoveTest.cs プロジェクト: crmaxx/HKWorldLoad
        public static AssetsReplacer RunMoveTest(AssetFileInfoEx info, AssetTypeValueField baseField, ulong pathId)
        {
            //GameObject 609->Transform 2642
            AssetTypeValueField m_LocalPosition = baseField.Get("m_LocalPosition");

            m_LocalPosition.Get("x").GetValue().Set(89.93f);
            m_LocalPosition.Get("y").GetValue().Set(25.56f);
            m_LocalPosition.Get("z").GetValue().Set(48.73f);

            byte[] moveAsset;
            using (MemoryStream memStream = new MemoryStream())
                using (AssetsFileWriter writer = new AssetsFileWriter(memStream))
                {
                    writer.bigEndian = false;
                    baseField.Write(writer);
                    moveAsset = memStream.ToArray();
                }

            return(new AssetsReplacerFromMemory(0, pathId, 0x04, 0xFFFF, moveAsset));
        }
コード例 #26
0
        public static AssetsReplacer ConvertShader(AssetTypeValueField baseField, ulong pathId, List <ulong> dependencies)
        {
            AssetTypeValueField m_Dependencies = baseField.Get("m_Dependencies").Get("Array");

            for (int i = 0; i < m_Dependencies.GetValue().AsArray().size; i++)
            {
                m_Dependencies[(uint)i].Get("m_FileID").GetValue().Set(0);
                m_Dependencies[(uint)i].Get("m_PathID").GetValue().Set(dependencies[i]);
            }

            byte[] shaderAsset;
            using (MemoryStream memStream = new MemoryStream())
                using (AssetsFileWriter writer = new AssetsFileWriter(memStream))
                {
                    writer.bigEndian = false;
                    baseField.Write(writer);
                    shaderAsset = memStream.ToArray();
                }
            return(new AssetsReplacerFromMemory(0, pathId, 0x30, 0xFFFF, shaderAsset));
        }
コード例 #27
0
 //Write doesn't compress
 public void Write(AssetsFileWriter writer)
 {
     writer.Write(checksumHigh);
     writer.Write(checksumLow);
     writer.Write(blockCount);
     for (int i = 0; i < blockCount; i++)
     {
         writer.Write(blockInf[i].decompressedSize);
         writer.Write(blockInf[i].compressedSize);
         writer.Write(blockInf[i].flags);
     }
     writer.Write(directoryCount);
     for (int i = 0; i < directoryCount; i++)
     {
         writer.Write(dirInf[i].offset);
         writer.Write(dirInf[i].decompressedSize);
         writer.Write(dirInf[i].flags);
         writer.WriteNullTerminated(dirInf[i].name);
     }
 }
コード例 #28
0
        public void AddReplacer(AssetsReplacer replacer, MemoryStream previewStream = null)
        {
            if (replacer == null)
            {
                return;
            }
            var forInstance = LoadedFiles[replacer.GetFileID()];
            var assetId     = new AssetID(forInstance.path, replacer.GetPathID());
            var index       = LoadedAssets.FindIndex(i => i.FileID == replacer.GetFileID() && i.PathID == replacer.GetPathID());
            var item        = LoadedAssets[index];

            if (NewAssets.ContainsKey(assetId))
            {
                RemoveReplacer(replacer);
            }

            NewAssets[assetId] = replacer;

            if (previewStream == null)
            {
                var newStream = new MemoryStream();
                var newWriter = new AssetsFileWriter(newStream);
                replacer.Write(newWriter);
                newStream.Position = 0;
                previewStream      = newStream;
            }

            NewAssetDatas[assetId] = previewStream;

            if (replacer is AssetsRemover)
            {
                LoadedContainers.Remove(assetId);
            }
            else
            {
                var cont = MakeAssetContainer(item, NewAssetDatas[assetId]);
                UpdateAssetInfo(cont, assetId, index);
            }

            Modified = true;
        }
コード例 #29
0
        public void Write(AssetsFileWriter writer)
        {
            writer.bigEndian = false;

            writer.Write(Encoding.ASCII.GetBytes(magic));

            writer.Write(includesCldb);

            writer.WriteCountStringInt16(modName);
            writer.WriteCountStringInt16(modCreators);
            writer.WriteCountStringInt16(modDescription);

            if (includesCldb)
            {
                addedTypes.Write(writer);
                writer.Position = addedTypes.header.stringTablePos + addedTypes.header.stringTableLen;
            }

            writer.Write(affectedFiles.Count);
            for (int i = 0; i < affectedFiles.Count; i++)
            {
                InstallerPackageAssetsDesc desc = affectedFiles[i];
                writer.Write(desc.isBundle);
                writer.WriteCountStringInt16(desc.path);

                writer.Write(desc.replacers.Count);
                for (int j = 0; j < desc.replacers.Count; j++)
                {
                    object repObj = desc.replacers[j];
                    if (repObj is AssetsReplacer repAsset)
                    {
                        repAsset.WriteReplacer(writer);
                    }
                    else if (repObj is BundleReplacer repBundle)
                    {
                        repBundle.WriteReplacer(writer);
                    }
                }
            }
        }
コード例 #30
0
ファイル: AssetWorkspace.cs プロジェクト: nesrak1/UABEA
        public void AddReplacer(AssetsFileInstance forFile, AssetsReplacer replacer, Stream? previewStream = null)
        {
            AssetsFile assetsFile = forFile.file;
            AssetID assetId = new AssetID(forFile.path, replacer.GetPathID());

            if (NewAssets.ContainsKey(assetId))
                RemoveReplacer(forFile, NewAssets[assetId], true);

            NewAssets[assetId] = replacer;

            //make stream to use as a replacement to the one from file
            if (previewStream == null)
            {
                MemoryStream newStream = new MemoryStream();
                AssetsFileWriter newWriter = new AssetsFileWriter(newStream);
                replacer.Write(newWriter);
                newStream.Position = 0;
                previewStream = newStream;
            }
            NewAssetDatas[assetId] = previewStream;

            if (!(replacer is AssetsRemover))
            {
                AssetsFileReader reader = new AssetsFileReader(previewStream);
                AssetContainer cont = new AssetContainer(
                    reader, 0, replacer.GetPathID(), (uint)replacer.GetClassID(),
                    replacer.GetMonoScriptID(), (uint)previewStream.Length, forFile);

                LoadedAssets[assetId] = cont;
            }
            else
            {
                LoadedAssets.Remove(assetId);
            }

            if (ItemUpdated != null)
                ItemUpdated(forFile, assetId);

            Modified = true;
        }