예제 #1
0
		private string GetFilePath(bool isSaveLocation)
		{
			bool exit = false;
			while (!exit)
			{
				string file = MCUtilsConsole.GetInput().Replace("\"", "");
				if (file.StartsWith("exit")) break;
				if (!isSaveLocation)
				{
					if (File.Exists(file))
					{
						return file;
					}
					else
					{
						MCUtilsConsole.WriteWarning("Path is invalid. Try again.");
					}
				}
				else
				{
					if (Directory.Exists(Path.GetDirectoryName(file)))
					{
						return file;
					}
					else
					{
						MCUtilsConsole.WriteWarning("Directory does not exist. Try again.");
					}
				}
			}
			return null;
		}
예제 #2
0
		public void Run()
		{
			MCUtilsConsole.WriteLine("Enter path to region file 1:");
			string r1 = GetFilePath(false);
			if (r1 == null) return;
			MCUtilsConsole.WriteLine("Enter path to region file 2:");
			string r2 = GetFilePath(false);
			if (r2 == null) return;
			MCUtilsConsole.WriteLine("Enter path to map image:");
			string map = GetFilePath(false);
			if (map == null) return;
			MCUtilsConsole.WriteLine("Enter path to output file:");
			string savepath = GetFilePath(true);
			MCUtilsConsole.WriteLine("Starting merge...");
			Region region1;
			Region region2;
			try
			{
				region1 = RegionLoader.LoadRegion(r1);
				region2 = RegionLoader.LoadRegion(r2);
			}
			catch (Exception e)
			{
				MCUtilsConsole.WriteError("Failed to open region file(s):");
				MCUtilsConsole.WriteError(e.ToString());
				return;
			}
			Bitmap mask = new Bitmap(map);
			var merger = new RegionMerger(region1, region2, mask);
			MCUtilsConsole.WriteLine("Merging ...");
			var mergedRegion = merger.Merge();
			MCUtilsConsole.WriteLine("Writing file...");
			FileStream stream = new FileStream(savepath, FileMode.Create);
			RegionSerializer.WriteRegionToStream(mergedRegion, stream, Version.DefaultVersion);
			stream.Close();
			MCUtilsConsole.WriteLine("Done");
		}
예제 #3
0
        ///<summary>Generates a full .mca file stream for use in Minecraft.</summary>
        public static void WriteRegionToStream(Region region, FileStream stream, Version version, bool writeProgressBar = false)
        {
            DateTime time = System.DateTime.Now;

            int[]  locations = new int[1024];
            byte[] sizes     = new byte[1024];
            for (int i = 0; i < 8192; i++)
            {
                stream.WriteByte(0);
            }
            for (int z = 0; z < 32; z++)
            {
                for (int x = 0; x < 32; x++)
                {
                    int i     = z * 32 + x;
                    var chunk = region.chunks[x, z];
                    if (chunk != null)
                    {
                        locations[i] = (int)(stream.Position / 4096);
                        var         chunkData = ChunkSerializer.CreateCompoundForChunk(chunk, version);
                        List <byte> bytes     = new List <byte>();
                        chunkData.WriteToBytes(bytes, true);
                        byte[] compressed = ZlibStream.CompressBuffer(bytes.ToArray());
                        var    cLength    = Converter.ReverseEndianness(BitConverter.GetBytes(compressed.Length));
                        stream.Write(cLength, 0, cLength.Length);
                        stream.WriteByte(2);
                        stream.Write(compressed, 0, compressed.Length);
                        var padding = stream.Length % 4096;
                        //Pad the data to the next 4096 byte mark
                        if (padding > 0)
                        {
                            byte[] paddingBytes = new byte[4096 - padding];
                            stream.Write(paddingBytes, 0, paddingBytes.Length);
                        }
                        sizes[i] = (byte)((int)(stream.Position / 4096) - locations[i]);
                        if (sizes[i] == 0)
                        {
                            throw new InvalidOperationException("0 byte sized chunk detected.");
                        }
                    }
                    else
                    {
                        locations[i] = 0;
                        sizes[i]     = 0;
                    }
                }
                if (writeProgressBar)
                {
                    MCUtilsConsole.WriteProgress(string.Format("Writing chunks to stream [{0}/{1}]", z * 32, 1024), (z * 32f) / 1024f);
                }
            }
            stream.Position = 0;
            for (int i = 0; i < 1024; i++)
            {
                byte[] offsetBytes = Converter.ReverseEndianness(BitConverter.GetBytes(locations[i]));
                stream.WriteByte(offsetBytes[1]);
                stream.WriteByte(offsetBytes[2]);
                stream.WriteByte(offsetBytes[3]);
                stream.WriteByte(sizes[i]);
            }
            DateTime time2 = System.DateTime.Now;
            TimeSpan len   = time2.Subtract(time);

            MCUtilsConsole.WriteLine("Generating MCA took " + Math.Round(len.TotalSeconds * 100f) / 100f + "s");
        }