示例#1
0
文件: WDT.cs 项目: elroldor/WCell
        public WMORoot GetOrReadWMO(MapObjectDefinition definition)
        {
            WMORoot wmo;

            if (!WMOs.TryGetValue(definition.FilePath, out wmo))
            {
                WMOs.Add(definition.FilePath, wmo = WMOReader.ReadWMO(WCellTerrainSettings.GetDefaultMPQFinder(), definition));
            }
            return(wmo);
        }
示例#2
0
文件: WDT.cs 项目: elroldor/WCell
        public M2 GetOrReadM2(MapDoodadDefinition definition)
        {
            M2 m2;

            if (!M2s.TryGetValue(definition.FilePath, out m2))
            {
                M2s.Add(definition.FilePath, m2 = M2Reader.ReadM2(WCellTerrainSettings.GetDefaultMPQFinder(), definition));
            }
            return(m2);
        }
示例#3
0
 public static bool TryGetADTPath(MapId mapId, int x, int y, out string filePath, out MpqLibrarian mpqFinder)
 {
     mpqFinder = WCellTerrainSettings.GetDefaultMPQFinder();
     filePath  = GetFilename(mapId, x, y);
     if (!mpqFinder.FileExists(filePath))
     {
         return(false);
     }
     return(true);
 }
示例#4
0
文件: WDT.cs 项目: elroldor/WCell
        public override void FillTileProfile()
        {
            var mpqFinder = WCellTerrainSettings.GetDefaultMPQFinder();
            var filePath  = GetMapMPQDir(MapId);
            var fileList  = mpqFinder.GetAllFiles(Path.Combine(filePath, "*.adt"));

            foreach (var file in fileList)
            {
                var fileName = Path.GetFileNameWithoutExtension(file);
                if (string.IsNullOrEmpty(fileName))
                {
                    continue;
                }

                var parts = fileName.Split(new [] { '_' });
                var y     = int.Parse(parts[1]);
                var x     = int.Parse(parts[2]);

                TileProfile[x, y] = true;
            }
        }
示例#5
0
        public void InitImage(MapId mapId, int dx = 5, int margin = 1)
        {
            var map       = new bool[TerrainConstants.TilesPerMapSide, TerrainConstants.TilesPerMapSide];
            var mpqFinder = WCellTerrainSettings.GetDefaultMPQFinder();

            for (var tileX = TerrainConstants.TilesPerMapSide - 1; tileX >= 0; --tileX)
            {
                for (var tileY = TerrainConstants.TilesPerMapSide - 1; tileY >= 0; --tileY)
                {
                    var fname   = ADTReader.GetFilename(mapId, tileX, tileY);
                    var archive = mpqFinder.GetArchive(fname);
                    if (archive != null && archive.GetFileSize(fname) > 0)
                    {
                        // X is up
                        // Y is left
                        map[tileY, tileX] = true;
                    }
                }
            }
            InitImage(map, dx, margin);
        }
示例#6
0
        /// <summary>
        /// Returns the MpqArchive that contains the given map
        /// </summary>
        public static MpqArchive GetArchive(MapId mapId)
        {
            // find the archive
            var        mpqFinder = WCellTerrainSettings.GetDefaultMPQFinder();
            MpqArchive archive   = null;

            for (var tileX = 0; tileX < TerrainConstants.TilesPerMapSide && archive == null; tileX++)
            {
                for (var tileY = 0; tileY < TerrainConstants.TilesPerMapSide && archive == null; tileY++)
                {
                    var fname = GetFilename(mapId, tileX, tileY);
                    if (!mpqFinder.FileExists(fname))
                    {
                        continue;
                    }

                    archive = mpqFinder.GetArchive(fname);
                }
            }
            return(archive);
        }
示例#7
0
        public static WDT ReadWDT(MapInfo entry)
        {
            var dir         = entry.InternalName;
            var wdtDir      = Path.Combine(baseDir, dir);
            var wdtName     = dir;
            var wdtFilePath = Path.Combine(wdtDir, wdtName + Extension);
            var finder      = WCellTerrainSettings.GetDefaultMPQFinder();

            if (!finder.FileExists(wdtFilePath))
            {
                return(null);
            }

            var wdt = new WDT(entry.Id)
            {
                Entry    = entry,
                Name     = wdtName,
                Filename = wdtDir
            };

            using (var fileReader = new BinaryReader(finder.OpenFile(wdtFilePath)))
            {
                ReadMVER(fileReader, wdt);
                ReadMPHD(fileReader, wdt);
                ReadMAIN(fileReader, wdt);

                if (wdt.Header.IsWMOMap)
                {
                    // No terrain, the map is a "global" wmo
                    // MWMO and MODF chunks follow
                    ReadMWMO(fileReader, wdt);
                    ReadMODF(fileReader, wdt);
                }
            }

            return(wdt);
        }
示例#8
0
        /// <summary>
        ///  Extracts all heightfields of the given map
        /// </summary>
        public static bool ExtractHeightfield(MapId mapId)
        {
            var name = TileIdentifier.GetName(mapId);

            if (string.IsNullOrEmpty(name))
            {
                Console.WriteLine(@"No ADT for map {0}.", mapId);
                return(false);
            }

            // get started
            var mpqFinder = WCellTerrainSettings.GetDefaultMPQFinder();


            // Create WDT
            var wdt = new WDT(mapId);

            var startTime = DateTime.Now;

            // compute total size
            Console.Write(@"Estimating workload... ");
            var totalAmount = 0;
            var archives    = new HashSet <string>();

            for (var tileX = 0; tileX < TerrainConstants.TilesPerMapSide; tileX++)
            {
                for (var tileY = 0; tileY < TerrainConstants.TilesPerMapSide; tileY++)
                {
                    var fname   = ADTReader.GetFilename(mapId, tileX, tileY);
                    var archive = mpqFinder.GetArchive(fname);
                    if (archive != null && archive.GetFileSize(fname) > 0)
                    {
                        //totalSize += archive.GetFileSize(fname);
                        ++totalAmount;
                        archives.Add(archive.Path);
                    }
                }
            }
            Console.WriteLine(@"Done - Found {0} tiles in {1} files.", totalAmount, archives.Count);

            // Get cooking:
            Console.WriteLine();
            Console.WriteLine("Extracting...");

            // Load all ADTs and write them to file
            var processedTiles = 0;

            for (var tileX = 0; tileX < TerrainConstants.TilesPerMapSide; tileX++)
            {
                for (var tileY = 0; tileY < TerrainConstants.TilesPerMapSide; tileY++)
                {
                    try
                    {
                        var  fname = ADTReader.GetFilename(mapId, tileX, tileY);
                        long fsize;
                        var  archive = mpqFinder.GetArchive(fname);
                        if (archive != null && (fsize = archive.GetFileSize(fname)) > 0)
                        {
                            //processedSize += fsize;

                            var adt = ADTReader.ReadADT(wdt, tileX, tileY, false);
                            Console.Write(@"Tile ({0}, {1}) in Map {2} has been read from {3}. Writing... ",
                                          tileX, tileY, mapId, Path.GetFileName(archive.Path));

                            // write to file
                            WriteHeightfield(adt);

                            // stats
                            ++processedTiles;
                            var timePassed    = DateTime.Now - startTime;
                            var timePerTile   = timePassed.Ticks / processedTiles;
                            var progress      = processedTiles / (float)totalAmount;
                            var timeRemaining = new TimeSpan((totalAmount - processedTiles) * timePerTile);
                            Console.WriteLine(@"Done. [{0}/{1} {2:F2}% - {3} (Remaining: {4})]",
                                              processedTiles,
                                              totalAmount,
                                              100 * progress,
                                              timePassed.Format(),
                                              timeRemaining.Format());
                            continue;
                        }
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine();
                        LogUtil.ErrorException(e, @"Extraction FAILED: Tile ({0}, {1}) in Map {2} could not be loaded", tileX, tileY, mapId);
                        return(false);
                    }
                }
            }
            return(true);
        }