private void Load(string filename, int fields_to_skip, Dictionary <int, string> dictionary) { IWowClientDBReader mReader; if (filename.Contains(".dbc")) { mReader = new DBCReader("dbc/" + filename); } else { mReader = new DB2Reader("dbc/" + filename); } for (int i = 0; i < mReader.RecordsCount; ++i) { BinaryReader br = mReader[i]; int id = br.ReadInt32(); for (int j = 0; j < fields_to_skip; ++j) { br.ReadInt32(); } string name = mReader.StringTable[br.ReadInt32()] ?? filename.Replace(".dbc", "") + " " + id; dictionary[id] = name; } }
//////////////////// // Initialize Terrain Importer // public void Initialize() { var reader = new DB2Reader(1349477); MapRecords = reader.GetRecords <MapRecord>(); ClearMapList(); PopulateMapList(); Initialized = true; }
private void button1_Click(object sender, EventArgs e) { this.reader = new DB2Reader(); //reader.FieldsDic = FieldsManager.getFieldsDic("Item-sparse.db2", 12984); DateTime start = DateTime.Now; reader.read(Application.StartupPath + @"\Item-sparse.db2"); TimeSpan cost = DateTime.Now - start; Console.WriteLine("read cost:" + cost.TotalSeconds + " sec"); dataGridView1.DataSource = reader.DT; }
static void Main(string[] args) { CASC.InitCasc(); DB2Reader<AreaPOIRecord> reader = new DB2Reader<AreaPOIRecord>("DBFilesClient\\AreaPOI.db2"); for (int i = 0; i < reader.recordCount; i++) { Console.WriteLine(reader[i].ID + ": " + reader[i].name_lang); } //DBCReader<AreaTableRecord> reader = new DBCReader<AreaTableRecord>(); //reader.LoadDBC("DBFilesClient\\AreaTable.dbc"); /*Console.WriteLine(reader.header.record_count + " rows!"); Console.WriteLine(reader.header.record_size + " row size!"); Console.WriteLine(reader.header.field_count + " fields!"); at.rows for (int i = 0; i < at.records.Count(); i++) { //Console.WriteLine("Area: " + reader.stringblock[(int)reader.records[i].AreaName_lang] + " <" + reader.stringblock[(int)reader.records[i].ZoneName] +">"); }*/ Console.ReadLine(); }
static void Main(string[] args) { CASC.InitCasc(); DB2Reader <AreaPOIRecord> reader = new DB2Reader <AreaPOIRecord>("DBFilesClient\\AreaPOI.db2"); for (int i = 0; i < reader.recordCount; i++) { Console.WriteLine(reader[i].ID + ": " + reader[i].name_lang); } //DBCReader<AreaTableRecord> reader = new DBCReader<AreaTableRecord>(); //reader.LoadDBC("DBFilesClient\\AreaTable.dbc"); /*Console.WriteLine(reader.header.record_count + " rows!"); * Console.WriteLine(reader.header.record_size + " row size!"); * Console.WriteLine(reader.header.field_count + " fields!"); * at.rows * for (int i = 0; i < at.records.Count(); i++) * { * //Console.WriteLine("Area: " + reader.stringblock[(int)reader.records[i].AreaName_lang] + " <" + reader.stringblock[(int)reader.records[i].ZoneName] +">"); * }*/ Console.ReadLine(); }
private static void Main(string[] args) { string mapname = ""; string basedir = ConfigurationManager.AppSettings["basedir"]; bool buildmaps = Boolean.Parse(ConfigurationManager.AppSettings["buildmaps"]); bool buildWMOmaps = Boolean.Parse(ConfigurationManager.AppSettings["buildwmomaps"]); Console.WriteLine("Initializing CASC.."); if (basedir != String.Empty) { CASC.InitCasc(null, basedir); } else { CASC.InitCasc(null, @"D:\World of Warcraft Beta", "wow_beta"); // Use beta for now } Console.WriteLine("CASC initialized!"); Console.WriteLine("Current patch: " + CASC.cascHandler.Config.BuildName); if (buildmaps == true) { DB2Reader <MapRecordLegion> reader = new DB2Reader <MapRecordLegion>("DBFilesClient\\Map.db2"); for (int i = 0; i < reader.recordCount; i++) { //I used to check if WDT existed, but sometimes minimaps for maps without WDTs slip through the cracks mapname = reader[i].Directory; // if (reader[i].expansionID < 6) { Console.WriteLine("Skipping map " + mapname + " WoD and below!"); continue; } var min_x = 64; var min_y = 64; var max_x = 0; var max_y = 0; for (int cur_x = 0; cur_x < 64; cur_x++) { for (int cur_y = 0; cur_y < 64; cur_y++) { if (CASC.FileExists("World\\Minimaps\\" + mapname + "\\map" + cur_x + "_" + cur_y + ".blp")) { if (cur_x > max_x) { max_x = cur_x; } if (cur_y > max_y) { max_y = cur_y; } if (cur_x < min_x) { min_x = cur_x; } if (cur_y < min_y) { min_y = cur_y; } } } } Console.WriteLine("[" + mapname + "] MIN: (" + min_x + " " + min_y + ") MAX: (" + max_x + " " + max_y + ")"); var res_x = (((max_x - min_x) * 256) + 256); var res_y = (((max_y - min_y) * 256) + 256); if (res_x < 0 || res_y < 0) { Console.WriteLine("[" + mapname + "] " + "Skipping map, has no minimap tiles"); continue; } Console.WriteLine("[" + mapname + "] " + "Creating new image of " + res_x + "x" + res_y); Bitmap bmp = new Bitmap(res_x, res_y); Graphics g = Graphics.FromImage(bmp); Font drawFont = new Font("Arial", 16); for (int cur_x = 0; cur_x < 64; cur_x++) { for (int cur_y = 0; cur_y < 64; cur_y++) { if (CASC.FileExists("World\\Minimaps\\" + mapname + "\\map" + cur_x + "_" + cur_y + ".blp")) { var blpreader = new BLPReader(); blpreader.LoadBLP("World\\Minimaps\\" + mapname + "\\map" + cur_x + "_" + cur_y + ".blp"); g.DrawImage(blpreader.bmp, (cur_x - min_x) * 256, (cur_y - min_y) * 256, new Rectangle(0, 0, 256, 256), GraphicsUnit.Pixel); } } } g.Dispose(); if (!Directory.Exists("done")) { Directory.CreateDirectory("done"); } bmp.Save("done/" + mapname + ".png"); // SUPER MINIMAP COMPILER TIME!!!!!!!!!!!!!!! /* * var super_res_x = (((max_x - min_x) * 512) + 512); * var super_res_y = (((max_y - min_y) * 512) + 512); * * if (super_res_x < 0 || super_res_y < 0) * { * Console.WriteLine("[SUPER " + mapname + "] " + "Skipping map, has no minimap tiles"); * continue; * } * * Console.WriteLine("[SUPER " + mapname + "] " + "Creating new image of " + super_res_x + "x" + super_res_y); * * Bitmap super_bmp = new Bitmap(super_res_x, super_res_y); * Graphics super_g = Graphics.FromImage(super_bmp); * * for (int cur_x = 0; cur_x < 64; cur_x++) * { * for (int cur_y = 0; cur_y < 64; cur_y++) * { * if (CASC.FileExists("World\\Minimaps\\" + mapname + "\\map" + cur_x + "_" + cur_y + ".blp")) * { * var blpreader = new BLPReader(); * blpreader.LoadBLP("World\\Minimaps\\" + mapname + "\\map" + cur_x + "_" + cur_y + ".blp"); * super_g.DrawImage(blpreader.bmp, (cur_x - min_x) * 512, (cur_y - min_y) * 512, new Rectangle(0, 0, 512, 512), GraphicsUnit.Pixel); * } * } * } * super_g.Dispose(); * if (!Directory.Exists("done")) { Directory.CreateDirectory("done"); } * super_bmp.Save("done/SUPER_" + mapname + ".png"); */ } } if (buildWMOmaps == true) { List <string> linelist = new List <string>(); if (CASC.FileExists("dbfilesclient/filedatacomplete.dbc")) { var dbcreader = new DBCReader <FileDataRecord>("dbfilesclient/filedatacomplete.dbc"); if (dbcreader.recordCount > 0) { for (int i = 0; i < dbcreader.recordCount; i++) { if (CASC.cascHandler.FileExists(dbcreader[i].ID)) { if (dbcreader[i].ID > 1023304) { linelist.Add(dbcreader[i].FileName + dbcreader[i].FilePath); } } } } } DBCReader <MapRecord> reader = new DBCReader <MapRecord>("DBFilesClient\\Map.dbc"); string[] unwantedExtensions = new string[513]; for (int i = 0; i < 512; i++) { unwantedExtensions[i] = "_" + i.ToString().PadLeft(3, '0') + ".wmo"; } unwantedExtensions[512] = "LOD1.wmo"; foreach (string s in linelist) { if (s.Length > 8 && !unwantedExtensions.Contains(s.Substring(s.Length - 8, 8))) { if (!s.Contains("LOD") && s.EndsWith(".wmo", StringComparison.CurrentCultureIgnoreCase)) { Console.WriteLine(s); WMO wmocompiler = new WMO(); wmocompiler.Compile(s); } } } Console.ReadLine(); } }
public Storage(DB2Reader dbReader) => dbReader.PopulateRecords(this);
public static IWowClientDBReader GetReader(string file, XmlElement definition) { IWowClientDBReader reader; var ext = Path.GetExtension(file).ToUpperInvariant(); if (ext == ".DBC") { reader = new DBCReader(file); } else if (ext == ".DB2") { using (var binaryReader = BinaryReaderExtensions.FromFile(file)) { switch (binaryReader.ReadUInt32()) { case DB2Reader.DB2FmtSig: { reader = new DB2Reader(file); break; } case DB3Reader.DB3FmtSig: { reader = new DB2Reader(file); break; } case DB4Reader.DB4FmtSig: { try { reader = new DB4Reader(file); } catch { reader = new DB4SparseReader(file); } break; } case DB5Reader.DB5FmtSig: { try { reader = new DB5Reader(file, definition); } catch { reader = new DB5SparseReader(file); } break; } default: throw new InvalidDataException(string.Format("Unknown file type {0}", ext)); } } } else if (ext == ".ADB") { reader = new ADBReader(file); } else if (ext == ".WDB") { reader = new WDBReader(file); } else if (ext == ".STL") { reader = new STLReader(file); } else { throw new InvalidDataException(String.Format("Unknown file type {0}", ext)); } return(reader); }
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { var file = (string)e.Argument; try { var ext = Path.GetExtension(file).ToUpperInvariant(); if (ext == ".DBC") m_reader = new DBCReader(file); else if (ext == ".DB2") m_reader = new DB2Reader(file); else if (ext == ".ADB") m_reader = new ADBReader(file); else if (ext == ".WDB") m_reader = new WDBReader(file); else throw new InvalidDataException(String.Format("Unknown file type {0}", ext)); } catch (Exception ex) { ShowErrorMessageBox(ex.Message); e.Cancel = true; return; } m_fields = m_definition.GetElementsByTagName("field"); string[] types = new string[m_fields.Count]; for (var j = 0; j < m_fields.Count; ++j) types[j] = m_fields[j].Attributes["type"].Value; // hack for *.adb files (because they don't have FieldsCount) var notADB = !(m_reader is ADBReader); // hack for *.wdb files (because they don't have FieldsCount) var notWDB = !(m_reader is WDBReader); if (GetFieldsCount(m_fields) != m_reader.FieldsCount && notADB && notWDB) { var msg = String.Format(CultureInfo.InvariantCulture, "{0} has invalid definition!\nFields count mismatch: got {1}, expected {2}", Path.GetFileName(file), m_fields.Count, m_reader.FieldsCount); ShowErrorMessageBox(msg); e.Cancel = true; return; } m_dataTable = new DataTable(Path.GetFileName(file)); m_dataTable.Locale = CultureInfo.InvariantCulture; CreateColumns(); // Add columns CreateIndexes(); // Add indexes for (var i = 0; i < m_reader.RecordsCount; ++i) // Add rows { var dataRow = m_dataTable.NewRow(); #region Test //var bytes = m_reader.GetRowAsByteArray(i); //unsafe //{ // fixed (void* b = bytes) // { // IntPtr ptr = new IntPtr(b); // int offset = 0; // for (var j = 0; j < m_fields.Count; ++j) // Add cells // { // switch (types[j]) // { // case "long": // dataRow[j] = *(long*)(ptr + offset); // offset += 8; // break; // case "ulong": // dataRow[j] = *(ulong*)(ptr + offset); // offset += 8; // break; // case "int": // dataRow[j] = *(int*)(ptr + offset); // offset += 4; // break; // case "uint": // dataRow[j] = *(uint*)(ptr + offset); // offset += 4; // break; // case "short": // dataRow[j] = *(short*)(ptr + offset); // offset += 2; // break; // case "ushort": // dataRow[j] = *(ushort*)(ptr + offset); // offset += 2; // break; // case "sbyte": // dataRow[j] = *(sbyte*)(ptr + offset); // offset += 1; // break; // case "byte": // dataRow[j] = *(byte*)(ptr + offset); // offset += 1; // break; // case "float": // dataRow[j] = *(float*)(ptr + offset); // offset += 4; // break; // case "double": // dataRow[j] = *(double*)(ptr + offset); // offset += 8; // break; // case "string": // dataRow[j] = m_reader.StringTable[*(int*)(ptr + offset)]; // offset += 4; // break; // default: // throw new Exception(String.Format("Unknown field type {0}!", m_fields[j].Attributes["type"].Value)); // } // } // } //} #endregion var br = m_reader[i]; for (var j = 0; j < m_fields.Count; ++j) // Add cells { switch (types[j]) { case "long": dataRow[j] = br.ReadInt64(); break; case "ulong": dataRow[j] = br.ReadUInt64(); break; case "int": dataRow[j] = br.ReadInt32(); break; case "uint": dataRow[j] = br.ReadUInt32(); break; case "short": dataRow[j] = br.ReadInt16(); break; case "ushort": dataRow[j] = br.ReadUInt16(); break; case "sbyte": dataRow[j] = br.ReadSByte(); break; case "byte": dataRow[j] = br.ReadByte(); break; case "float": dataRow[j] = br.ReadSingle(); break; case "double": dataRow[j] = br.ReadDouble(); break; case "string": dataRow[j] = m_reader is WDBReader ? br.ReadStringNull() : m_reader.StringTable[br.ReadInt32()]; break; default: throw new ArgumentException(String.Format(CultureInfo.InvariantCulture, "Unknown field type {0}!", types[j])); } } m_dataTable.Rows.Add(dataRow); int percent = (int)((float)m_dataTable.Rows.Count / (float)m_reader.RecordsCount * 100.0f); (sender as BackgroundWorker).ReportProgress(percent); } if (dataGridView1.InvokeRequired) { SetDataViewDelegate d = new SetDataViewDelegate(SetDataSource); Invoke(d, new object[] { m_dataTable.DefaultView }); } else { SetDataSource(m_dataTable.DefaultView); } e.Result = file; }
public ClientDataDBC(string filename, int fields_to_skip) { if (!File.Exists("dbc\\" + filename)) return; IWowClientDBReader m_reader; if (filename.Contains(".dbc")) m_reader = new DBCReader(@"dbc\" + filename); else m_reader = new DB2Reader(@"dbc\" + filename); for (int i = 0; i < m_reader.RecordsCount; ++i) { BinaryReader br = m_reader[i]; int id = br.ReadInt32(); for (int j = 0; j < fields_to_skip; ++j) br.ReadInt32(); string name = m_reader.StringTable[br.ReadInt32()]; values[id] = name; } }
public async Task AnalyzeUnknownFiles(Action<int> progressCallback) { if (_casc == null) return; IProgress<int> progress = new Progress<int>(progressCallback); await Task.Run(() => { FileScanner scanner = new FileScanner(_casc, _root); Dictionary<int, string> idToName = new Dictionary<int, string>(); if (_casc.Config.GameType == CASCGameType.WoW) { if (_casc.FileExists("DBFilesClient\\SoundEntries.db2")) { using (Stream stream = _casc.OpenFile("DBFilesClient\\SoundEntries.db2")) { DB2Reader se = new DB2Reader(stream); foreach (var row in se) { string name = row.Value.GetField<string>(2); int type = row.Value.GetField<int>(1); bool many = row.Value.GetField<int>(4) > 0; for (int i = 3; i < 23; i++) idToName[row.Value.GetField<int>(i)] = "unknown\\sound\\" + name + (many ? "_" + (i - 2).ToString("D2") : "") + (type == 28 ? ".mp3" : ".ogg"); } } } if (_casc.FileExists("DBFilesClient\\SoundKit.db2") && _casc.FileExists("DBFilesClient\\SoundKitEntry.db2")) { using (Stream skStream = _casc.OpenFile("DBFilesClient\\SoundKit.db2")) using (Stream skeStream = _casc.OpenFile("DBFilesClient\\SoundKitEntry.db2")) { DB5Reader sk = new DB5Reader(skStream); DB5Reader ske = new DB5Reader(skeStream); Dictionary<int, List<int>> lookup = new Dictionary<int, List<int>>(); foreach (var row in ske) { int soundKitId = row.Value.GetField<int>(3); if (!lookup.ContainsKey(soundKitId)) lookup[soundKitId] = new List<int>(); lookup[soundKitId].Add(row.Value.GetField<int>(0)); } foreach (var row in sk) { string name = row.Value.GetField<string>(0).Replace(':', '_'); int type = row.Value.GetField<byte>(12); List<int> ske_entries; if (!lookup.TryGetValue(row.Key, out ske_entries)) continue; bool many = ske_entries.Count > 1; int i = 0; foreach (var fid in ske_entries) { idToName[fid] = "unknown\\sound\\" + name + (many ? "_" + (i + 1).ToString("D2") : "") + (type == 28 ? ".mp3" : ".ogg"); i++; } } } } } CASCFolder unknownFolder = _root.GetEntry("unknown") as CASCFolder; if (unknownFolder == null) return; IEnumerable<CASCFile> files = CASCFolder.GetFiles(unknownFolder.Entries.Select(kv => kv.Value), null, true); int numTotal = files.Count(); int numDone = 0; WowRootHandler wowRoot = _casc.Root as WowRootHandler; foreach (var unknownEntry in files) { CASCFile unknownFile = unknownEntry as CASCFile; string name; if (idToName.TryGetValue(wowRoot.GetFileDataIdByHash(unknownFile.Hash), out name)) unknownFile.FullName = name; else { string ext = scanner.GetFileExtension(unknownFile); unknownFile.FullName += ext; if (ext == ".m2") { using (var m2file = _casc.OpenFile(unknownFile.Hash)) using (var br = new BinaryReader(m2file)) { m2file.Position = 0x138; string m2name = br.ReadCString(); unknownFile.FullName = "unknown\\" + m2name + ".m2"; } } } progress.Report((int)(++numDone / (float)numTotal * 100)); } _casc.Root.Dump(); }); }