コード例 #1
0
        public RootHandler(BinaryReader stream)
        {
            while (stream.BaseStream.Position < stream.BaseStream.Length)
            {
                int count = stream.ReadInt32();

                ContentFlags contentFlags = (ContentFlags)stream.ReadUInt32();
                LocaleFlags  localeFlags  = (LocaleFlags)stream.ReadUInt32();

                if (localeFlags == LocaleFlags.None)
                {
                    throw new Exception("localeFlags == LocaleFlags.None");
                }

                if (contentFlags != ContentFlags.None && (contentFlags & (ContentFlags.F00000008 | ContentFlags.F00000010 | ContentFlags.LowViolence | ContentFlags.NoCompression | ContentFlags.F20000000)) == 0)
                {
                    throw new Exception("contentFlags != ContentFlags.None");
                }

                RootEntry[] entries       = new RootEntry[count];
                int[]       fileDataIDs   = new int[count];
                int         fileDataIndex = 0;

                for (var i = 0; i < count; ++i)
                {
                    entries[i].LocaleFlags  = localeFlags;
                    entries[i].ContentFlags = contentFlags;

                    fileDataIDs[i] = fileDataIndex + (int)stream.ReadUInt32();
                    fileDataIndex  = fileDataIDs[i] + 1;
                }

                for (var i = 0; i < count; ++i)
                {
                    entries[i].MD5 = stream.Read <MD5Hash>();
                    ulong hash = stream.ReadUInt64();

                    RootData.Add(hash, entries[i]);

                    ulong hash2;
                    int   fileDataID = fileDataIDs[i];

                    if (FileDataStore.TryGetValue(fileDataID, out hash2))
                    {
                        if (hash2 != hash)
                        {
                            Log.Write("CASC: Hash collision for file ID {0}", fileDataID);
                        }

                        continue;
                    }

                    FileDataStore.Add(fileDataID, hash);
                    FileDataStoreReverse.Add(hash, fileDataID);
                }
            }
        }
コード例 #2
0
ファイル: RootHandler.cs プロジェクト: Kruithne/W3DT
        public RootHandler(BinaryReader stream)
        {
            while (stream.BaseStream.Position < stream.BaseStream.Length)
            {
                int count = stream.ReadInt32();

                ContentFlags contentFlags = (ContentFlags)stream.ReadUInt32();
                LocaleFlags localeFlags = (LocaleFlags)stream.ReadUInt32();

                if (localeFlags == LocaleFlags.None)
                    throw new Exception("localeFlags == LocaleFlags.None");

                if (contentFlags != ContentFlags.None && (contentFlags & (ContentFlags.LowViolence | ContentFlags.NoCompression)) == 0)
                    throw new Exception("contentFlags != ContentFlags.None");

                RootEntry[] entries = new RootEntry[count];
                int[] fileDataIDs = new int[count];
                int fileDataIndex = 0;

                for (var i = 0; i < count; ++i)
                {
                    entries[i].LocaleFlags = localeFlags;
                    entries[i].ContentFlags = contentFlags;

                    fileDataIDs[i] = fileDataIndex + (int)stream.ReadUInt32();
                    fileDataIndex = fileDataIDs[i] + 1;
                }

                for (var i = 0; i < count; ++i)
                {
                    entries[i].MD5 = stream.Read<MD5Hash>();
                    ulong hash = stream.ReadUInt64();

                    RootData.Add(hash, entries[i]);

                    ulong hash2;
                    int fileDataID = fileDataIDs[i];

                    if (FileDataStore.TryGetValue(fileDataID, out hash2) && hash2 != hash)
                        Log.Write("CASC: Hash collision for file ID {0}", fileDataID);

                    FileDataStore.Add(fileDataID, hash);
                    FileDataStoreReverse.Add(hash, fileDataID);
                }
            }
        }