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); }
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); }
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); }
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; } }
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); }
/// <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); }
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); }
/// <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); }