private void HandlePositionCommand(string[] commandArgs, Position position, MinecraftCommandService minecraft) { var name = commandArgs.Length > 1 ? commandArgs[1] : ""; switch (commandArgs[0]) { case "add": SavedPositions.Positions.Add(new SavedPosition() { Position = position, Name = name }); minecraft.Status($"saved postition {name} at {position}"); break; case "list": if (SavedPositions.Positions.Any()) { minecraft.Status("Positions: " + SavedPositions.Positions.Select(b => $"\n{b.Name} at {b.Position}") .Aggregate((a, b) => a += b)); } else { minecraft.Status("No saved positions."); } break; case "remove": var posToDelete = SavedPositions.Positions.SingleOrDefault(a => a.Name.Equals(name)); if (posToDelete != null) { SavedPositions.Positions.Remove(posToDelete); minecraft.Status($"removed position {posToDelete.Name}"); } break; case "save": //SavedPositions.Positions //JsonConvert break; case "load": break; } }
//http://localhost:8080/fill?from=3%205%203&to=30 3f0 30&tileName=stone&tileData=0 private static void Main() { Console.CancelKeyPress += delegate(object sender, ConsoleCancelEventArgs e) { e.Cancel = true; Program.keepRunning = false; }; using (var codeConnectionProcess = Prerequisites()) { var cmdHandler = new CommandControl(); ; using (var commandService = MinecraftCommandService.Run()) { //check if connected, if not send connection command through AHK var ahk = AutoHotKey.Run(); AutoHotKey.Callback = (s) => { Console.WriteLine(s); var args = s.Split(' '); cmdHandler.HandleCommand(args); }; Console.WriteLine(@" Press Ctrl-C to shutdown."); ahk.ExecRaw(@" WinMinimize Code Connection for Minecraft WinActivate Minecraft send {esc} sleep 500 send / sleep 200 send connect " + wsUrl + "{enter}"); var minecraftAPI = new MinecraftCommandService(); minecraftAPI.Command("executeasother?origin=@p&position=~%20~%20~&command=title%20@s%20title%20WorldEdit%20Started"); while (keepRunning) { Thread.Sleep(500); } minecraftAPI.Command("executeasother?origin=@p&position=~%20~%20~&command=title%20@s%20subtitle WorldEdit Shutting Down"); minecraftAPI.Wait(); MinecraftCommandService.ShutDown(); commandService.Cancel(); } } }
private void HandleCreateCommand(string[] commandArgs, MinecraftCommandService minecraft, Position position, List <SavedPosition> storaedPositions) { var lines = new CreateCommandHandler().Handle(commandArgs, minecraft, position, storaedPositions); var sw = new Stopwatch(); sw.Start(); foreach (var line in lines) { minecraft.Command($"fill?from={line.Start.X} {line.Start.Y} {line.Start.Z}&to={line.End.X} {line.End.Y} {line.End.Z}&tileName={line.Block}&tileData=0"); } sw.Stop(); minecraft.Status($"time to queue commands {sw.Elapsed.TotalSeconds}"); Console.WriteLine($"time to queue commands {sw.Elapsed.TotalSeconds}"); sw.Reset(); sw.Start(); minecraft.Wait(); sw.Stop(); minecraft.Status($"time to complete import {sw.Elapsed.TotalSeconds}"); Console.WriteLine($"time to complete import {sw.Elapsed.TotalSeconds}"); }
public void HandleCommand(string[] args) { var minecraft = new MinecraftCommandService(); var position = minecraft.GetLocation(); var commandArgs = CommandArgs(args); if (args[0].StartsWith("schematic")) { HandelSchematicCommand(commandArgs); } else if (args[0].StartsWith("create")) { HandleCreateCommand(commandArgs, minecraft, position, SavedPositions.Positions); } else if (args[0].StartsWith("pos")) { HandlePositionCommand(commandArgs, position, minecraft); } //measure }
public List <Line> Handle(string[] commandArgs, MinecraftCommandService minecraft, Position position, List <SavedPosition> savedPositions) { var command = commandArgs[0]; var lines = new List <Line>(); switch (command.ToLower()) { case "circle": lines = CreateCircle(commandArgs, position, savedPositions, lines); break; case "ring": lines = CreateRing(commandArgs, position, savedPositions, lines); break; case "walls": lines = CreateWalls(commandArgs, position, savedPositions, lines); break; case "outline": lines = CreateOutline(commandArgs, position, savedPositions, lines); break; case "box": lines = CreateBox(commandArgs, position, savedPositions, lines); break; case "floor": lines = CreateFloor(commandArgs, position, savedPositions, lines); break; case "sphere": lines = CreateSphere(commandArgs, position, savedPositions, lines); break; } return(lines); }
public static void SchematicCommandProcessor(string[] args) { var s = new MinecraftCommandService(); var target = new Position(0, 0, 0); var shift = new Position(0, 0, 0); var rotation = Rotate.None; var command = args[0]; var FileName = ""; var points = new List <Point>(); Schematic schematic; if (args.Length > 1) { FileName = args[1]; if (!FileName.EndsWith("schematic")) { FileName += ".schematic"; } var combine = Path.Combine(ConfigurationManager.AppSettings["data"], FileName); if (!File.Exists(FileName) && File.Exists(combine)) { FileName = combine; } schematic = Schematic.LoadFromFile(FileName); points = schematic.GetPoints(); } var outputFilename = Path.GetFileNameWithoutExtension(FileName) + ".fill"; if (args.Length > 2) { outputFilename = args[2]; } if (args.Length == 6) { target.X = Convert.ToInt32(args[3]); target.Y = Convert.ToInt32(args[4]); target.Z = Convert.ToInt32(args[5]); } switch (command) { case "list": var files = Directory.GetFiles(ConfigurationManager.AppSettings["data"], "*.schematic"); foreach (var file in files) { s.Status(Path.GetFileName(file)); } break; case "analyze": var results = ModelAnalyzer.Analyze(points); var firstGroundLayer = results.Layers.First(a => a.Blocks.Any(b => b.Block.Equals("air") && b.PercentOfLayer >= 0.5)).Y; string output = $"{Path.GetFileName(FileName)} Model Size: X:{results.Width} Y:{results.Height} Z:{results.Length} Ground Level:{firstGroundLayer} Total Blocks:{results.Width*results.Height*results.Length}"; Console.WriteLine(output); s.Status(output); break; case "import": if (args.Length >= 5) { if (args[2].StartsWith("~") || args[3].StartsWith("~") || args[4].StartsWith("~")) { //get current position //parse and add to current position. s.Status("relative positions are not supported."); return; } else { target.X = Convert.ToInt32(args[2]); target.Y = Convert.ToInt32(args[3]); target.Z = Convert.ToInt32(args[4]); } } if (args.Length >= 6) { rotation = (Rotate)Convert.ToInt32(args?[5]); } if (args.Length >= 9) { shift.X = Convert.ToInt32(args[6]); shift.Y = Convert.ToInt32(args[7]); shift.Z = Convert.ToInt32(args[8]); } Console.WriteLine($"importing {FileName} to {target}"); SendCommandsToCodeConnection(target, points, rotation, shift); break; default: break; } Console.WriteLine($"{FileName} ${outputFilename} {target.X} {target.Y} {target.Z}"); }
private static void SendCommandsToCodeConnection(Position target, List <Point> points, Rotate rotation, Position clip = null) { var service = new MinecraftCommandService(); var sw = new Stopwatch(); service.Status("preparing schematic"); if (clip != null) { points = points.Where(a => a.X >= clip.X && a.Y >= clip.Y && a.Z >= clip.Z) .Select(a => a.Shift(clip.Muliply(-1))) .ToList(); } if (rotation != Rotate.None) { sw.Start(); Console.WriteLine($"rotating points..."); var rotatedPoints = points.AsParallel().Select(a => a.Rotate(rotation)).ToList(); Console.WriteLine($"time to rotate {sw.Elapsed}"); sw.Reset(); var measures = ModelAnalyzer.Analyze(rotatedPoints); sw.Start(); Console.WriteLine($"shifting points..."); points = rotatedPoints.AsParallel().Select(a => a.Shift(measures.Minimum.Muliply(-1))).ToList(); Console.WriteLine($"time to shift {sw.Elapsed}"); sw.Reset(); } sw.Start(); Console.WriteLine($"combining points..."); var exportLines = ConvertFileToCommands(points.Where(a => a.BlockId != 0).ToList()); Console.WriteLine($"time to combine {sw.Elapsed}"); sw.Reset(); sw.Start(); var shift = exportLines.AsParallel().Select(a => a.Shift(target)).ToList(); Console.WriteLine($"time to shift {sw.Elapsed}"); sw.Reset(); sw.Start(); var importLines = shift.AsParallel().OrderBy(a => a.Start.Y).ThenBy(a => a.Start.X).ThenBy(a => a.Start.Z).ToList(); Console.WriteLine($"time to sort {sw.Elapsed}"); sw.Reset(); service.Status("starting schematic import"); sw.Start(); foreach (var line in importLines) { service.Command($"fill?from={line.Start.X} {line.Start.Y} {line.Start.Z}&to={line.End.X} {line.End.Y} {line.End.Z}&tileName={line.BlockName}&tileData={line.Data}"); } sw.Stop(); service.Status($"time to queue commands {sw.Elapsed.TotalSeconds}"); Console.WriteLine($"time to queue commands {sw.Elapsed.TotalSeconds}"); sw.Reset(); sw.Start(); service.Wait(); sw.Stop(); service.Status($"time to complete import {sw.Elapsed.TotalSeconds}"); Console.WriteLine($"time to complete import {sw.Elapsed.TotalSeconds}"); }