Ejemplo n.º 1
0
        /// <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);
                        }
                    }
                }
            }
        }
Ejemplo n.º 2
0
        /// <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);
                                        }
                                    }
                                }
                            }
                        }
                    }
            }
        }