public static void ExportLuaFIles(ProcessReader reader, long assetPoolsAddress, long assetSizesAddress, string gameType) { // Found the game Console.WriteLine("Found supported game: Call of Duty: Black Ops 4"); // Get Base Address for ASLR and Scans long baseAddress = reader.GetBaseAddress(); // Validate by XModel Name if (reader.ReadUInt64(reader.ReadStruct <AssetPool>(baseAddress + assetPoolsAddress + 0x20 * 0x4).PoolPointer) == 0x04647533e968c910) { AssetPool LuaPoolData = reader.ReadStruct <AssetPool>(baseAddress + assetPoolsAddress + 0x20 * 0x67); long address = LuaPoolData.PoolPointer; long endAddress = LuaPoolData.PoolSize * LuaPoolData.AssetSize + address; Directory.CreateDirectory("t8_luafiles"); int filesExported = 0; for (int i = 0; i < LuaPoolData.PoolSize; i++) { var data = reader.ReadStruct <LuaFile>(address + (i * LuaPoolData.AssetSize)); if (data.NullPointer != 0 || data.Hash == 0) { continue; } if (data.Hash >= address && data.Hash <= endAddress) { continue; } filesExported++; var RawData = reader.ReadBytes(data.startLocation, data.DataSize); ulong assetHash = (ulong)data.Hash & 0xFFFFFFFFFFFFFFF; string HashString, fileName; //if (!Program.AssetNameCache.Entries.TryGetValue(assetHash, out HashString)) fileName = String.Format("t8_luafiles\\LuaFile_{0:x}.lua", assetHash); //else //fileName = String.Format("t8_luafiles\\{0}.lua", HashString); if (File.Exists(fileName) && new FileInfo(fileName).Length == data.DataSize) { continue; } File.WriteAllBytes(fileName, RawData); } Console.WriteLine("Exported {0} files", filesExported); } else { Console.WriteLine("Unsupported version of game found"); } }