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); } } }
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; } } }*/ }
public record Skin(SkinHeader m_header, SkinAsset6[] m_assets);
public Skin(SkinHeader skinHeader) { m_header = skinHeader; }