Ejemplo n.º 1
0
        private void ParseBlocks(BinaryReader reader, string name)
        {
            var version = m_header.GetVersion();

            byte[] packageBlock = reader.ReadBytes(m_header.m_packageBlockSize);
            byte[] skinBlock    = reader.ReadBytes(m_header.m_skinBlockSize);
            m_graphBlock = reader.ReadBytes(m_header.m_graphBlockSize);
            if (version == 7)
            {
                m_typeBundleIndexBlock = reader.ReadBytes(m_header.m_typeBundleIndexBlockSize);
                //File.WriteAllBytes(name + "_typeBundleIndex", m_typeBundleIndexBlock);
            }

            // todo: don't waste time and memory by loading into byte arrays

            //File.WriteAllBytes(name + "_package", packageBlockTest);
            //File.WriteAllBytes(name + "_graph", graphBlockTest);

            Package[] packages;
            using (var packageStream = new MemoryStream(packageBlock))
                using (var packageReader = new BinaryReader(packageStream)) {
                    packages = packageReader.ReadArray <Package>(m_header.m_packageCount);
                }

            m_packages = new Dictionary <ulong, Package>();
            foreach (var package in packages)
            {
                m_packages[package.m_assetGUID] = package;
            }

            SkinHeader[] skins = new SkinHeader[m_header.m_skinCount];
            m_skins = new Dictionary <ulong, Skin>();
            using (var skinStream = new MemoryStream(skinBlock))
                using (var skinReader = new BinaryReader(skinStream)) {
                    for (var i = 0; i < m_header.m_skinCount; i++)
                    {
                        var skinStart = skinStream.Position;

                        var skinHeader = skinReader.Read <SkinHeader>();
                        skins[i] = skinHeader;

                        if (skinHeader.m_assetPtr == 0)
                        {
                            continue;
                        }
                        skinStream.Position = skinStart + skinHeader.m_assetPtr;

                        SkinAsset6[] assets;
                        if (version == 5)
                        {
                            assets = skinReader.ReadArray <SkinAsset5>(skinHeader.m_assetCount).Select(x => x.Upgrade()).ToArray();
                        }
                        else
                        {
                            assets = skinReader.ReadArray <SkinAsset6>(skinHeader.m_assetCount);
                        }

                        m_skins[skinHeader.m_skinGUID] = new Skin(skinHeader, assets);
                    }
                }
        }
Ejemplo n.º 2
0
        private void ParseBlocks(BinaryReader reader, string name) {
            var version = m_header.GetVersion();
            
            byte[] packageBlockTest = reader.ReadBytes(m_header.m_packageBlockSize);
            byte[] skinBlockTest = reader.ReadBytes(m_header.m_skinBlockSize);
            byte[] graphBlockTest = reader.ReadBytes(m_header.m_graphBlockSize);
            if (version == 7) {
                byte[] typeBundleIndexBlock = reader.ReadBytes(m_header.m_typeBundleIndexBlockSize);
                //File.WriteAllBytes(name + "_typeBundleIndex", typeBundleIndexBlock);
            }
            
            // todo: don't waste time and memory by loading into byte arrays

            //File.WriteAllBytes(name + "_package", packageBlockTest);
            //File.WriteAllBytes(name + "_graph", graphBlockTest);

            Package[] packages;
            using (var packageStream = new MemoryStream(packageBlockTest))
            using (var packageReader = new BinaryReader(packageStream)) {
                packages = packageReader.ReadArray<Package>(m_header.m_packageCount);
            }

            m_packages = new Dictionary<ulong, Package>();
            foreach (Package package in packages) {
                m_packages[package.m_assetGUID] = package;
            }

            SkinHeader[] skins = new SkinHeader[m_header.m_skinCount];
            m_skins = new Dictionary<ulong, Skin>();
            using (var skinStream = new MemoryStream(skinBlockTest))
            using (var skinReader = new BinaryReader(skinStream)) {
                for (int i = 0; i < m_header.m_skinCount; i++) {
                    long skinStart = skinStream.Position;

                    var skinHeader = skinReader.Read<SkinHeader>();
                    skins[i] = skinHeader;

                    var skin = new Skin(skinHeader);
                    m_skins[skinHeader.m_skinGUID] = skin;

                    if (skinHeader.m_assetPtr == 0) continue;
                    skinStream.Position = skinStart + skinHeader.m_assetPtr;

                    if (version == 5) {
                        skin.m_assets = skinReader.ReadArray<SkinAsset5>(skinHeader.m_assetCount).Select(x => x.Upgrade()).ToArray();
                    } else {
                        skin.m_assets = skinReader.ReadArray<SkinAsset6>(skinHeader.m_assetCount);
                    }

                    //Logger.Info("TRG", $"{skin.m_skinGUID:X16}");
                    //foreach (SkinAsset asset in assets) {
                    //    Logger.Info("TRG", $"    {asset.m_assetGUID:X16}");
                    //}
                }
            }

            /*//var rootPackage = packages.First(x => x.m_assetGUID == 0);
            var firstSkin = skins.First();

            using (var graphStream = new MemoryStream(graphBlockTest))
            using (var graphReader = new BinaryReader(graphStream)) {
                var st = GetZach(rootPackage.m_16, graphReader);
                //var st = GetZach(firstSkin.m_24, graphReader);

                bool doMore = ((st.m_8 >> 3) & 1) != 0;
                if (doMore) {
                    long morePtr = graphStream.Position;
                    if ((st.m_guid & 0xFFFF800000000000ul) == 0x4F10000000000000) { // (GuidToAssetRepo(0x8Fu) >> 4) & 0xFFF000000000000ul | 0x4000000000000000ul
                        morePtr += 8; // todo: what data is here
                    } else if ((st.m_9 & 1) != 0) {
                        var moreRead = graphReader.ReadUInt32(); // todo: guid array
                        morePtr += 8 * moreRead + 4;
                    }

                    while (true) {
                        graphStream.Position = morePtr;
                        var more = graphReader.ReadUInt32();
                        var moreZach = GetZach(more, graphReader);

                        if (((more >> 29) & 1) != 0) {
                            Console.WriteLine("end");
                            break;
                        }

                        morePtr += 4;
                    }
                }
            }*/
        }
Ejemplo n.º 3
0
 public record Skin(SkinHeader m_header, SkinAsset6[] m_assets);
Ejemplo n.º 4
0
 public Skin(SkinHeader skinHeader) {
     m_header = skinHeader;
 }