public static ADT ReadADT(WDT terrain, int x, int y, bool addWMOsAndM2s = true) { string filePath; MpqLibrarian mpqFinder; if (!TryGetADTPath(terrain.MapId, x, y, out filePath, out mpqFinder)) { log.Error("ADT file does not exist: {0}", filePath); return null; } var adt = new ADT(x, y, terrain); using (var stream = mpqFinder.OpenFile(filePath)) using (var fileReader = new BinaryReader(stream)) { if (stream.Length == 0) { log.Error("ADT file is empty: {0}", filePath); return null; } ReadMVER(fileReader, adt); ReadMHDR(fileReader, adt); if (adt.Header.offsInfo != 0) { fileReader.BaseStream.Position = adt.Header.Base + adt.Header.offsInfo; ReadMCIN(fileReader, adt); } //if (adt.Header.offsTex != 0) //{ // fileReader.BaseStream.Position = adt.Header.Base + adt.Header.offsTex; // ReadMTEX(fileReader, adt); //} if (adt.Header.offsModels != 0) { fileReader.BaseStream.Position = adt.Header.Base + adt.Header.offsModels; ReadMMDX(fileReader, adt); } if (adt.Header.offsModelIds != 0) { fileReader.BaseStream.Position = adt.Header.Base + adt.Header.offsModelIds; ReadMMID(fileReader, adt); } if (adt.Header.offsMapObjects != 0) { fileReader.BaseStream.Position = adt.Header.Base + adt.Header.offsMapObjects; ReadMWMO(fileReader, adt); } if (adt.Header.offsMapObjectIds != 0) { fileReader.BaseStream.Position = adt.Header.Base + adt.Header.offsMapObjectIds; ReadMWID(fileReader, adt); } if (adt.Header.offsDoodadDefinitions != 0) { fileReader.BaseStream.Position = adt.Header.Base + adt.Header.offsDoodadDefinitions; ReadMDDF(fileReader, adt); } if (adt.Header.offsObjectDefinitions != 0) { fileReader.BaseStream.Position = adt.Header.Base + adt.Header.offsObjectDefinitions; ReadMODF(fileReader, adt); } //if (adt.Header.offsFlightBoundary != 0) //{ // fileReader.BaseStream.Position = adt.Header.Base + adt.Header.offsFlightBoundary; // ReadMFBO(fileReader, adt); //} if (adt.Header.offsMH2O != 0) { fileReader.BaseStream.Position = adt.Header.Base + adt.Header.offsMH2O; ReadMH2O(fileReader, adt); } ReadMCNK(fileReader, adt); } if (addWMOsAndM2s) { // add WMOs & M2s adt.WMOs = new WMORoot[adt.ObjectDefinitions.Count]; var actualWMOCount = 0; for (var i = 0; i < adt.ObjectDefinitions.Count; i++) { var def = adt.ObjectDefinitions[i]; var wmo = terrain.GetOrReadWMO(def); adt.WMOs[i] = wmo; if (wmo != null) { ++actualWMOCount; } } if (actualWMOCount == 0) { adt.WMOs = new WMORoot[0]; // No WMOs available -> unset } adt.M2s = new M2[adt.DoodadDefinitions.Count]; var actualM2Count = 0; for (var i = 0; i < adt.DoodadDefinitions.Count; i++) { var def = adt.DoodadDefinitions[i]; var m2 = terrain.GetOrReadM2(def); adt.M2s[i] = m2; if (m2 != null) { ++actualM2Count; } } if (actualM2Count == 0) { adt.M2s = new M2[0]; // No M2s available -> unset } } return adt; }
public static ADT ReadADT(WDT terrain, int x, int y) { var mpqFinder = WCellTerrainSettings.GetDefaultMPQFinder(); var filePath = GetFilename(terrain.MapId, x, y); if (!mpqFinder.FileExists(filePath)) { log.Error("ADT file does not exist: ", filePath); return null; } var adt = new ADT(x, y, terrain); using (var stream = mpqFinder.OpenFile(filePath)) using (var fileReader = new BinaryReader(stream)) { ReadMVER(fileReader, adt); ReadMHDR(fileReader, adt); if (adt.Header.offsInfo != 0) { fileReader.BaseStream.Position = adt.Header.Base + adt.Header.offsInfo; ReadMCIN(fileReader, adt); } //if (adt.Header.offsTex != 0) //{ // fileReader.BaseStream.Position = adt.Header.Base + adt.Header.offsTex; // ReadMTEX(fileReader, adt); //} if (adt.Header.offsModels != 0) { fileReader.BaseStream.Position = adt.Header.Base + adt.Header.offsModels; ReadMMDX(fileReader, adt); } if (adt.Header.offsModelIds != 0) { fileReader.BaseStream.Position = adt.Header.Base + adt.Header.offsModelIds; ReadMMID(fileReader, adt); } if (adt.Header.offsMapObjects != 0) { fileReader.BaseStream.Position = adt.Header.Base + adt.Header.offsMapObjects; ReadMWMO(fileReader, adt); } if (adt.Header.offsMapObjectIds != 0) { fileReader.BaseStream.Position = adt.Header.Base + adt.Header.offsMapObjectIds; ReadMWID(fileReader, adt); } if (adt.Header.offsDoodadDefinitions != 0) { fileReader.BaseStream.Position = adt.Header.Base + adt.Header.offsDoodadDefinitions; ReadMDDF(fileReader, adt); } if (adt.Header.offsObjectDefinitions != 0) { fileReader.BaseStream.Position = adt.Header.Base + adt.Header.offsObjectDefinitions; ReadMODF(fileReader, adt); } //if (adt.Header.offsFlightBoundary != 0) //{ // fileReader.BaseStream.Position = adt.Header.Base + adt.Header.offsFlightBoundary; // ReadMFBO(fileReader, adt); //} if (adt.Header.offsMH2O != 0) { fileReader.BaseStream.Position = adt.Header.Base + adt.Header.offsMH2O; ReadMH2O(fileReader, adt); } ReadMCNK(fileReader, adt); } // add WMOs & M2s adt.WMOs = new WMORoot[adt.ObjectDefinitions.Count]; for (var i = 0; i < adt.ObjectDefinitions.Count; i++) { var def = adt.ObjectDefinitions[i]; var wmo = terrain.GetOrReadWMO(def); adt.WMOs[i] = wmo; } adt.M2s = new M2[adt.DoodadDefinitions.Count]; for (var i = 0; i < adt.DoodadDefinitions.Count; i++) { var def = adt.DoodadDefinitions[i]; var m2 = terrain.GetOrReadM2(def); adt.M2s[i] = m2; } return adt; }