public void LoadADT(uint wdtFileDataID, byte tileX, byte tileY, bool loadSecondaryADTs = true) { adtfile.x = tileX; adtfile.y = tileY; m2Files = new List <string>(); wmoFiles = new List <string>(); blpFiles = new List <string>(); uint rootFileDataID; uint tex0FileDataID; uint obj0FileDataID; if (CASC.FileExists(wdtFileDataID)) { var wdtr = new WDTReader(); wdtr.LoadWDT(wdtFileDataID); wdt = wdtr.wdtfile; rootFileDataID = wdtr.tileFiles[(tileX, tileY)].rootADT;
public void LoadADT(uint wdtFileDataID, byte tileX, byte tileY, bool loadSecondaryADTs = true, string wdtFilename = "") { adtfile.x = tileX; adtfile.y = tileY; m2Files = new List <string>(); wmoFiles = new List <string>(); blpFiles = new List <string>(); uint rootFileDataID; uint tex0FileDataID; uint obj0FileDataID; if (CASC.FileExists(wdtFileDataID)) { var wdtr = new WDTReader(); wdtr.LoadWDT(wdtFileDataID); wdt = wdtr.wdtfile; if (wdtr.tileFiles.Count == 0) { if (string.IsNullOrEmpty(wdtFilename)) { throw new Exception("Require WDT filename for filename based ADT loading!"); } var mapName = Path.GetFileNameWithoutExtension(wdtFilename); // Still filename based rootFileDataID = CASC.getFileDataIdByName("world/maps/" + mapName + "/" + mapName + "_" + tileX + "_" + tileY + ".adt"); obj0FileDataID = CASC.getFileDataIdByName("world/maps/" + mapName + "/" + mapName + "_" + tileX + "_" + tileY + "_obj0.adt"); tex0FileDataID = CASC.getFileDataIdByName("world/maps/" + mapName + "/" + mapName + "_" + tileX + "_" + tileY + "_tex0.adt"); } else { // ID based rootFileDataID = wdtr.tileFiles[(tileX, tileY)].rootADT;
/* ROOT */ public void LoadADT(string filename, bool loadSecondaryADTs = true) { m2Files = new List <string>(); wmoFiles = new List <string>(); blpFiles = new List <string>(); filename = Path.ChangeExtension(filename, ".adt"); if (!CASC.cascHandler.FileExists(filename) || !CASC.cascHandler.FileExists(filename.Replace(".adt", "_obj0.adt")) || !CASC.cascHandler.FileExists(filename.Replace(".adt", "_tex0.adt"))) { throw new FileNotFoundException("One or more ADT files for ADT " + filename + " could not be found."); } var mapname = filename.Replace("world\\maps\\", "").Substring(0, filename.Replace("world\\maps\\", "").IndexOf("\\")); if (CASC.cascHandler.FileExists("world\\maps\\" + mapname + "\\" + mapname + ".wdt")) { var wdtr = new WDTReader(); wdtr.LoadWDT("world\\maps\\" + mapname + "\\" + mapname + ".wdt"); wdt = wdtr.wdtfile; } else { throw new Exception("WDT does not exist, need this for MCAL flags!"); } using (var adt = CASC.cascHandler.OpenFile(filename)) using (var bin = new BinaryReader(adt)) { long position = 0; int MCNKi = 0; adtfile.chunks = new MCNK[16 * 16]; while (position < adt.Length) { adt.Position = position; var chunkName = new string(bin.ReadChars(4).Reverse().ToArray()); var chunkSize = bin.ReadUInt32(); position = adt.Position + chunkSize; switch (chunkName) { case "MVER": uint version = bin.ReadUInt32(); if (version != 18) { throw new Exception("Unsupported ADT version!"); } else { adtfile.version = version; } break; case "MCNK": adtfile.chunks[MCNKi] = ReadMCNKChunk(chunkSize, bin); MCNKi++; break; case "MHDR": adtfile.header = bin.Read <MHDR>(); break; case "MH2O": case "MFBO": //model.blob stuff case "MBMH": case "MBBB": case "MBMI": case "MBNV": break; default: throw new Exception(String.Format("{2} Found unknown header at offset {1} \"{0}\" while we should've already read them all!", chunkName, position, filename)); } } } if (loadSecondaryADTs) { using (var adtobj0 = CASC.cascHandler.OpenFile(filename.Replace(".adt", "_obj0.adt"))) { ReadObjFile(adtobj0); } using (var adttex0 = CASC.cascHandler.OpenFile(filename.Replace(".adt", "_tex0.adt"))) { ReadTexFile(adttex0); } } }
public int currentChunk; //very ghetto, much wow /* ROOT */ //---------------------------------------------------------------------------------------------------------- //////////////////////////////////////////////////////////////////////////////////////////////////////////// ///ADT READER //////////////////////////////////////////////////////////////////////////////////////////////////////////// //---------------------------------------------------------------------------------------------------------- #region Split-File_ADT_READER public void LoadADT(string filename, bool loadSecondaryADTs = true) { m2Files = new List <string>(); wmoFiles = new List <string>(); blpFiles = new List <string>(); var WDTfile = filename.Substring(0, filename.Length - 10) + ".wdt"; if (Managers.ArchiveManager.FileExists(WDTfile)) { var wdtr = new WDTReader(); wdtr.LoadWDT(WDTfile); wdt = wdtr.wdtfile; } else { throw new Exception("WDT does not exist, need this for MCAL flags!"); } var adt = Managers.ArchiveManager.ReadThisFile(filename); using (var bin = new BinaryReader(adt)) { long position = 0; var MCNKi = 0; adtfile.chunks = new MCNK[16 * 16]; while (position < adt.Length) { adt.Position = position; var chunkName = new string(bin.ReadChars(4).Reverse().ToArray()); var chunkSize = bin.ReadUInt32(); position = adt.Position + chunkSize; switch (chunkName) { case "MVER": var version = bin.ReadUInt32(); if (version != 18) { throw new Exception("Unsupported ADT version!"); } else { adtfile.version = version; } break; case "MCNK": adtfile.chunks[MCNKi] = ReadMCNKChunk(chunkSize, bin); MCNKi++; break; case "MHDR": adtfile.header = bin.Read <MHDR>(); break; case "MH2O": adtfile.mh2o = ReadMH20SubChunk(chunkSize, bin); break; case "MFBO": //model.blob stuff case "MBMH": case "MBBB": case "MBMI": case "MBNV": break; default: throw new Exception(string.Format("{2} Found unknown header at offset {1} \"{0}\" while we should've already read them all!", chunkName, position, filename)); } } } if (loadSecondaryADTs) { using (var adtobj0 = Managers.ArchiveManager.ReadThisFile(filename.Replace(".adt", "_obj0.adt"))) { ReadObjFile(adtobj0); } using (var adttex0 = Managers.ArchiveManager.ReadThisFile(filename.Replace(".adt", "_tex0.adt"))) { ReadTexFile(adttex0); } } }
//---------------------------------------------------------------------------------------------------------- //////////////////////////////////////////////////////////////////////////////////////////////////////////// ///ADT READER END //////////////////////////////////////////////////////////////////////////////////////////////////////////// //---------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------- //////////////////////////////////////////////////////////////////////////////////////////////////////////// ///335 ADT READER //////////////////////////////////////////////////////////////////////////////////////////////////////////// //---------------------------------------------------------------------------------------------------------- #region Single-File_ADT_READER public void Load335ADT(string filename) { m2Files = new List <string>(); wmoFiles = new List <string>(); blpFiles = new List <string>(); var WDTfile = filename.Substring(0, filename.Length - 10) + ".wdt"; if (Managers.ArchiveManager.FileExists(WDTfile)) { var wdtr = new WDTReader335(); wdtr.LoadWDT(WDTfile); wdt = wdtr.wdtfile; } else { throw new Exception("WDT does not exist, need this for MCAL flags!"); } var adt = Managers.ArchiveManager.ReadThisFile(filename); using (var bin = new BinaryReader(adt)) { long position = 0; var MCNKi = 0; var MCINi = 0; currentChunk = 0; //very ghetto, much wow adtfile.chunks = new MCNK[16 * 16]; adtfile.mcinChunks = new MCIN[16 * 16]; adtfile.texChunks = new TexMCNK[16 * 16]; while (position < adt.Length) { adt.Position = position; var chunkName = new string(bin.ReadChars(4).Reverse().ToArray()); var chunkSize = bin.ReadUInt32(); position = adt.Position + chunkSize; switch (chunkName) { case "MVER": var version = bin.ReadUInt32(); if (version != 18) { throw new Exception("Unsupported ADT version!"); } else { adtfile.version = version; } break; case "MHDR": adtfile.header = bin.Read <MHDR>(); break; case "MCIN": adtfile.mcinChunks[MCINi] = ReadMCINChunk(chunkSize, bin); MCINi++; break; case "MTEX": adtfile.textures = ReadMTEXChunk(chunkSize, bin); break; case "MMDX": adtfile.objects.m2Names = ReadMMDXChunk(chunkSize, bin); break; case "MMID": adtfile.objects.m2NameOffsets = ReadMMIDChunk(chunkSize, bin); break; case "MWMO": adtfile.objects.wmoNames = ReadMWMOChunk(chunkSize, bin); break; case "MWID": adtfile.objects.wmoNameOffsets = ReadMWIDChunk(chunkSize, bin); break; case "MDDF": adtfile.objects.models = ReadMDDFChunk(chunkSize, bin); break; case "MODF": adtfile.objects.worldModels = ReadMODFChunk(chunkSize, bin); break; case "MH2O": adtfile.mh2o = ReadMH20SubChunk(chunkSize, bin); break; case "MCNK": //adtfile.chunks[MCNKi] = ReadMCNKChunk(adtfile.mcinChunks[MCNKi].size, bin); //Bad idea (MCIN size = 8 bytes longer than MCNK) adtfile.chunks[MCNKi] = Read335MCNKChunk(chunkSize, bin); MCNKi++; currentChunk++; //very ghetto, much wow break; default: throw new Exception(string.Format("{2} Found unknown header at offset {1} \"{0}\" while we should've already read them all!", chunkName, position, filename)); } } } }