Пример #1
0
		private static void LoadMod(TmodFile modFile, BuildProperties properties)
		{
			AddAssemblyResolver();
			string fileName = Path.GetFileNameWithoutExtension(modFile.Name);
			Interface.loadMods.SetProgressReading(fileName, 0, 2);
			Assembly modCode;
			string rootDirectory;
			if (modFile.HasFile("All"))
			{
				modCode = Assembly.Load(modFile.GetFile("All"));
			}
			else
			{
				modCode = Assembly.Load(modFile.GetFile(windows ? "Windows" : "Other"));
			}
			Interface.loadMods.SetProgressReading(fileName, 1, 2);
			using (MemoryStream memoryStream = new MemoryStream(modFile.GetFile("Resources")))
			{
				using (BinaryReader reader = new BinaryReader(memoryStream))
				{
					rootDirectory = reader.ReadString();
					for (string path = reader.ReadString(); path != "end"; path = reader.ReadString())
					{
						byte[] data = reader.ReadBytes(reader.ReadInt32());
						files[path] = data;
						if (Main.dedServ)
						{
							continue;
						}
						string extension = Path.GetExtension(path);
						switch (extension)
						{
							case ".png":
								string texturePath = Path.ChangeExtension(path, null);
								using (MemoryStream buffer = new MemoryStream(data))
								{
									textures[texturePath] = Texture2D.FromStream(Main.instance.GraphicsDevice, buffer);
								}
								break;
							case ".wav":
								string soundPath = Path.ChangeExtension(path, null);
								using (MemoryStream buffer = new MemoryStream(data))
								{
									sounds[soundPath] = SoundEffect.FromStream(buffer);
								}
								break;
							case ".mp3":
								string mp3Path = Path.ChangeExtension(path, null);
								string wavCacheFilename = mp3Path.Replace('/', '_') + "_" + properties.version + ".wav";
								if (WAVCacheIO.WAVCacheAvailable(wavCacheFilename))
								{
									sounds[mp3Path] = SoundEffect.FromStream(WAVCacheIO.GetWavStream(wavCacheFilename));
									break;
								}
								ushort wFormatTag = 1;
								ushort nChannels;
								uint nSamplesPerSec;
								uint nAvgBytesPerSec;
								ushort nBlockAlign;
								ushort wBitsPerSample = 16;
								const int headerSize = 44;
								MemoryStream output = new MemoryStream(headerSize + data.Length);
								using (MemoryStream yourMp3FileStream = new MemoryStream(data))
								{
									using (MP3Sharp.MP3Stream input = new MP3Sharp.MP3Stream(yourMp3FileStream))
									{
										using (BinaryWriter writer = new BinaryWriter(output, Encoding.UTF8))
										{
											output.Position = headerSize;
											input.CopyTo(output);
											UInt32 wavDataLength = (UInt32)output.Length - headerSize;
											output.Position = 0;
											nChannels = (ushort)input.ChannelCount;
											nSamplesPerSec = (uint)input.Frequency;
											nBlockAlign = (ushort)(nChannels * (wBitsPerSample / 8));
											nAvgBytesPerSec = (uint)(nSamplesPerSec * nChannels * (wBitsPerSample / 8));
											//write the header
											writer.Write("RIFF".ToCharArray()); //4
											writer.Write((UInt32)(wavDataLength + 36)); // 4
											writer.Write("WAVE".ToCharArray()); //4
											writer.Write("fmt ".ToCharArray()); //4
											writer.Write(16); //4
											writer.Write(wFormatTag);  //
											writer.Write((ushort)nChannels);
											writer.Write(nSamplesPerSec);
											writer.Write(nAvgBytesPerSec);
											writer.Write(nBlockAlign);
											writer.Write(wBitsPerSample);
											writer.Write("data".ToCharArray());
											writer.Write((UInt32)(wavDataLength));
											output.Position = 0;
											WAVCacheIO.SaveWavStream(output, wavCacheFilename);
											sounds[mp3Path] = SoundEffect.FromStream(output);
										}
									}
								}
								break;
						}
					}
				}
			}
			Type[] classes = modCode.GetTypes();
			foreach (Type type in classes)
			{
				if (type.IsSubclassOf(typeof(Mod)))
				{
					Mod mod = (Mod)Activator.CreateInstance(type);
					mod.file = modFile.Name;
					mod.buildVersion = properties.modBuildVersion;
					mod.code = modCode;
					mod.Init();
					if (mod.Name == "Terraria")
					{
						throw new DuplicateNameException("Mods cannot be named Terraria");
					}
					if (mods.ContainsKey(mod.Name))
					{
						throw new DuplicateNameException("Two mods share the internal name " + mod.Name);
					}
					if (rootDirectory != mod.Name)
					{
						throw new MissingResourceException("Mod name " + mod.Name + " does not match source directory name " + rootDirectory);
					}
					mods[mod.Name] = mod;
					loadOrder.Push(mod.Name);
				}
			}
		}
Пример #2
0
		internal static bool CreateModReferenceDlls(BuildProperties properties)
		{
			TmodFile[] refFiles = new TmodFile[properties.modReferences.Length];
			for (int k = 0; k < properties.modReferences.Length; k++)
			{
				string modReference = properties.modReferences[k];
				string filePath = ModLoader.ModPath + Path.DirectorySeparatorChar + modReference + ".tmod";
				TmodFile refFile = new TmodFile(filePath);
				refFile = new TmodFile(filePath);
				refFile.Read();
				if (!refFile.ValidMod())
				{
					ErrorLogger.LogModReferenceError(refFile.Name);
					return false;
				}
				refFiles[k] = refFile;
			}
			for (int k = 0; k < refFiles.Length; k++)
			{
				TmodFile refFile = refFiles[k];
				string modReference = properties.modReferences[k];
				byte[] data1;
				byte[] data2;
				if (refFile.HasFile("All"))
				{
					data1 = refFile.GetFile("All");
					data2 = refFile.GetFile("All");
				}
				else
				{
					data1 = refFile.GetFile("Windows");
					data2 = refFile.GetFile("Other");
				}
				string refFileName = ModLoader.ModSourcePath + Path.DirectorySeparatorChar + modReference;
				File.WriteAllBytes(refFileName + "1.dll", data1);
				File.WriteAllBytes(refFileName + "2.dll", data2);
			}
			return true;
		}
Пример #3
0
 private static void LoadMod(TmodFile modFile, BuildProperties properties)
 {
     AddAssemblyResolver();
     Interface.loadMods.SetProgressReading(Path.GetFileNameWithoutExtension(modFile.Name));
     Assembly modCode;
     string rootDirectory;
     if (modFile.HasFile("All"))
     {
         modCode = Assembly.Load(modFile.GetFile("All"));
     }
     else
     {
         modCode = Assembly.Load(modFile.GetFile(windows ? "Windows" : "Other"));
     }
     using (MemoryStream memoryStream = new MemoryStream(modFile.GetFile("Resources")))
     {
         using (BinaryReader reader = new BinaryReader(memoryStream))
         {
             memoryStream.Seek(reader.ReadInt32(), SeekOrigin.Current);
             rootDirectory = reader.ReadString();
             for (string path = reader.ReadString(); path != "end"; path = reader.ReadString())
             {
                 byte[] data = reader.ReadBytes(reader.ReadInt32());
                 files[path] = data;
                 string extension = Path.GetExtension(path);
                 switch (extension)
                 {
                     case ".png":
                         string texturePath = Path.ChangeExtension(path, null);
                         using (MemoryStream buffer = new MemoryStream(data))
                         {
                             textures[texturePath] = Texture2D.FromStream(Main.instance.GraphicsDevice, buffer);
                         }
                         break;
                     case ".wav":
                         string soundPath = Path.ChangeExtension(path, null);
                         using (MemoryStream buffer = new MemoryStream(data))
                         {
                             sounds[soundPath] = SoundEffect.FromStream(buffer);
                         }
                         break;
                     case ".mp3":
                         // TODO, better way to do this?
                         string mp3Path = Path.ChangeExtension(path, null);
                         MemoryStream wavData = new MemoryStream();
                         MemoryStream wavFile = new MemoryStream();
                         ushort wFormatTag = 1;
                         ushort nChannels;
                         uint nSamplesPerSec;
                         uint nAvgBytesPerSec;
                         ushort nBlockAlign;
                         ushort wBitsPerSample = 16;
                         using (MemoryStream buffer = new MemoryStream(data))
                         {
                             using (MP3Sharp.MP3Stream s = new MP3Sharp.MP3Stream(buffer))
                             {
                                 s.CopyTo(wavData);
                                 nChannels = (ushort)s.ChannelCount;
                                 nSamplesPerSec = (uint)s.Frequency;
                             }
                         }
                         nBlockAlign = (ushort)(nChannels * (wBitsPerSample / 8));
                         nAvgBytesPerSec = (uint)(nSamplesPerSec * nChannels * (wBitsPerSample / 8));
                         using (BinaryWriter bw = new BinaryWriter(wavFile))
                         {
                             bw.Write("RIFF".ToCharArray());
                             bw.Write((UInt32)(wavData.Length + 36));
                             bw.Write("WAVE".ToCharArray());
                             bw.Write("fmt ".ToCharArray());
                             bw.Write(16);
                             bw.Write(wFormatTag);
                             bw.Write(nChannels);
                             bw.Write(nSamplesPerSec);
                             bw.Write(nAvgBytesPerSec);
                             bw.Write(nBlockAlign);
                             bw.Write(wBitsPerSample);
                             bw.Write("data".ToCharArray());
                             bw.Write((UInt32)(wavData.Length));
                             bw.Write(wavData.ToArray());
                         }
                         using (MemoryStream buffer = new MemoryStream(wavFile.ToArray()))
                         {
                             sounds[mp3Path] = SoundEffect.FromStream(buffer);
                         }
                         break;
                 }
             }
         }
     }
     Type[] classes = modCode.GetTypes();
     foreach (Type type in classes)
     {
         if (type.IsSubclassOf(typeof(Mod)))
         {
             Mod mod = (Mod)Activator.CreateInstance(type);
             mod.file = modFile.Name;
             mod.code = modCode;
             mod.Init();
             if (mods.ContainsKey(mod.Name))
             {
                 throw new DuplicateNameException("Two mods share the internal name " + mod.Name);
             }
             if (rootDirectory != mod.Name)
             {
                 throw new MissingResourceException("Mod name " + mod.Name + " does not match source directory name " + rootDirectory);
             }
             mods[mod.Name] = mod;
         }
     }
 }
Пример #4
0
		internal static BuildProperties ReadModFile(TmodFile modFile)
		{
			BuildProperties properties = new BuildProperties();
			byte[] data;
			using (MemoryStream memoryStream = new MemoryStream(modFile.GetFile("Info")))
			{
				using (BinaryReader reader = new BinaryReader(memoryStream))
				{
					properties.modBuildVersion = reader.ReadString();
					data = reader.ReadBytes(reader.ReadInt32());
				}
			}
			if (data.Length == 0)
			{
				return properties;
			}
			using (MemoryStream memoryStream = new MemoryStream(data))
			{
				using (BinaryReader reader = new BinaryReader(memoryStream))
				{
					for (string tag = reader.ReadString(); tag.Length > 0; tag = reader.ReadString())
					{
						if (tag == "dllReferences")
						{
							List<string> dllReferences = new List<string>();
							for (string reference = reader.ReadString(); reference.Length > 0; reference = reader.ReadString())
							{
								dllReferences.Add(reference);
							}
							properties.dllReferences = dllReferences.ToArray();
						}
						if (tag == "modReferences")
						{
							List<string> modReferences = new List<string>();
							for (string reference = reader.ReadString(); reference.Length > 0; reference = reader.ReadString())
							{
								modReferences.Add(reference);
							}
							properties.modReferences = modReferences.ToArray();
						}
						if (tag == "author")
						{
							properties.author = reader.ReadString();
						}
						if (tag == "version")
						{
							properties.version = reader.ReadString();
						}
						if (tag == "displayName")
						{
							properties.displayName = reader.ReadString();
						}
						if (tag == "homepage")
						{
							properties.homepage = reader.ReadString();
						}
						if (tag == "description")
						{
							properties.description = reader.ReadString();
						}
						if (tag == "noCompile")
						{
							properties.noCompile = true;
						}
						if (tag == "!hideCode")
						{
							properties.hideCode = false;
						}
						if (tag == "!hideResources")
						{
							properties.hideResources = false;
						}
						if (tag == "includeSource")
						{
							properties.includeSource = true;
						}
					}
				}
			}
			return properties;
		}
Пример #5
0
 private static BuildProperties ReadBuildProperties(string modDir)
 {
     string propertiesFile = modDir + Path.DirectorySeparatorChar + "build.txt";
     BuildProperties properties = new BuildProperties();
     if (!File.Exists(propertiesFile))
     {
         return properties;
     }
     string[] lines = File.ReadAllLines(propertiesFile);
     foreach (string line in lines)
     {
         if (line.Length == 0)
         {
             continue;
         }
         int split = line.IndexOf('=');
         string property = line.Substring(0, split).Trim();
         string value = line.Substring(split + 1).Trim();
         if (value.Length == 0)
         {
             continue;
         }
         switch (property)
         {
             case "dllReferences":
                 string[] dllReferences = value.Split(',');
                 for (int k = 0; k < dllReferences.Length; k++)
                 {
                     string dllReference = dllReferences[k].Trim();
                     if (dllReference.Length > 0)
                     {
                         dllReferences[k] = dllReference;
                     }
                 }
                 properties.dllReferences = dllReferences;
                 break;
             case "modReferences":
                 string[] modReferences = value.Split(',');
                 for (int k = 0; k < modReferences.Length; k++)
                 {
                     string modReference = modReferences[k].Trim();
                     if (modReference.Length > 0)
                     {
                         modReferences[k] = modReference;
                     }
                 }
                 properties.modReferences = modReferences;
                 break;
             case "author":
                 properties.author = value;
                 break;
             case "version":
                 properties.version = value;
                 break;
             case "displayName":
                 properties.displayName = value;
                 break;
         }
     }
     foreach (string modReference in properties.modReferences)
     {
         TmodFile refFile = new TmodFile(ModPath + Path.DirectorySeparatorChar + modReference + ".tmod");
         refFile.Read();
         if (!refFile.ValidMod())
         {
             ErrorLogger.LogModReferenceError(refFile.Name);
             return null;
         }
         byte[] data1 = refFile.GetFile("Windows");
         byte[] data2 = refFile.GetFile("Other");
         string refFileName = ModSourcePath + Path.DirectorySeparatorChar + modReference;
         File.WriteAllBytes(refFileName + "1.dll", refFile.GetFile("Windows"));
         File.WriteAllBytes(refFileName + "2.dll", refFile.GetFile("Other"));
     }
     return properties;
 }
Пример #6
0
 private static void LoadMod(TmodFile modFile, BuildProperties properties)
 {
     AddAssemblyResolver();
     Interface.loadMods.SetProgressReading(Path.GetFileNameWithoutExtension(modFile.Name));
     Assembly modCode;
     string rootDirectory;
     modCode = Assembly.Load(modFile.GetFile(windows ? "Windows" : "Other"));
     using (MemoryStream memoryStream = new MemoryStream(modFile.GetFile("Resources")))
     {
         using (BinaryReader reader = new BinaryReader(memoryStream))
         {
             memoryStream.Seek(reader.ReadInt32(), SeekOrigin.Current);
             rootDirectory = reader.ReadString();
             for (string path = reader.ReadString(); path != "end"; path = reader.ReadString())
             {
                 byte[] data = reader.ReadBytes(reader.ReadInt32());
                 files[path] = data;
                 string extension = Path.GetExtension(path);
                 switch (extension)
                 {
                     case ".png":
                         string texturePath = Path.ChangeExtension(path, null);
                         using (MemoryStream buffer = new MemoryStream(data))
                         {
                             textures[texturePath] = Texture2D.FromStream(Main.instance.GraphicsDevice, buffer);
                         }
                         break;
                     case ".wav":
                         string soundPath = Path.ChangeExtension(path, null);
                         using (MemoryStream buffer = new MemoryStream(data))
                         {
                             sounds[soundPath] = SoundEffect.FromStream(buffer);
                         }
                         break;
                 }
             }
         }
     }
     Type[] classes = modCode.GetTypes();
     foreach (Type type in classes)
     {
         if (type.IsSubclassOf(typeof(Mod)))
         {
             Mod mod = (Mod)Activator.CreateInstance(type);
             mod.file = modFile.Name;
             mod.code = modCode;
             mod.Init();
             if (mods.ContainsKey(mod.Name))
             {
                 throw new DuplicateNameException("Two mods share the internal name " + mod.Name);
             }
             if (rootDirectory != mod.Name)
             {
                 throw new MissingResourceException("Mod name " + mod.Name + " does not match source directory name " + rootDirectory);
             }
             mods[mod.Name] = mod;
         }
     }
 }
Пример #7
0
 internal static BuildProperties LoadBuildProperties(TmodFile modFile)
 {
     BuildProperties properties = new BuildProperties();
     byte[] data;
     using (MemoryStream memoryStream = new MemoryStream(modFile.GetFile("Resources")))
     {
         using (BinaryReader reader = new BinaryReader(memoryStream))
         {
             data = reader.ReadBytes(reader.ReadInt32());
         }
     }
     if (data.Length == 0)
     {
         return properties;
     }
     using (MemoryStream memoryStream = new MemoryStream(data))
     {
         using (BinaryReader reader = new BinaryReader(memoryStream))
         {
             for (string tag = reader.ReadString(); tag.Length > 0; tag = reader.ReadString())
             {
                 if (tag == "dllReferences")
                 {
                     List<string> dllReferences = new List<string>();
                     for (string reference = reader.ReadString(); reference.Length > 0; reference = reader.ReadString())
                     {
                         dllReferences.Add(reference);
                     }
                     properties.dllReferences = dllReferences.ToArray();
                 }
                 if (tag == "modReferences")
                 {
                     List<string> modReferences = new List<string>();
                     for (string reference = reader.ReadString(); reference.Length > 0; reference = reader.ReadString())
                     {
                         modReferences.Add(reference);
                     }
                     properties.modReferences = modReferences.ToArray();
                 }
                 if (tag == "author")
                 {
                     properties.author = reader.ReadString();
                 }
                 if (tag == "version")
                 {
                     properties.version = reader.ReadString();
                 }
                 if (tag == "displayName")
                 {
                     properties.displayName = reader.ReadString();
                 }
             }
         }
     }
     return properties;
 }