public void LoadEntries(DataFile file, IndexEntry indexEntry) { var list = new List<RootEntry>(); var blteEntry = new BinaryReader(DataFile.LoadBLTEEntry(indexEntry, file.readStream)); while (blteEntry.BaseStream.Position < blteEntry.BaseStream.Length) { var entries = new RootEntry[blteEntry.ReadInt32()]; blteEntry.BaseStream.Position += 4; var locales = (Locales)blteEntry.ReadUInt32(); blteEntry.BaseStream.Position += (entries.Length << 2); for (var i = 0; i < entries.Length; i++) { list.Add(new RootEntry { MD5 = blteEntry.ReadBytes(16), Hash = blteEntry.ReadUInt64(), Locales = locales }); } } entries = list.ToLookup(re => re.Hash); }
public MemoryStream ReadFile(RootEntry[] rootEntries, Locales locales = Locales.enUS) { for (var i = 0; i < rootEntries.Length; i++) { if ((rootEntries[i].Locales & locales) == locales) { var encodingEntry = encodingFile[rootEntries[i].MD5]; if (encodingEntry.Size != 0 && encodingEntry.Keys.Length > 0) { for (var j = 0; j < 0x10; j++) { IndexEntry idxEntry = default(IndexEntry); foreach (var k in encodingEntry.Keys) { if ((idxEntry = idxFiles[j][k.Slice(0, 9)]).Size != 0) { var dataFile = dataFiles[idxEntry.Index]; if (dataFile == null) throw new InvalidOperationException("Invalid data file."); var ret = DataFile.LoadBLTEEntry(idxEntry, dataFile.readStream); if (ret == null) break; return ret; } } if (idxEntry.Size != 0) break; } // CDN indices for (var j = 0x10; j < idxFiles.Count; j++) { IndexEntry idxEntry = default(IndexEntry); foreach (var k in encodingEntry.Keys) { if ((idxEntry = idxFiles[j][k]).Size != 0) return DataFile.LoadBLTEEntry(idxEntry, cdnConfig.DownloadFile(indexFiles[idxEntry.Index], idxEntry)); } if (idxEntry.Size != 0) break; } } } } return null; }