private MOTX[] ReadMOTXChunk(uint size, BinaryReader bin) { //List of BLP filenames var blpFilesChunk = bin.ReadBytes((int)size); List <String> blpFiles = new List <string>(); List <int> blpOffset = new List <int>(); var str = new StringBuilder(); var buildingString = false; for (var i = 0; i < blpFilesChunk.Length; i++) { if (blpFilesChunk[i] == '\0') { if (buildingString) { str.Replace("..", "."); blpFiles.Add(str.ToString()); blpOffset.Add(i - str.ToString().Length); } buildingString = false; str = new StringBuilder(); } else { buildingString = true; str.Append((char)blpFilesChunk[i]); } } var textures = new MOTX[blpFiles.Count]; for (var i = 0; i < blpFiles.Count; i++) { textures[i].filename = blpFiles[i]; textures[i].startOffset = (uint)blpOffset[i]; } return(textures); }
public MOTX[] ReadMOTXChunk(BlizzHeader chunk, BinaryReader bin) { //List of BLP filenames var blpFilesChunk = bin.ReadBytes((int)chunk.Size); List <String> blpFiles = new List <string>(); List <int> blpOffset = new List <int>(); var str = new StringBuilder(); for (var i = 0; i < blpFilesChunk.Length; i++) { if (blpFilesChunk[i] == '\0') { str.Replace("..", "."); blpFiles.Add(str.ToString()); blpOffset.Add(i - str.ToString().Length); if (!CASC.FileExists(str.ToString())) { new WoWFormatLib.Utils.MissingFile(str.ToString()); } str = new StringBuilder(); } else { str.Append((char)blpFilesChunk[i]); } } var textures = new MOTX[blpFiles.Count]; for (var i = 0; i < blpFiles.Count; i++) { textures[i].filename = blpFiles[i]; textures[i].startOffset = (uint)blpOffset[i]; } return(textures); }
public void Read(byte[] data) { // Clear chunks to prevent double data. Chunks.Clear(); using (var stream = new MemoryStream(data)) using (var reader = new BinaryReader(stream)) { while (reader.BaseStream.Position < reader.BaseStream.Length) { var chunkId = (WMOChunkId)reader.ReadUInt32(); var chunkSize = reader.ReadUInt32(); var chunkData = new byte[chunkSize]; Buffer.BlockCopy(stream.ToArray(), (int)reader.BaseStream.Position, chunkData, 0, (int)chunkSize); IChunk chunk = null; switch (chunkId) { case WMOChunkId.MVER: chunk = new MVER(); break; case WMOChunkId.MOHD: chunk = new MOHD(); break; case WMOChunkId.MOTX: chunk = new MOTX(); break; case WMOChunkId.MOMT: chunk = new MOMT(); break; case WMOChunkId.MOGN: chunk = new MOGN(); break; case WMOChunkId.MOGI: chunk = new MOGI(); break; case WMOChunkId.MOPV: chunk = new MOPV(); break; case WMOChunkId.MOPT: chunk = new MOPT(); break; case WMOChunkId.MOPR: chunk = new MOPR(); break; case WMOChunkId.MOLT: chunk = new MOLT(); break; case WMOChunkId.MODS: chunk = new MODS(); break; case WMOChunkId.MODI: chunk = new MODI(); break; case WMOChunkId.MODD: chunk = new MODD(); break; case WMOChunkId.MFOG: chunk = new MFOG(); break; default: Console.WriteLine($"Skipping {chunkId} (0x{(uint)chunkId:X})"); break; } if (chunk != null) { chunk.Read(chunkData); Chunks.Add(chunk); } reader.BaseStream.Position += chunkSize; } // Add mandatory chunks. Chunks.Add(new MOSB()); Chunks.Add(new MOVV()); Chunks.Add(new MOVB()); // Close the streams so they can be written. reader.Close(); stream.Close(); } }