private WMOGroupFile ReadWMOGroupFile(string filename, Stream wmo) { WMOGroupFile groupFile = new WMOGroupFile(); var bin = new BinaryReader(wmo); BlizzHeader chunk; long position = 0; while (position < wmo.Length) { wmo.Position = position; chunk = new BlizzHeader(bin.ReadChars(4), bin.ReadUInt32()); chunk.Flip(); position = wmo.Position + chunk.Size; switch (chunk.ToString()) { case "MVER": groupFile.version = bin.Read<MVER>(); if (wmofile.version.version != 17) { throw new Exception("Unsupported WMO version! (" + wmofile.version.version + ")"); } continue; case "MOGP": groupFile.mogp = ReadMOGPChunk(chunk, bin); continue; default: throw new Exception(String.Format("{2} Found unknown header at offset {1} \"{0}\" while we should've already read them all!", chunk.ToString(), position.ToString(), filename)); } } return groupFile; }
private void ReadWMO(string filename, Stream wmo) { var bin = new BinaryReader(wmo); BlizzHeader chunk; long position = 0; while (position < wmo.Length) { wmo.Position = position; chunk = new BlizzHeader(bin.ReadChars(4), bin.ReadUInt32()); chunk.Flip(); position = wmo.Position + chunk.Size; switch (chunk.ToString()) { case "MVER": wmofile.version = bin.Read<MVER>(); if (wmofile.version.version != 17) { throw new Exception("Unsupported WMO version! (" + wmofile.version.version + ") (" + filename + ")"); } continue; case "MOTX": wmofile.textures = ReadMOTXChunk(chunk, bin); continue; case "MOHD": wmofile.header = ReadMOHDChunk(chunk, bin, filename); continue; case "MOGN": wmofile.groupNames = ReadMOGNChunk(chunk, bin, wmofile.header.nGroups); continue; case "MOGI": wmofile.groupInfo = ReadMOGIChunk(chunk, bin, wmofile.header.nGroups); continue; case "MOMT": wmofile.materials = ReadMOMTChunk(chunk, bin, wmofile.header.nMaterials); continue; case "MODN": wmofile.doodadNames = ReadMODNChunk(chunk, bin, wmofile.header.nModels); continue; case "MODD": wmofile.doodadDefinitions = ReadMODDChunk(chunk, bin); continue; case "MOGP": //ReadMOGPChunk(chunk, bin); //continue; case "MOSB": case "MOPV": case "MOPT": case "MOPR": case "MOVV": //Visible block vertices case "MOVB": //Visible block list case "MOLT": case "MODS": case "MFOG": case "MCVP": case "GFID": // Legion continue; default: throw new Exception(String.Format("{2} Found unknown header at offset {1} \"{0}\" while we should've already read them all!", chunk.ToString(), position.ToString(), filename)); } } //open group files WMOGroupFile[] groupFiles = new WMOGroupFile[wmofile.header.nGroups]; for (int i = 0; i < wmofile.header.nGroups; i++) { var groupfilename = filename.Replace(".WMO", "_" + i.ToString().PadLeft(3, '0') + ".WMO"); groupfilename = groupfilename.Replace(".wmo", "_" + i.ToString().PadLeft(3, '0') + ".wmo"); if (!CASC.FileExists(groupfilename)) { new WoWFormatLib.Utils.MissingFile(groupfilename); return; } else { using (Stream wmoStream = CASC.OpenFile(groupfilename)) { groupFiles[i] = ReadWMOGroupFile(groupfilename, wmoStream); } } } wmofile.group = groupFiles; }