protected override FileIndexEntry3D[] ReadEntries() { if (!File.Exists(IndexPath) || !File.Exists(DataPath)) { return(new FileIndexEntry3D[0]); } List <FileIndexEntry3D> entries = new List <FileIndexEntry3D>(); int length = (int)((new FileInfo(IndexPath).Length / 3) / 4); using (FileStream index = new FileStream(IndexPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { BinaryReader bin = new BinaryReader(index); int count = (int)(index.Length / 12); for (int i = 0; i < count && i < length; ++i) { FileIndexEntry3D entry = new FileIndexEntry3D(bin.ReadInt32(), bin.ReadInt32(), bin.ReadInt32()); entries.Add(entry); } for (int i = count; i < length; ++i) { FileIndexEntry3D entry = new FileIndexEntry3D(-1, -1, -1); entries.Add(entry); } } FileIndexEntry5D[] patches = VerData.Patches; for (int i = 0; i < patches.Length; ++i) { FileIndexEntry5D patch = patches[i]; if (patch.file == patchFile && patch.index >= 0 && patch.index < entries.Count) { FileIndexEntry3D entry = entries.ElementAt(patch.index); entry.Lookup = patch.lookup; entry.Length = patch.length | (1 << 31); entry.Extra = patch.extra; } } return(entries.ToArray()); }
public BinaryFileReader Seek(int index, out int length, out int extra, out bool patched) { if (Stream == null) { m_Stream = new FileStream(DataPath, FileMode.Open, FileAccess.Read, FileShare.Read); } if (index < 0 || index >= m_Index.Length) { length = extra = 0; patched = false; return(null); } FileIndexEntry3D e = m_Index[index]; if (e.Lookup < 0) { length = extra = 0; patched = false; return(null); } length = e.Length & 0x7FFFFFFF; extra = e.Extra; if ((e.Length & 0xFF000000) != 0) { patched = true; VerData.Stream.Seek(e.Lookup, SeekOrigin.Begin); return(new BinaryFileReader(new BinaryReader(VerData.Stream))); } else if (m_Stream == null) { length = extra = 0; patched = false; return(null); } patched = false; m_Stream.Position = e.Lookup; return(new BinaryFileReader(new BinaryReader(m_Stream))); }