public static void Initialize() { if (_initialized) { return; } _cache = new Dictionary <int, string>(1000); _gameobjectDisplayInfo = MpqManager.GetDB6("GameobjectDisplayInfo"); _cachedGameobjectDisplayInfoRows = _gameobjectDisplayInfo.Rows.ToArray(); _cachedGameobjectDisplayInfoRecords = new GameobjectDisplayInfoEntry.GameobjectDisplayInfoDb2Record[_cachedGameobjectDisplayInfoRows.Length]; for (int i = 0; i < _cachedGameobjectDisplayInfoRows.Length - 1; i++) { _cachedGameobjectDisplayInfoRecords[i] = DB6Reader.ByteToType <GameobjectDisplayInfoEntry.GameobjectDisplayInfoDb2Record>(_cachedGameobjectDisplayInfoRows[i]); } /*_fileData = MpqManager.GetDBC("FileData"); * _filaDataEntries = _fileData.Records.Select(r => new FileDataEntry(r));*/ // FileData no longer requires, we can open files directly from their FileDataId, but need a CascLib update first. _myConn = new MySqlConnection("server=127.0.0.1; user id=tnb; password=tnb006; database=offydump;"); _myConn.Open(); /*List<MapEntry> titi = PhaseHelper.GetAllMaps(); * foreach (MapEntry e in titi) * { * string sqlcode = "INSERT INTO Maps VALUES (" + e.Id + ",'" + e.InternalName.Replace("'", "\\'") + "','" + e.Name.Replace("'", "\\'") + "',"; * sqlcode += (int)e.InstanceType + "," + (int)e.MapType + "," + e.PhaseParent + "," + e.Flags + ");"; * System.Console.WriteLine(sqlcode); * var cmd = new MySqlCommand(sqlcode, _myConn); * cmd.ExecuteNonQuery(); * }*/ _initialized = true; }
public static void Initialize() { if (_initialized) { return; } //MpqManager.InitializeDBC(); _taxiNodes = MpqManager.GetDB6("TaxiNodes"); _taxiPath = MpqManager.GetDB6("TaxiPath"); _cachedTaxiNodesRows = _taxiNodes.Rows.ToArray(); _cachedTaxiPathRows = _taxiNodes.Rows.ToArray(); _cachedTaxiPathRecords = new TaxiPath.TaxiPathDb2Record[_cachedTaxiPathRows.Length]; for (int i = 0; i < _cachedTaxiPathRows.Length - 1; i++) { _cachedTaxiPathRecords[i] = DB6Reader.ByteToType <TaxiPath.TaxiPathDb2Record>(_cachedTaxiPathRows[i]); } _cachedTaxiNodesRecords = new TaxiNode.TaxiNodesDb2Record[_cachedTaxiNodesRows.Length]; for (int i = 0; i < _cachedTaxiNodesRows.Length - 1; i++) { _cachedTaxiNodesRecords[i] = DB6Reader.ByteToType <TaxiNode.TaxiNodesDb2Record>(_cachedTaxiNodesRows[i]); } _initialized = true; }
static void ExtractCameraFiles() { Console.WriteLine("Extracting Camera files..."); var stream = cascHandler.ReadFile("DBFilesClient\\CinematicCamera.db2"); if (stream == null) { Console.WriteLine("Unable to open file DBFilesClient\\CinematicCamera.db2s in the archive"); return; } Dictionary <uint, CinematicCameraRecord> cinematicCameraStorage = DB6Reader.Read <CinematicCameraRecord>(stream, DB6Metas.CinematicCameraMeta); if (cinematicCameraStorage == null) { Console.WriteLine("Invalid CinematicCamera.db2 file format. Camera extract aborted.\n"); return; } List <uint> CameraFileNames = new List <uint>(); // get camera file list from DB2 foreach (var record in cinematicCameraStorage.Values) { CameraFileNames.Add(record.ModelFileDataID); } Console.WriteLine($"Done! ({CameraFileNames.Count} CinematicCameras loaded)\n"); string path = $"{baseDirectory}/cameras"; CreateDirectory(path); // extract M2s uint count = 0; foreach (int cameraFileId in CameraFileNames) { var cameraStream = cascHandler.ReadFile(cameraFileId); if (cameraStream != null) { string file = path + $"/File{cameraFileId:X8}.xxx"; if (!File.Exists(file)) { FileWriter.WriteFile(cameraStream, file); ++count; } } else { Console.WriteLine($"Unable to open file {$"File{cameraFileId:X8}.xxx"} in the archive: \n"); } } Console.WriteLine($"Extracted {count} Camera files."); }
public static void Initialize() { if (_initialized) { return; } _map = MpqManager.GetDB6("Map"); _entries = _map.Rows.Select(DB6Reader.ByteToType <WoWMap.MapDbcRecord>); _initialized = true; }
static void ExtractVMaps() { Console.WriteLine("Extracting Vmap files..."); CreateDirectory(wmoDirectory); File.Delete(wmoDirectory + "dir_bin"); // Extract models, listed in GameObjectDisplayInfo.dbc VmapFile.ExtractGameobjectModels(); Console.WriteLine("Read Map.dbc file... "); if (mapStorage == null) { var stream = cascHandler.ReadFile("DBFilesClient\\Map.db2"); if (stream == null) { Console.WriteLine("Unable to open file DBFilesClient\\Map.db2 in the archive\n"); return; } mapStorage = DB6Reader.Read <MapRecord>(stream, DB6Metas.MapMeta); } if (mapStorage == null) { Console.WriteLine("Fatal error: Invalid Map.db2 file format!\n"); return; } VmapFile.ParsMapFiles(); Console.WriteLine("Extracting Done!"); Console.WriteLine("Converting Vmap files..."); CreateDirectory("./vmaps"); TileAssembler ta = new TileAssembler(wmoDirectory, "vmaps"); if (!ta.convertWorld2()) { return; } Console.WriteLine("Converting Done!"); }
public static void ParsMapFiles() { var stream = Program.cascHandler.ReadFile("DBFilesClient\\Map.db2"); if (stream == null) { Console.WriteLine("Unable to open file DBFilesClient\\Map.db2 in the archive\n"); return; } var mapStorage = DB6Reader.Read <MapRecord>(stream, DB6Metas.MapMeta); if (mapStorage == null) { Console.WriteLine("Fatal error: Invalid Map.db2 file format!\n"); return; } foreach (var record in mapStorage.Values) { WDTFile WDT = new WDTFile(); if (WDT.init($"World\\Maps\\{record.Directory}\\{record.Directory}.wdt", record.Id)) { Console.Write($"Processing Map {record.Id}\n"); for (uint x = 0; x < 64; ++x) { for (uint y = 0; y < 64; ++y) { ADTFile ADT = new ADTFile(); ADT.init($"World\\Maps\\{record.Directory}\\{record.Directory}_{x}_{y}_obj0.adt", record.Id, x, y); } // draw progress bar Console.Write($"Processing........................{(100 * (x + 1)) / 64}%\r"); } Console.Write("\n"); } } }
public static void ExtractGameobjectModels() { Console.WriteLine("Extracting GameObject models..."); var stream = Program.cascHandler.ReadFile("DBFilesClient\\GameObjectDisplayInfo.db2"); if (stream == null) { Console.WriteLine("Unable to open file DBFilesClient\\Map.db2 in the archive\n"); return; } var GameObjectDisplayInfoStorage = DB6Reader.Read <GameObjectDisplayInfoRecord>(stream, DB6Metas.GameObjectDisplayInfoMeta); if (GameObjectDisplayInfoStorage == null) { Console.WriteLine("Fatal error: Invalid GameObjectDisplayInfo.db2 file format!\n"); return; } string modelListPath = Program.wmoDirectory + "temp_gameobject_models"; using (BinaryWriter binaryWriter = new BinaryWriter(File.Open(modelListPath, FileMode.Create, FileAccess.Write))) { foreach (var record in GameObjectDisplayInfoStorage.Values) { uint fileId = record.FileDataID; if (fileId == 0) { continue; } bool result = false; string header; if (!GetHeaderMagic(fileId, out header)) { continue; } string fileName = $"File{fileId:X8}.xxx"; if (header == "REVM") { result = ExtractSingleWmo(fileId); } else if (header == "MD20" || header == "MD21") { result = ExtractSingleModel(fileId); } //else //ASSERT(false, "%s header: %d - %c%c%c%c", fileId, header, (header >> 24) & 0xFF, (header >> 16) & 0xFF, (header >> 8) & 0xFF, header & 0xFF); if (result) { binaryWriter.Write(record.Id); binaryWriter.Write(fileName.Length); binaryWriter.WriteString(fileName); } } } Console.WriteLine("Done!"); }
public override IEnumerable <string> GetFileNames() { Index++; DB6Reader mid = new DB6Reader(Path.Combine(BruteforceConfig.DB2Folder, "ManifestInterfaceData.db2")); foreach (var row in mid) { yield return(string.Format("{0}{1}", row.Value.GetField <string>(0), row.Value.GetField <string>(1))); } Index++; DB6Reader ls = new DB6Reader(Path.Combine(BruteforceConfig.DB2Folder, "LightSkybox.db2")); foreach (var row in ls) { if (row.Value.GetField <string>(0) != string.Empty) { yield return(string.Format("{0}", row.Value.GetField <string>(0))); } } Index++; DB6Reader maps = new DB6Reader(Path.Combine(BruteforceConfig.DB2Folder, "Map.db2")); foreach (var map in maps) { string folder = map.Value.GetField <string>(0); yield return(string.Format("World\\Maps\\{0}\\{0}.tex", folder)); yield return(string.Format("World\\Maps\\{0}\\{0}.wdl", folder)); yield return(string.Format("World\\Maps\\{0}\\{0}.wdt", folder)); yield return(string.Format("World\\Maps\\{0}\\{0}_occ.wdt", folder)); yield return(string.Format("World\\Maps\\{0}\\{0}_lgt.wdt", folder)); for (int i = 0; i < 64; ++i) { for (int j = 0; j < 64; ++j) { yield return(string.Format("World\\Maps\\{0}\\{0}_{1}_{2}.adt", folder, i, j)); yield return(string.Format("World\\Maps\\{0}\\{0}_{1}_{2}_lod.adt", folder, i, j)); yield return(string.Format("World\\Maps\\{0}\\{0}_{1}_{2}_obj0.adt", folder, i, j)); yield return(string.Format("World\\Maps\\{0}\\{0}_{1}_{2}_obj1.adt", folder, i, j)); yield return(string.Format("World\\Maps\\{0}\\{0}_{1}_{2}_tex0.adt", folder, i, j)); yield return(string.Format("World\\Maps\\{0}\\{0}_{1}_{2}_tex1.adt", folder, i, j)); yield return(string.Format("World\\maptextures\\{0}\\{0}_{1:D2}_{2:D2}.blp", folder, i, j)); yield return(string.Format("World\\maptextures\\{0}\\{0}_{1:D2}_{2:D2}_n.blp", folder, i, j)); yield return(string.Format("World\\Minimaps\\{0}\\map{1:D2}_{2:D2}.blp", folder, i, j)); yield return(string.Format("World\\Minimaps\\{0}\\noLiquid_map{1:D2}_{2:D2}.blp", folder, i, j)); } } } Index++; //Interface\WorldMap\%s\%s%d.blp WorldMapArea[3], WorldMapArea[3], 1-12 //Interface\WorldMap\%s\%s%d_%d.blp WorldMapArea[3], WorldMapArea[3], floor, 1-12 DB6Reader wmas = new DB6Reader(Path.Combine(BruteforceConfig.DB2Folder, "WorldMapArea.db2")); DB6Reader wmos = new DB6Reader(Path.Combine(BruteforceConfig.DB2Folder, "WorldMapOverlay.db2")); foreach (var wma in wmas) { var name = wma.Value.GetField <string>(0); if ((wma.Value.GetField <int>(10) & 0x200) != 0) { name = wmas.GetRow(wma.Value.GetField <int>(9)).GetField <string>(0); } yield return(string.Format(@"Interface\WorldMap\{0}\{0}.zmp", name)); for (int i = 1; i <= 12; ++i) { yield return(string.Format(@"Interface\WorldMap\{0}\{0}{1}.blp", name, i)); for (int j = 0; j < 30; ++j) { yield return(string.Format(@"Interface\WorldMap\{0}\{0}{1}_{2}.blp", name, j, i)); } } var id = wma.Key; foreach (var wmo in wmos) { if (wmo.Value.GetField <int>(3) == id) { for (int i = 1; i <= 20; ++i) { yield return(string.Format(@"Interface\WorldMap\{0}\{1}{2}.blp", name, wmo.Value.GetField <string>(0), i)); } } } } Index++; DB6Reader at = new DB6Reader(Path.Combine(BruteforceConfig.DB2Folder, "AreaTable.db2")); foreach (var a in at) { var name = a.Value.GetField <string>(1); for (int i = 1; i <= 12; ++i) { yield return(string.Format(@"Interface\WorldMap\{0}\{0}{1}.blp", name, i)); for (int j = 0; j < 30; ++j) { yield return(string.Format(@"Interface\WorldMap\{0}\{0}{1}_{2}.blp", name, j, i)); } } } //Interface\WorldMap\MicroDungeon\%s\%s\%s%d.blp WorldMapArea[3], ?, ?, 1-12 //Interface\WorldMap\MicroDungeon\%s\%s\%s%d_%d.blp WorldMapArea[3], ?, ?, floor, 1-12 foreach (var wma in wmas) { var name = wma.Value.GetField <string>(0); var areaid = wma.Value.GetField <int>(6); //if ((wma.Value.GetField<int>(10) & 0x200) != 0) // areaid = wma.Value.GetField<int>(6); foreach (var a in at) { if (a.Value.GetField <int>(5) == areaid) { for (int i = 1; i <= 12; ++i) { var md = a.Value.GetField <string>(1); yield return(string.Format(@"Interface\WorldMap\MicroDungeon\{0}\{1}\{1}{2}.blp", name, md, i)); for (int j = 0; j < 39; ++j) { yield return(string.Format(@"Interface\WorldMap\MicroDungeon\{0}\{1}\{1}{2}_{3}.blp", name, md, j, i)); } } } } } }
static void ExtractMaps(uint build) { Console.WriteLine("Extracting maps...\n"); Console.WriteLine("Loading db2 files...\n"); var stream = cascHandler.ReadFile("DBFilesClient\\Map.db2"); if (stream == null) { Console.WriteLine("Unable to open file DBFilesClient\\Map.db2 in the archive\n"); return; } mapStorage = DB6Reader.Read <MapRecord>(stream, DB6Metas.MapMeta); if (mapStorage == null) { Console.WriteLine("Fatal error: Invalid Map.db2 file format!\n"); return; } stream = cascHandler.ReadFile("DBFilesClient\\LiquidType.db2"); if (stream == null) { Console.WriteLine("Unable to open file DBFilesClient\\LiquidType.db2 in the archive\n"); return; } liquidTypeStorage = DB6Reader.Read <LiquidTypeRecord>(stream, DB6Metas.LiquidTypeMeta); if (liquidTypeStorage == null) { Console.WriteLine("Fatal error: Invalid LiquidType.db2 file format!\n"); return; } string path = $"{baseDirectory}/maps"; CreateDirectory(path); Console.WriteLine("Convert map files\n"); int count = 1; foreach (var map in mapStorage.Values) { Console.Write($"Extract {map.MapName} ({count}/{mapStorage.Count}) \n"); // Loadup map grid data string storagePath = $"World\\Maps\\{map.Directory}\\{map.Directory}.wdt"; ChunkedFile wdt = new ChunkedFile(); if (wdt.loadFile(cascHandler, storagePath)) { wdt_MAIN main = wdt.GetChunk("MAIN").As <wdt_MAIN>(); for (int y = 0; y < 64; ++y) { for (int x = 0; x < 64; ++x) { if (Convert.ToBoolean(main.adt_list[y][x].flag & 0x1)) { storagePath = $"World\\Maps\\{map.Directory}\\{map.Directory}_{x}_{y}.adt"; string outputFileName = $"{path}/{map.Id:D4}_{y:D2}_{x:D2}.map"; MapFile.ConvertADT(cascHandler, storagePath, outputFileName, y, x, build); } } // draw progress bar Console.Write($"Processing........................{(100 * (y + 1)) / 64}%\r"); } count++; } } Console.WriteLine("\n"); }