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; }
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"); }
///<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"); }