public static void Run() { var manager = new ArchiveFileManager(LeagueLocations.GetLeaguePath()); var search = new ManifestSearch(manager); manager.Revert(); //var filename1 = "DATA/Items/Icons2D/1053_Vampiric_Scepter.dds"; var filename1 = "DATA/Items/Icons2D/3078_Trinity_Force.dds"; var filename2 = "DATA/Items/Icons2D/3077_Tiamat.dds"; //var filename2 = "DATA/Items/Icons2D/3078_Trinity_Force.dds"; var file1 = manager.ReadFile(filename1); var file2 = manager.ReadFile(filename2); File.WriteAllBytes(@"C:\File 1 Test 1.dds", file1.Uncompress()); File.WriteAllBytes(@"C:\File 2 Test 1.dds", file2.Uncompress()); manager.BeginWriting(); manager.WriteFile(filename1, false, file2); manager.WriteFile(filename2, false, file1); manager.EndWriting(); file1 = manager.ReadFile(filename1); file2 = manager.ReadFile(filename2); File.WriteAllBytes(@"C:\File 1 Test 2.dds", file1.Uncompress()); File.WriteAllBytes(@"C:\File 2 Test 2.dds", file2.Uncompress()); //CompileAssetLists(search); }
public void LoadHashes(ArchiveFileManager manager) { UpdateStatus("Loading League hashes..."); var fileEntries = manager.GetAllFileEntries(); var hashList = new HashSet <uint>(); foreach (var entry in fileEntries) { if (!entry.FullName.Contains(".inibin")) { continue; } var file = manager.ReadFile(entry.FullName).Uncompress(); var inibin = Inibin.DeserializeInibin(file, entry.FullName); foreach (var kvp in inibin.Content) { if (hashList.Contains(kvp.Key)) { continue; } hashList.Add(kvp.Key); } } _hashes = hashList; }
static void ExtractSpellData(ArchiveFileManager manager, string hashSourcesPath) { var data = File.ReadAllText(hashSourcesPath); var hashSourceCollection = JsonConvert.DeserializeObject <LeagueHashSourceCollection>(data); var hashCollection = new LeagueHashCollection(hashSourceCollection); var itemHashes = new HashSet <uint>(); //From Data/Spells/NAME.inibin or Data/Shared/NAME.inibin or Data/Characters/CHARACTER/CHARACTER.inibin (no subdirectories) var itemFiles = manager.GetMatchFileEntries(@"Data(|\/Characters\/([^\/]+)|\/Shared)\/Spells\/([^\/]+)\.inibin"); foreach (var entry in itemFiles) { if (!entry.FullName.Contains(".inibin")) { continue; } if (entry.FullName.Contains(".lua")) { continue; } var file = manager.ReadFile(entry.FullName).Uncompress(); var inibin = Inibin.DeserializeInibin(file, entry.FullName); foreach (var kvp in inibin.Content) { if (itemHashes.Contains(kvp.Key)) { continue; } itemHashes.Add(kvp.Key); } } var mapping = new LeagueHashCollection(); foreach (var hash in itemHashes) { if (!hashCollection.Hashes.ContainsKey(hash)) { continue; } mapping.Hashes.Add(hash, hashCollection.Hashes[hash]); } var result = new LeagueHashCollection(); foreach (var hash in mapping.Hashes) { var sectionFilterer = new SectionFilterer(hash.Value); sectionFilterer.ApplyFilter(new FilterPlaintextSections()); sectionFilterer.ApplyFilter(new FilterDuplicateSections()); sectionFilterer.ApplyFilter(new FilterPlaintextKeys()); result.Hashes.Add(hash.Key, sectionFilterer.CurrentSections); } var conflictResolver = new ConflictResolver(); //result = conflictResolver.ResolveConflicts(result); var itemMappingJson = JsonConvert.SerializeObject(result, Formatting.Indented); File.WriteAllText("spellConversionMapDraft.json", itemMappingJson); }
public void Initialize() { Console.ForegroundColor = ConsoleColor.White; Console.WriteLine("Initializing..."); _menus = new List <Menu>(); var menu = new Menu(); menu.Options.Add(new MenuOption("Backup files", Backup)); menu.Options.Add(new MenuOption("Scramble files", Scramble)); menu.Options.Add(new MenuOption("Restore files (Work changes backwards)", Restore)); menu.Options.Add(new MenuOption("Restore files from backup (Copy backed up files over the current ones)", RestoreBackup)); menu.Options.Add(new MenuOption("Settings", OpenSettings)); menu.Options.Add(new MenuOption("Exit", Exit)); _menus.Add(menu); _settings = new Settings(this); _menus.Add(_settings); menu = new Menu(); menu.Options.Add(new MenuOption("Remove old backup and take a new one", ForceBackup)); menu.Options.Add(new MenuOption("Go back", ReturnToMainMenu)); _menus.Add(menu); _menuId = 0; _message = "Check the project page for updates at https://github.com/MythicManiac/League-of-Legends"; _fileManager = new ArchiveFileManager(_leaguePath); _backupManager = new BackupManager(_leaguePath); }
public ProgramInterface() { _hashes = new HashSet <uint>(); _manager = null; _files = new List <ReleaseManifestFileEntry>(); _draft = new LeagueHashCollection(); _strings = new List <string>(); _patterns = new List <string>(); }
static void TestingAndDebugging(ArchiveFileManager manager) { //ExtractSpellData(manager, "result-420-420.json"); //ConvertDraftToMap("spellConversionMapDraft.json", "spellConversionMap.json"); ////ReformatResult(); //var conversionMap = ConversionMap.Load("ItemConversionMap.json"); //var converter = new InibinConverter(conversionMap); //ExportData(manager, converter); //var mapping = (JObject)JToken.Parse(File.ReadAllText("ItemConversionMap.json")); //Sort(mapping); //File.WriteAllText("ItemConversionMapSorted.json", mapping.ToString()); //ExtractItemData(manager, "result-420-420.json"); }
static void Main(string[] args) { new ProgramInterfaceCLI().ConsoleInterface(); return; var timer = new Stopwatch(); timer.Start(); var arguments = LaunchArguments.Parse(args); var radsPath = GetRadsPath(arguments); var manager = new ArchiveFileManager(radsPath); timer.Stop(); Console.WriteLine("Elapsed time: {0} ms", timer.ElapsedMilliseconds); Console.ReadKey(); }
static void ExportData(ArchiveFileManager manager, InibinConverter converter) { var itemFiles = manager.GetFileEntriesFrom("DATA/Items", true); foreach (var entry in itemFiles) { var saveDirectory = Path.GetDirectoryName(string.Format("Content/{0}", entry.FullName)); if (!Directory.Exists(saveDirectory)) { Directory.CreateDirectory(saveDirectory); } var compressedFile = manager.ReadFile(entry.FullName, true); if (compressedFile == null) { continue; } var file = compressedFile.Uncompress(); if (entry.FullName.Contains(".inibin") || entry.FullName.Contains(".troybin")) { var inibin = Inibin.DeserializeInibin(file, entry.FullName); foreach (var kvp in inibin.Content) { converter.AddByHash(kvp.Key, kvp.Value); } var itemContent = converter.Deserialize(); var itemContentJson = JsonConvert.SerializeObject(itemContent, Formatting.Indented); var savePath = string.Format("Content/{0}", entry.FullName.Replace(".inibin", ".json")); if (entry.FullName.Contains(".troybin")) { savePath = string.Format("Content/{0}", entry.FullName.Replace(".troybin", ".troybin.json")); } File.WriteAllText(savePath, itemContentJson); converter.Clear(); } else { var savePath = string.Format("Content/{0}", entry.FullName); File.WriteAllBytes(savePath, file); } } }
public static void DumpAllFiles(ArchiveFileManager manager) { var files = manager.GetAllFileIndexes(); var basepath = @"C:\LoLDump\"; for (int i = 0; i < files.Length; i++) { var dirname = basepath + files[i].Substring(0, files[i].LastIndexOf('/')).Replace('/', '\\'); var filename = basepath + files[i].Replace('/', '\\'); if (!Directory.Exists(dirname)) { Directory.CreateDirectory(dirname); } var data = manager.ReadFile(files[i]).Uncompress(); File.WriteAllBytes(filename, data); Console.Title = string.Format("{0} / {1}", i + 1, files.Length); } }
static void MatchHashes(ArchiveFileManager manager, string sourcesPath) { var hashForcer = new HashForcer(true); hashForcer.LoadHashes(manager); hashForcer.LoadSources(sourcesPath); hashForcer.Run(Environment.ProcessorCount); hashForcer.WaitFinish(); var result = hashForcer.GetResult(); Console.WriteLine("Done!"); Console.WriteLine("Found {0} sections", result.SectionCount); Console.WriteLine("Found {0} total hashes", result.HashCount); Console.WriteLine("Missing {0} hashes", hashForcer.HashCount - result.HashCount); var resultJson = JsonConvert.SerializeObject(result, Formatting.Indented); File.WriteAllText("result.json", resultJson); Console.WriteLine("Saved findings to a result.json"); }
public void Patch(ArchiveFileManager manager) { _files = new Dictionary <string, ArchiveFile>(); var fileList = _patchList.Values.ToArray(); manager.BeginWriting(); for (int i = 0; i < fileList.Length; i++) { Console.Title = string.Format("Fetching files... {0} / {1}", i + 1, fileList.Length); if (!_files.ContainsKey(fileList[i])) { var file = manager.ReadFile(fileList[i], true); if (file != null) { _files.Add(fileList[i], file); } } } var table = new Table(2); int position = 1; foreach (var kvp in _patchList) { table.AddRow(kvp.Key, kvp.Value); Console.Title = string.Format("Patching files... {0} / {1}", position, _patchList.Count); if (_files.ContainsKey(kvp.Value)) { manager.WriteFile(kvp.Key, true, _files[kvp.Value], true); } position++; } table.Dump(); manager.EndWriting(); }
public static FontConfigFile Load(ArchiveFileManager manager, string locale) { return(Read(manager, string.Format(FONTCONFIG_LOCATION, locale))); }
public void LoadManager(string path) { _manager = new ArchiveFileManager(path); }
internal Archive(AssetManager manager, AssetLoader loader) : base(manager, "Dark Souls archive - " + loader.Name) { FileManager = new ArchiveFileManager(this); var reader = loader.Reader; var path = loader.Name; var context = loader.FileManager; string magic = reader.ReadString(4, Encoding.ASCII); string extension = System.IO.Path.GetExtension(path); // Switch to the headers file if we got a contents file. if (magic == ContentsMagicBDF3 || magic == ContentsMagicBDF4) { string headersPathBase = RemoveSuffix(path, ContentsExtensionEnd); Stream headersStream = OpenOtherFile(headersPathBase, context, HeadersExtensionEnd, HeadersExtension5End); DataStream = reader.BaseStream; DataReader = reader; reader = BigEndianBinaryReader.Create(IsBigEndian ? ByteOrder.BigEndian : ByteOrder.LittleEndian, headersStream); magic = reader.ReadString(4, Encoding.ASCII); } if (magic == PackageMagicBND4) { IsBigEndian = true; IsDarkSoulsII = true; } // Get the variant. switch (magic) { case ContentsMagicBDF3: case HeadersMagicBHD5: Variant = ArchiveVariant.V5; break; case HeadersMagicBHF3: case PackageMagicBND3: Variant = ArchiveVariant.V3; break; case ContentsMagicBDF4: case HeadersMagicBHF4: case PackageMagicBND4: Variant = ArchiveVariant.V4; break; default: throw new NotImplementedException(); } if (DataReader == null) { if (magic == PackageMagicBND4 || magic == PackageMagicBND3) { IsHeaderlessPackage = true; DataStream = reader.BaseStream; DataReader = reader; if (IsBigEndian) { reader = new BigEndianBinaryReader(reader.BaseStream); } } else if (magic == HeadersMagicBHD5 || magic == HeadersMagicBHF4 || magic == HeadersMagicBHF3) { string contentsPathBase = RemoveSuffix(path, HeadersExtensionEnd, HeadersExtension5End); DataStream = OpenOtherFile(contentsPathBase, context, ContentsExtensionEnd); DataReader = new BinaryReader(DataStream); if (IsBigEndian) { reader = new BigEndianBinaryReader(reader.BaseStream); } } else { throw new NotImplementedException(); } } try { switch (Variant) { case ArchiveVariant.V3: { Id = reader.ReadStringz(8, Encoding.ASCII); int version = reader.ReadInt32(); if (version != 0x74 && version != 0x54) { throw new InvalidDataException(); } int recordCount = reader.ReadInt32(); int totalHeaderSize = reader.ReadInt32(); // Either zero or the unaligned end of the last record's name before the first record's data. reader.RequireZeroes(8); for (int index = 0; index < recordCount; index++) { new ArchiveRecord(this, index, reader, -1); } break; } case ArchiveVariant.V4: { IsDarkSoulsII = true; int byteOrder = reader.ReadInt32(); if (byteOrder == 257) { IsBigEndian = true; reader = new BigEndianBinaryReader(reader.BaseStream); } else if (byteOrder != 0x01010000) { throw new Exception(); } reader.Require(0x10000); int recordCount = reader.ReadInt32(); long recordOffset = reader.ReadInt64(); if (recordOffset != 0x40) { throw new Exception(); } Id = reader.ReadString(8, Encoding.ASCII); int recordHeaderSize = checked ((int)reader.ReadInt64()); if (recordHeaderSize != 0x1C && recordHeaderSize != 0x24) { throw new Exception(); } long u2 = reader.ReadInt64(); // 0 or end of the name strings int u1 = reader.ReadInt16(); // 0x1C or 0x12E? reader.RequireZeroes(14); for (int index = 0; index < recordCount; index++) { new ArchiveRecord(this, index, reader, recordHeaderSize); } break; } case ArchiveVariant.V5: reader.Require(0xFF); reader.Require(1); uint totalFileSize = reader.ReadUInt32(); int binCount = reader.ReadInt32(); reader.Require(0x18); // Groups offset int[] binInfo = reader.ReadArrayInt32(binCount * 2); for (int index = 0, totalRecordIndex = 0; index < binCount; index++) { reader.BaseStream.Position = binInfo[index * 2 + 1]; int count = binInfo[index * 2 + 0]; // Each record in a group belongs to the same "bin"; for (int recordIndex = 0; recordIndex < count; recordIndex++) { new ArchiveRecord(this, totalRecordIndex, reader, -1); } } break; default: throw new NotImplementedException(Variant + " is not implemented, durr"); } } finally { if (!IsHeaderlessPackage) { reader.Dispose(); } } SortChildrenRecursively(); foreach (var record in Records) { RecordsById[record.Id] = record; RecordsByPath[record.PathName] = record; } }
internal Archive(AssetManager manager, AssetLoader loader) : base(manager, "Dark Souls archive - " + loader.Name) { FileManager = new ArchiveFileManager(this); var reader = loader.Reader; var path = loader.Name; var context = loader.FileManager; string magic = reader.ReadString(4, Encoding.ASCII); string extension = System.IO.Path.GetExtension(path); // Switch to the headers file if we got a contents file. if (magic == ContentsMagicBDF3 || magic == ContentsMagicBDF4) { string headersPathBase = RemoveSuffix(path, ContentsExtensionEnd); Stream headersStream = OpenOtherFile(headersPathBase, context, HeadersExtensionEnd, HeadersExtension5End); DataStream = reader.BaseStream; DataReader = reader; reader = BigEndianBinaryReader.Create(IsBigEndian ? ByteOrder.BigEndian : ByteOrder.LittleEndian, headersStream); magic = reader.ReadString(4, Encoding.ASCII); } if (magic == PackageMagicBND4) { IsBigEndian = true; IsDarkSoulsII = true; } // Get the variant. switch (magic) { case ContentsMagicBDF3: case HeadersMagicBHD5: Variant = ArchiveVariant.V5; break; case HeadersMagicBHF3: case PackageMagicBND3: Variant = ArchiveVariant.V3; break; case ContentsMagicBDF4: case HeadersMagicBHF4: case PackageMagicBND4: Variant = ArchiveVariant.V4; break; default: throw new NotImplementedException(); } if (DataReader == null) { if (magic == PackageMagicBND4 || magic == PackageMagicBND3) { IsHeaderlessPackage = true; DataStream = reader.BaseStream; DataReader = reader; if (IsBigEndian) reader = new BigEndianBinaryReader(reader.BaseStream); } else if (magic == HeadersMagicBHD5 || magic == HeadersMagicBHF4 || magic == HeadersMagicBHF3) { string contentsPathBase = RemoveSuffix(path, HeadersExtensionEnd, HeadersExtension5End); DataStream = OpenOtherFile(contentsPathBase, context, ContentsExtensionEnd); DataReader = new BinaryReader(DataStream); if (IsBigEndian) reader = new BigEndianBinaryReader(reader.BaseStream); } else throw new NotImplementedException(); } try { switch (Variant) { case ArchiveVariant.V3: { Id = reader.ReadStringz(8, Encoding.ASCII); int version = reader.ReadInt32(); if (version != 0x74 && version != 0x54) throw new InvalidDataException(); int recordCount = reader.ReadInt32(); int totalHeaderSize = reader.ReadInt32(); // Either zero or the unaligned end of the last record's name before the first record's data. reader.RequireZeroes(8); for (int index = 0; index < recordCount; index++) new ArchiveRecord(this, index, reader, -1); break; } case ArchiveVariant.V4: { IsDarkSoulsII = true; int byteOrder = reader.ReadInt32(); if (byteOrder == 257) { IsBigEndian = true; reader = new BigEndianBinaryReader(reader.BaseStream); } else if (byteOrder != 0x01010000) throw new Exception(); reader.Require(0x10000); int recordCount = reader.ReadInt32(); long recordOffset = reader.ReadInt64(); if (recordOffset != 0x40) throw new Exception(); Id = reader.ReadString(8, Encoding.ASCII); int recordHeaderSize = checked((int)reader.ReadInt64()); if (recordHeaderSize != 0x1C && recordHeaderSize != 0x24) throw new Exception(); long u2 = reader.ReadInt64(); // 0 or end of the name strings int u1 = reader.ReadInt16(); // 0x1C or 0x12E? reader.RequireZeroes(14); for (int index = 0; index < recordCount; index++) new ArchiveRecord(this, index, reader, recordHeaderSize); break; } case ArchiveVariant.V5: reader.Require(0xFF); reader.Require(1); uint totalFileSize = reader.ReadUInt32(); int binCount = reader.ReadInt32(); reader.Require(0x18); // Groups offset int[] binInfo = reader.ReadArrayInt32(binCount * 2); for (int index = 0, totalRecordIndex = 0; index < binCount; index++) { reader.BaseStream.Position = binInfo[index * 2 + 1]; int count = binInfo[index * 2 + 0]; // Each record in a group belongs to the same "bin"; for (int recordIndex = 0; recordIndex < count; recordIndex++) new ArchiveRecord(this, totalRecordIndex, reader, -1); } break; default: throw new NotImplementedException(Variant + " is not implemented, durr"); } } finally { if (!IsHeaderlessPackage) reader.Dispose(); } SortChildrenRecursively(); foreach (var record in Records) { RecordsById[record.Id] = record; RecordsByPath[record.PathName] = record; } }
public InibinExporter(ArchiveFileManager manager, string outputDirectory = "ExportOutput") { _manager = manager; _files = manager.GetAllFileEntries(); OutputDirectory = outputDirectory; }
public static FontConfigFile Read(ArchiveFileManager manager, string archiveFilePath) { return(Read(manager.ReadFile(archiveFilePath).Uncompress())); }