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;
        }
Exemple #3
0
        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);
        }
Exemple #4
0
        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>();
 }
Exemple #6
0
 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");
 }
Exemple #7
0
        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();
        }
Exemple #8
0
        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);
            }
        }
Exemple #10
0
        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);
 }
Exemple #14
0
        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;
            }
        }
Exemple #15
0
        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()));
 }