Exemple #1
0
        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;
            }
        }
Exemple #2
0
        //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();
                }
            }
        }
Exemple #3
0
        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}");
        }
Exemple #4
0
        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}");
        }