private void Convert() { if (arguments[0].EndsWith(".ymap.xml") || arguments[0].EndsWith(".ytyp.xml") || arguments[0].EndsWith(".ymt.xml")) { ConvertXmlToResource(); } else if (arguments[0].EndsWith(".ymap") || arguments[0].EndsWith(".ytyp") || arguments[0].EndsWith(".ymt")) { if (ResourceFile_GTA5_pc.IsResourceFile(arguments[0])) { ConvertResourceToXml(); } else if (PsoFile.IsPSO(arguments[0])) { ConvertPsoToXml(); } else { ConvertRbfToXml(); } } else if (arguments[0].EndsWith(".ymf")) { ConvertPsoToXml(); } else { Console.WriteLine("No supported file name specified."); Console.ReadLine(); } }
public static HashSet <int> GetAllHashesFromPsoMetas(string gameDirectoryName) { var hashes = new HashSet <int>(); ArchiveUtilities.ForEachBinaryFile(gameDirectoryName, (fullFileName, file, encryption) => { if (file.Name.EndsWith(".ymf") || file.Name.EndsWith(".ymt")) { var stream = new MemoryStream(); file.Export(stream); var buf = new byte[stream.Length]; stream.Position = 0; stream.Read(buf, 0, buf.Length); if (file.IsEncrypted) { if (encryption == RageArchiveEncryption7.AES) { buf = AesEncryption.DecryptData(buf, GTA5Constants.PC_AES_KEY); } else { var qq = GTA5Hash.CalculateHash(file.Name); var gg = (qq + (uint)file.UncompressedSize + (101 - 40)) % 0x65; buf = GTA5Crypto.Decrypt(buf, GTA5Constants.PC_NG_KEYS[gg]); } } if (file.IsCompressed) { var def = new DeflateStream(new MemoryStream(buf), CompressionMode.Decompress); var bufnew = new byte[file.UncompressedSize]; def.Read(bufnew, 0, (int)file.UncompressedSize); buf = bufnew; } var cleanStream = new MemoryStream(buf); if (PsoFile.IsPSO(cleanStream)) { PsoFile pso = new PsoFile(); pso.Load(cleanStream); foreach (var info in pso.DefinitionSection.EntriesIdx) { hashes.Add(info.NameHash); } foreach (var info in pso.DefinitionSection.Entries) { if (info is PsoStructureInfo) { var structureInfo = (PsoStructureInfo)info; foreach (var entryInfo in structureInfo.Entries) { hashes.Add(entryInfo.EntryNameHash); } } if (info is PsoEnumInfo) { var enumInfo = (PsoEnumInfo)info; foreach (var entryInfo in enumInfo.Entries) { hashes.Add(entryInfo.EntryNameHash); } } } Console.WriteLine(file.Name); } } }); return(hashes); }
public static Tuple <Dictionary <int, PsoStructureInfo>, Dictionary <int, PsoEnumInfo> > GetAllStructureInfoAndEnumInfoFromPsoMetas(string gameDirectoryName) { Dictionary <int, PsoStructureInfo> structureInfos = new Dictionary <int, PsoStructureInfo>(); Dictionary <int, PsoEnumInfo> enumInfos = new Dictionary <int, PsoEnumInfo>(); ArchiveUtilities.ForEachBinaryFile(gameDirectoryName, (fullFileName, file, encryption) => { if (file.Name.EndsWith(".ymf") || file.Name.EndsWith(".ymt")) { var stream = new MemoryStream(); file.Export(stream); var buf = new byte[stream.Length]; stream.Position = 0; stream.Read(buf, 0, buf.Length); if (file.IsEncrypted) { if (encryption == RageArchiveEncryption7.AES) { buf = AesEncryption.DecryptData(buf, GTA5Constants.PC_AES_KEY); } else { var indexKey = GTA5Crypto.GetKeyIndex(file.Name, (uint)file.UncompressedSize); buf = GTA5Crypto.Decrypt(buf, GTA5Constants.PC_NG_KEYS[indexKey]); } } if (file.IsCompressed) { var def = new DeflateStream(new MemoryStream(buf), CompressionMode.Decompress); var bufnew = new byte[file.UncompressedSize]; def.Read(bufnew, 0, (int)file.UncompressedSize); buf = bufnew; } var cleanStream = new MemoryStream(buf); if (PsoFile.IsPSO(cleanStream)) { PsoFile pso = new PsoFile(); pso.Load(cleanStream); for (int i = 0; i < pso.DefinitionSection.Count; i++) { var id = pso.DefinitionSection.EntriesIdx[i]; var info = pso.DefinitionSection.Entries[i]; if (info is PsoStructureInfo structureInfo) { structureInfos.TryAdd(id.NameHash, structureInfo); } if (info is PsoEnumInfo enumInfo) { enumInfos.TryAdd(id.NameHash, enumInfo); } } Console.WriteLine(file.Name); } } }); return(new Tuple <Dictionary <int, PsoStructureInfo>, Dictionary <int, PsoEnumInfo> >(structureInfos, enumInfos)); }