public bool init(uint map_num, uint originalMapId) { if (dirfileCache != null) { return(initFromCache(map_num, originalMapId)); } MemoryStream stream = Program.cascHandler.ReadFile(Adtfilename); if (stream == null) { return(false); } if (cacheable) { dirfileCache = new List <ADTOutputCache>(); } string dirname = Program.wmoDirectory + "dir_bin"; using (BinaryWriter binaryWriter = new BinaryWriter(File.Open(dirname, FileMode.Append, FileAccess.Write))) { using (BinaryReader binaryReader = new BinaryReader(stream)) { long fileLength = binaryReader.BaseStream.Length; while (binaryReader.BaseStream.Position < fileLength) { string fourcc = binaryReader.ReadStringFromChars(4, true); uint size = binaryReader.ReadUInt32(); long nextpos = binaryReader.BaseStream.Position + size; if (fourcc == "MCIN") { } else if (fourcc == "MTEX") { } else if (fourcc == "MMDX") { if (size != 0) { while (size > 0) { string path = binaryReader.ReadCString(); ModelInstanceNames.Add(path.GetPlainName()); VmapFile.ExtractSingleModel(path); size -= (uint)(path.Length + 1); } } } else if (fourcc == "MWMO") { if (size != 0) { while (size > 0) { string path = binaryReader.ReadCString(); WmoInstanceNames.Add(path.GetPlainName()); VmapFile.ExtractSingleWmo(path); size -= (uint)(path.Length + 1); } } } //====================== else if (fourcc == "MDDF") { if (size != 0) { uint doodadCount = size / 36; //sizeof(MDDF) for (int i = 0; i < doodadCount; ++i) { MDDF doodadDef = binaryReader.Read <MDDF>(); if (!Convert.ToBoolean(doodadDef.Flags & 0x40)) { Model.Extract(doodadDef, ModelInstanceNames[(int)doodadDef.Id], map_num, originalMapId, binaryWriter, dirfileCache); } else { string fileName = $"FILE{doodadDef.Id}:X8.xxx"; VmapFile.ExtractSingleModel(fileName); Model.Extract(doodadDef, fileName, map_num, originalMapId, binaryWriter, dirfileCache); } } ModelInstanceNames.Clear(); } } else if (fourcc == "MODF") { if (size != 0) { uint mapObjectCount = size / 64; // sizeof(ADT::MODF); for (int i = 0; i < mapObjectCount; ++i) { MODF mapObjDef = binaryReader.Read <MODF>(); if (!Convert.ToBoolean(mapObjDef.Flags & 0x8)) { WMORoot.Extract(mapObjDef, WmoInstanceNames[(int)mapObjDef.Id], false, map_num, originalMapId, binaryWriter, dirfileCache); Model.ExtractSet(VmapFile.WmoDoodads[WmoInstanceNames[(int)mapObjDef.Id]], mapObjDef, false, map_num, originalMapId, binaryWriter, dirfileCache); } else { string fileName = $"FILE{mapObjDef.Id}:8X.xxx"; VmapFile.ExtractSingleWmo(fileName); WMORoot.Extract(mapObjDef, fileName, false, map_num, originalMapId, binaryWriter, dirfileCache); Model.ExtractSet(VmapFile.WmoDoodads[fileName], mapObjDef, false, map_num, originalMapId, binaryWriter, dirfileCache); } } WmoInstanceNames.Clear(); } } //====================== binaryReader.BaseStream.Seek(nextpos, SeekOrigin.Begin); } } } return(true); }
public bool init(string fileName, uint map_num, uint tileX, uint tileY) { MemoryStream stream = Program.cascHandler.ReadFile(fileName); if (stream == null) { return(false); } string dirname = Program.wmoDirectory + "dir_bin"; using (BinaryWriter binaryWriter = new BinaryWriter(File.Open(dirname, FileMode.Append, FileAccess.Write))) { using (BinaryReader binaryReader = new BinaryReader(stream)) { while (binaryReader.BaseStream.Position < binaryReader.BaseStream.Length) { string fourcc = binaryReader.ReadStringFromChars(4, true); uint size = binaryReader.ReadUInt32(); long nextpos = binaryReader.BaseStream.Position + size; if (fourcc == "MCIN") { } else if (fourcc == "MTEX") { } else if (fourcc == "MMDX") { if (size != 0) { while (size > 0) { string path = binaryReader.ReadCString(); ModelInstanceNames.Add(path.GetPlainName()); if (path.GetPlainName() == "Skullcandle02.m2") { } VmapFile.ExtractSingleModel(path); size -= (uint)(path.Length + 1); } } } else if (fourcc == "MWMO") { if (size != 0) { while (size > 0) { string path = binaryReader.ReadCString(); WmoInstanceNames.Add(path.GetPlainName()); VmapFile.ExtractSingleWmo(path); size -= (uint)(path.Length + 1); } } } //====================== else if (fourcc == "MDDF") { if (size != 0) { nMDX = (int)size / 36; for (int i = 0; i < nMDX; ++i) { int id = binaryReader.ReadInt32(); ModelInstance inst = new ModelInstance(binaryReader, ModelInstanceNames[id], map_num, tileX, tileY, binaryWriter); } ModelInstanceNames.Clear(); } } else if (fourcc == "MODF") { if (size != 0) { nWMO = (int)size / 64; for (int i = 0; i < nWMO; ++i) { int id = binaryReader.ReadInt32(); WMOInstance inst = new WMOInstance(binaryReader, WmoInstanceNames[id], map_num, tileX, tileY, binaryWriter); } WmoInstanceNames.Clear(); } } //====================== binaryReader.BaseStream.Seek(nextpos, SeekOrigin.Begin); } } } return(true); }