Beispiel #1
0
        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());
        }
Beispiel #2
0
        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)));
        }