public PacFileHandling(BinaryReader b) { pacFile = new Pac(); pacStream = b; pacFile.header = ReadHeader(); PacDirParse dirParse = new PacDirParse(pacStream, pacFile); PACHParser pachParse = new PACHParser(); TextureParser textureParse = new TextureParser(); if (pacFile.header.id == "PACH") { //You opened a free floating PACH file~! pacStream.BaseStream.Position = 0; pacFile.container = pachParse.ReadPACHContainer(pacStream.ReadBytes((int)pacStream.BaseStream.Length)); } else if (pacFile.header.id == "EPK8" || pacFile.header.id == "EPAC") { pacFile.dir = dirParse.ReadDir().ToArray(); } else { //probably a texture archive... //pacFile.header.id = "Texture Archive"; pacStream.BaseStream.Position = 0; pacFile.textures = textureParse.ReadTextures(pacStream); } }
public List <PacDir> ReadDir() { var iOffset = 16384; //Start of data chunk var dirList = new List <PacDir>(); var pachParse = new PACHParser(); pacStream.BaseStream.Seek(2048, SeekOrigin.Begin); while (pacStream.BaseStream.Position < (2048 + pacFile.header.listSize)) { var directory = new PacDir(); directory.id = new string(pacStream.ReadChars(4)); if (pacFile.header.id == "EPK8") { directory.nfiles = (int)pacStream.ReadUInt16() / 4; } else { directory.nfiles = (int)pacStream.ReadUInt16() / 3; } pacStream.ReadBytes(6); directory.PacFiles = new PacFile[directory.nfiles]; for (int i = 0; i < directory.nfiles; i++) { directory.PacFiles[i] = ReadPacFile(); directory.PacFiles[i].offset = iOffset; //Get Pach var pos = pacStream.BaseStream.Position; pacStream.BaseStream.Position = directory.PacFiles[i].offset; directory.PacFiles[i].stream = pacStream.ReadBytes(directory.PacFiles[i].size); directory.PacFiles[i].PACHContainer = pachParse.ReadPACHContainer(directory.PacFiles[i].stream); pacStream.BaseStream.Position = pos; //Need to 2048 byte align these chunks iOffset += directory.PacFiles[i].size + ((2048 - (directory.PacFiles[i].size % 2048)) % 2048); } dirList.Add(directory); } return(dirList); }
public List<PacDir> ReadDir() { var iOffset = 16384; //Start of data chunk var dirList = new List<PacDir>(); var pachParse = new PACHParser(); pacStream.BaseStream.Seek(2048, SeekOrigin.Begin); while (pacStream.BaseStream.Position < (2048 + pacFile.header.listSize)) { var directory = new PacDir(); directory.id = new string(pacStream.ReadChars(4)); if (pacFile.header.id == "EPK8") { directory.nfiles = (int)pacStream.ReadUInt16() / 4; } else { directory.nfiles = (int)pacStream.ReadUInt16() / 3; } pacStream.ReadBytes(6); directory.PacFiles = new PacFile[directory.nfiles]; for (int i = 0; i < directory.nfiles; i++) { directory.PacFiles[i] = ReadPacFile(); directory.PacFiles[i].offset = iOffset; //Get Pach var pos = pacStream.BaseStream.Position; pacStream.BaseStream.Position = directory.PacFiles[i].offset; directory.PacFiles[i].stream = pacStream.ReadBytes(directory.PacFiles[i].size); directory.PacFiles[i].PACHContainer = pachParse.ReadPACHContainer(directory.PacFiles[i].stream); pacStream.BaseStream.Position = pos; //Need to 2048 byte align these chunks iOffset += directory.PacFiles[i].size + ((2048 - (directory.PacFiles[i].size % 2048)) % 2048); } dirList.Add(directory); } return dirList; }