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

    // Initialize Terrain Importer //
    public void Initialize()
    {
        var reader = new DB2Reader(1349477);

        MapRecords = reader.GetRecords <MapRecord>();

        ClearMapList();
        PopulateMapList();
        Initialized = true;
    }
Ejemplo n.º 3
0
        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;
        }
Ejemplo n.º 4
0
        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();
        }
Ejemplo n.º 5
0
        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();
        }
Ejemplo n.º 6
0
        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();
            }
        }
Ejemplo n.º 7
0
 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);
        }
Ejemplo n.º 9
0
        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;
        }
Ejemplo n.º 10
0
        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;
            }
        }
Ejemplo n.º 11
0
        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();
            });
        }