예제 #1
0
        public void Write()
        {
            using (var writer = new BinaryWriter(File.OpenWrite("test.wdt")))
            {
                // MVER
                writer.Write(MVER.GetChunkHeaderBytes());
                writer.Write(MVER.GetChunkBytes());

                // MPHD
                writer.Write(MPHD.GetChunkHeaderBytes());
                writer.Write(MPHD.GetChunkBytes());

                // MAIN
                writer.Write(MAIN.GetChunkHeaderBytes());
                writer.Write(MAIN.GetChunkBytes());

                // MWMO
                writer.Write(MWMO.GetChunkHeaderBytes());
                writer.Write(MWMO.GetChunkBytes());

                // MODF
                writer.Write(MODF.GetChunkHeaderBytes());
                writer.Write(MODF.GetChunkBytes());
            }
        }
예제 #2
0
        private MPHD ReadMPHDChunk(BinaryReader bin)
        {
            var mphd = new MPHD();

            mphd.flags     = (mphdFlags)bin.ReadUInt32();
            mphd.something = bin.ReadUInt32();
            mphd.unused    = new uint[] { bin.ReadUInt32(), bin.ReadUInt32(), bin.ReadUInt32(), bin.ReadUInt32(), bin.ReadUInt32(), bin.ReadUInt32() };
            return(mphd);
        }
예제 #3
0
 private MPHD ReadMPHDChunk(BinaryReader bin)
 {
     var mphd = new MPHD()
     {
         flags = (mphdFlags)bin.ReadUInt32(),
         something = bin.ReadUInt32(),
         unused = new uint[] { bin.ReadUInt32(), bin.ReadUInt32(), bin.ReadUInt32(), bin.ReadUInt32(), bin.ReadUInt32(), bin.ReadUInt32() }
     };
     return mphd;
 }
예제 #4
0
파일: WDT.cs 프로젝트: shmilyzxt/WoWMap
        public void Read()
        {
            foreach (var subChunk in Data.Chunks)
            {
                switch (subChunk.Name)
                {
                case "MAIN":
                    MAIN = new MAIN(subChunk);

                    IsValid = true;

                    TileTable = new bool[64, 64];
                    for (var y = 0; y < 64; y++)
                    {
                        for (var x = 0; x < 64; x++)
                        {
                            TileTable[x, y] = MAIN.Entries[x, y].Flags.HasFlag(MAIN.MAINFlags.HasADT);
                        }
                    }
                    break;

                case "MWMO":
                    MWMO = new MWMO(subChunk);
                    break;

                case "MODF":
                    MODF = new MODF(subChunk);
                    break;

                case "MPHD":
                    MPHD = new MPHD(subChunk);
                    break;
                }
            }

            IsGlobalModel = (MODF != null && MWMO != null);
        }
예제 #5
0
        static void ExtractMaps()
        {
            ExtractDbcFiles();
            ExtractCameraFiles();
            ExtractGameTablesFiles();

            Console.WriteLine("Extracting maps...");

            string path = $"{BaseDirectory}/maps";

            CreateDirectory(path);

            Console.WriteLine("Convert map files");
            int count = 1;

            Console.WriteLine("Loading DB2 files");
            var mapStorage = DBReader.Read <MapRecord>(1349477);

            if (mapStorage == null)
            {
                Console.WriteLine("Fatal error: Invalid Map.db2 file format!");
                return;
            }

            foreach (var record in mapStorage.Values)
            {
                if (record.WdtFileDataID == 0)
                {
                    continue;
                }

                Console.Write($"Extract {record.Directory} ({count++}/{mapStorage.Count})                  \n");
                // Loadup map grid data
                ChunkedFile wdt = new();

                BitArray existingTiles = new(64 * 64);
                if (wdt.LoadFile(CascHandler, (uint)record.WdtFileDataID, $"WDT for map {record.Id}"))
                {
                    MPHD mphd = wdt.GetChunk("MPHD").As <MPHD>();
                    MAIN main = wdt.GetChunk("MAIN").As <MAIN>();
                    for (int y = 0; y < 64; ++y)
                    {
                        for (int x = 0; x < 64; ++x)
                        {
                            if ((main.MapAreaInfo[y][x].Flag & 0x1) == 0)
                            {
                                continue;
                            }

                            string outputFileName  = $"{path}/{record.Id:D4}_{y:D2}_{x:D2}.map";
                            bool   ignoreDeepWater = MapFile.IsDeepWaterIgnored(record.Id, y, x);

                            if (mphd != null && (mphd.Flags & 0x200) != 0)
                            {
                                MAID maid = wdt.GetChunk("MAID").As <MAID>();
                                existingTiles[y * 64 + x] = MapFile.ConvertADT(CascHandler, maid.MapFileDataIDs[y][x].RootADT, record.MapName, outputFileName, y, x, ignoreDeepWater);
                            }
                            else
                            {
                                string storagePath = $"World\\Maps\\{record.Directory}\\{record.Directory}_{x}_{y}.adt";
                                existingTiles[y * 64 + x] = MapFile.ConvertADT(CascHandler, storagePath, record.MapName, outputFileName, y, x, ignoreDeepWater);
                            }
                        }
                        // draw progress bar
                        Console.Write($"Processing........................{(100 * (y + 1)) / 64}%\r");
                    }
                }

                using BinaryWriter binaryWriter = new(File.Open($"{path}/{record.Id:D4}.tilelist", FileMode.Create, FileAccess.Write));
                binaryWriter.Write(SharedConst.MAP_MAGIC);
                binaryWriter.Write(SharedConst.MAP_VERSION_MAGIC);
                binaryWriter.Write(_build);
                binaryWriter.WriteString(existingTiles.ToBinaryString());
            }
            Console.WriteLine("\n");
        }