private MOGN[] ReadMOGNChunk(uint size, BinaryReader bin) { var wmoGroupsChunk = bin.ReadBytes((int)size); var str = new StringBuilder(); var nameList = new List <string>(); var nameOffset = new List <int>(); for (var i = 0; i < wmoGroupsChunk.Length; i++) { if (wmoGroupsChunk[i] == '\0') { if (str.Length > 1) { nameOffset.Add(i - str.ToString().Length); nameList.Add(str.ToString()); } str = new StringBuilder(); } else { str.Append((char)wmoGroupsChunk[i]); } } var groupNames = new MOGN[nameList.Count]; for (var i = 0; i < nameList.Count; i++) { groupNames[i].name = nameList[i]; groupNames[i].offset = nameOffset[i]; } return(groupNames); }
public void Read() { foreach (var subChunk in Data.Chunks) { switch (subChunk.Name) { case "MOHD": MOHD = new MOHD(subChunk); break; case "MOGN": MOGN = new MOGN(subChunk); break; case "MOGI": MOGI = new MOGI(subChunk); break; case "MODD": MODD = new MODD(subChunk); break; case "MODN": MODN = new MODN(subChunk); break; case "MODS": MODS = new MODS(subChunk); break; } } ReadGroups(); }
public MOGN[] ReadMOGNChunk(BlizzHeader chunk, BinaryReader bin, uint num) { var wmoGroupsChunk = bin.ReadBytes((int)chunk.Size); var str = new StringBuilder(); var nameList = new List <String>(); List <int> nameOffset = new List <int>(); for (var i = 0; i < wmoGroupsChunk.Length; i++) { if (wmoGroupsChunk[i] == '\0') { if (str.Length > 1) { nameOffset.Add(i - str.ToString().Length); nameList.Add(str.ToString()); } str = new StringBuilder(); } else { str.Append((char)wmoGroupsChunk[i]); } } if (nameList.Count != num) { //throw new Exception("List of group names does not equal number of groups"); } var groupNames = new MOGN[nameList.Count]; for (var i = 0; i < nameList.Count; i++) { groupNames[i].name = nameList[i]; groupNames[i].offset = nameOffset[i]; } return(groupNames); }
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(); } }