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()); } }
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); }
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; }
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); }
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"); }