/// <summary> /// Loads all .rgn files in given folder and all its subfolders. /// </summary> /// <param name="path"></param> /// <param name="regions"></param> private void GetRegionsFromFolder(string path, ref Dictionary <int, MabiWorld.Region> regions) { var propPath = Path.Combine(path, @"db\propdb.xml"); if (File.Exists(propPath)) { PropDb.Clear(); PropDb.Load(propPath); } var featurePath = Path.Combine(path, @"features.xml.compiled"); if (File.Exists(featurePath)) { Features.Clear(); Features.Load(featurePath); Features.SelectSetting("USA", false, false); } foreach (var regionFilePath in Directory.EnumerateFiles(path, "*.rgn", SearchOption.AllDirectories)) { using (var regionStream = new FileStream(regionFilePath, FileMode.Open, FileAccess.Read, FileShare.Read)) { var fileName = Path.GetFileNameWithoutExtension(regionFilePath); this.UpdateStatus($"Reading {fileName}..."); var region = MabiWorld.Region.ReadFrom(regionStream); regions[region.Id] = region; var regionDirPath = Path.GetDirectoryName(regionFilePath); for (var i = 0; i < region.AreaFileNames.Count; ++i) { var areaFileName = region.AreaFileNames[i]; var areaFilePath = Path.Combine(regionDirPath, areaFileName + ".area"); using (var areaStream = new FileStream(areaFilePath, FileMode.Open, FileAccess.Read, FileShare.Read)) { var area = Area.ReadFrom(areaStream); area.AreaPlanes.Clear(); region.Areas.Add(area); } } } } }
/// <summary> /// Reads world.trn in packs and all regions that are listed within. /// </summary> /// <param name="path"></param> /// <param name="regions"></param> private void GetRegionsFromPacks(string path, ref Dictionary <int, MabiWorld.Region> regions) { using (var pack = new PackReader(path)) { var worldEntry = pack.GetEntry(@"world\world.trn"); if (worldEntry == null) { this.Invoke((MethodInvoker) delegate { MessageBox.Show(this, $"File 'world.trn' not found in pack folder '{path}'.", "", MessageBoxButtons.OK, MessageBoxIcon.Error); }); return; } var propEntry = pack.GetEntry(@"db\propdb.xml"); if (propEntry != null) { PropDb.Clear(); PropDb.Load(propEntry.GetDataAsStream()); } var featureEntry = pack.GetEntry(@"features.xml.compiled"); if (featureEntry != null) { Features.Clear(); Features.Load(featureEntry.GetDataAsStream()); Features.SelectSetting("USA", false, false); } using (var ms = worldEntry.GetDataAsStream()) using (var trnReader = new XmlTextReader(ms)) { if (!trnReader.ReadToDescendant("regions")) { throw new FormatException("Tag 'regions' not found in world.trn."); } using (var trnRegionsReader = trnReader.ReadSubtree()) { while (trnRegionsReader.ReadToFollowing("region")) { var workDir = trnRegionsReader.GetAttribute("workdir"); var fileName = trnReader.GetAttribute("name"); var regionFilePath = Path.Combine("world", workDir, fileName + ".rgn"); var regionEntry = pack.GetEntry(regionFilePath); if (regionEntry == null) { continue; } using (var regionStream = regionEntry.GetDataAsStream()) { this.UpdateStatus($"Reading {fileName}..."); var region = MabiWorld.Region.ReadFrom(regionStream); regions[region.Id] = region; for (var i = 0; i < region.AreaFileNames.Count; ++i) { var areaFileName = region.AreaFileNames[i]; var areaFilePath = Path.Combine("world", workDir, areaFileName + ".area"); using (var areaStream = pack.GetEntry(areaFilePath).GetDataAsStream()) { var area = Area.ReadFrom(areaStream); area.AreaPlanes.Clear(); region.Areas.Add(area); } } } } } } } }