Exemple #1
0
        public FileIndex(string idxFile, string mulFile, int length)
        {
            Index = new Entry3D[length];

            MulPath = mulFile;
            if (!File.Exists(idxFile))
                idxFile = null;
            if (!File.Exists(MulPath))
                MulPath = null;

            if (idxFile != null && MulPath != null)
            {
                using (FileStream index = new FileStream(idxFile, FileMode.Open, FileAccess.Read, FileShare.Read))
                {
                    Stream = new FileStream(MulPath, FileMode.Open, FileAccess.Read, FileShare.Read);

                    int count = (int)(index.Length / 12);
                    IdxLength = index.Length;

                    GCHandle gc = GCHandle.Alloc(Index, GCHandleType.Pinned);
                    byte[] buffer = new byte[index.Length];
                    index.Read(buffer, 0, (int)index.Length);
                    Marshal.Copy(buffer, 0, gc.AddrOfPinnedObject(), (int)Math.Min(IdxLength, length * 12));
                    gc.Free();

                    for (int i = count; i < length; ++i)
                    {
                        Index[i].lookup = -1;
                        Index[i].length = -1;
                        Index[i].extra = -1;
                    }
                }
            }
            else
            {
                Stream = null;
                return;
            }
        }
Exemple #2
0
        private static void LoadUOPIndex()
        {
            UOPFormatHeader formatHeader;

            using (FileStream reader = File.Open( Path.Combine( m_DataPath, "artLegacyMUL.uop" ), FileMode.Open, FileAccess.Read, FileShare.ReadWrite ))
            {
                BinaryReader binaryReader = new BinaryReader( reader );

                formatHeader = reader.ReadStruct<UOPFormatHeader>();

                for (int i = 0; i < formatHeader.NumberOfFiles; i++)
                {
                    string entryName = string.Format( "build/artlegacymul/{0:D8}.tga", i );
                    UInt64 hash = HashFileName( entryName );

                    if (!m_Hashes.ContainsKey( hash ))
                        m_Hashes.Add( hash, i );

                }

                Int64 nextAddress = formatHeader.FirstAddress;

                do
                {
                    UOPBlockHeader blockHeader;

                    reader.Seek( nextAddress, SeekOrigin.Begin );
                    blockHeader = reader.ReadStruct<UOPBlockHeader>();

                    nextAddress = blockHeader.NextAddress;

                    for (int i = 0; i < blockHeader.NumberOfFiles; i++)
                    {
                        UOPFileHeader fileHeader;
                        fileHeader = reader.ReadStruct<UOPFileHeader>();

                        if (fileHeader.DataHeaderAddress == 0)
                            continue;

                        if (m_Hashes.ContainsKey( fileHeader.Hash ))
                        {
                            int index = m_Hashes[fileHeader.Hash];

                            m_Index[index] = new Entry3D( (int) fileHeader.DataHeaderAddress + fileHeader.Length, fileHeader.IsCompressed == 1 ? fileHeader.CompressedSize : fileHeader.DecompressedSize, 0 );
                        }
                    }
                } while (nextAddress > 0);
            }
        }