public Stream Seek(int index, out int length, out int extra, out bool patched) { if (index < 0 || index >= Index.Length) { length = extra = 0; patched = false; return(null); } Entry3D e = Index[index]; if (e.Lookup < 0) { length = extra = 0; patched = false; return(null); } length = e.Length & 0x7FFFFFFF; extra = e.Extra; if ((e.Length & (1 << 31)) != 0) { patched = true; Verdata.Seek(e.Lookup); return(Verdata.Stream); } if (e.Length < 0) { length = extra = 0; patched = false; return(null); } if ((_stream?.CanRead != true) || (!_stream.CanSeek)) { _stream = _mulPath == null ? null : new FileStream(_mulPath, FileMode.Open, FileAccess.Read, FileShare.Read); } if (_stream == null) { length = extra = 0; patched = false; return(null); } if (_stream.Length < e.Lookup) { length = extra = 0; patched = false; return(null); } patched = false; _stream.Seek(e.Lookup, SeekOrigin.Begin); return(_stream); }
public Stream Seek(int index, out int length, out int extra, out bool patched) { if (index < 0 || index >= Index.Length) { length = extra = 0; patched = false; return(null); } Entry3D e = Index[index]; if (e.lookup < 0) { length = extra = 0; patched = false; return(null); } length = e.length & 0x7FFFFFFF; extra = e.extra; if ((e.length & (1 << 31)) != 0) { patched = true; Verdata.Seek(e.lookup); return(Verdata.Stream); } if (e.length < 0) { length = extra = 0; patched = false; return(null); } if ((Stream == null) || (!Stream.CanRead) || (!Stream.CanSeek)) { if (MulPath == null) { Stream = null; } else { Stream = new FileStream(MulPath, FileMode.Open, FileAccess.Read, FileShare.Read); } } if (Stream == null) { length = extra = 0; patched = false; return(null); } else if (Stream.Length < e.lookup) { length = extra = 0; patched = false; return(null); } patched = false; Stream.Seek(e.lookup, SeekOrigin.Begin); return(Stream); }