Exemple #1
0
        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;
        }
Exemple #2
0
		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;
		}