diff --git a/MinecraftClient/ChatBots/AutoDig.cs b/MinecraftClient/ChatBots/AutoDig.cs index cddb6ffd..17c27895 100644 --- a/MinecraftClient/ChatBots/AutoDig.cs +++ b/MinecraftClient/ChatBots/AutoDig.cs @@ -285,7 +285,7 @@ namespace MinecraftClient.ChatBots if (Config.Mode == Configs.ModeType.lookat || (Config.Mode == Configs.ModeType.both && Config._Locations.Contains(blockLoc))) { - if (DigBlock(blockLoc, lookAtBlock: false)) + if (DigBlock(blockLoc, Direction.Down, lookAtBlock: false)) { currentDig = blockLoc; if (Config.Log_Block_Dig) @@ -346,7 +346,7 @@ namespace MinecraftClient.ChatBots if (minDistance <= 6.0) { - if (DigBlock(target, lookAtBlock: true)) + if (DigBlock(target, Direction.Down, lookAtBlock: true)) { currentDig = target; if (Config.Log_Block_Dig) @@ -380,7 +380,7 @@ namespace MinecraftClient.ChatBots ((Config.List_Type == Configs.ListType.whitelist && Config.Blocks.Contains(block.Type)) || (Config.List_Type == Configs.ListType.blacklist && !Config.Blocks.Contains(block.Type)))) { - if (DigBlock(blockLoc, lookAtBlock: true)) + if (DigBlock(blockLoc, Direction.Down, lookAtBlock: true)) { currentDig = blockLoc; if (Config.Log_Block_Dig) diff --git a/MinecraftClient/ChatBots/Farmer.cs b/MinecraftClient/ChatBots/Farmer.cs index f072ba2e..7c15791c 100644 --- a/MinecraftClient/ChatBots/Farmer.cs +++ b/MinecraftClient/ChatBots/Farmer.cs @@ -831,7 +831,7 @@ namespace MinecraftClient.ChatBots // Yoinked from Daenges's Sugarcane Farmer private bool WaitForDigBlock(Location block, int digTimeout = 1000) { - if (!DigBlock(block.ToFloor())) return false; + if (!DigBlock(block.ToFloor(), Direction.Down)) return false; short i = 0; // Maximum wait time of 10 sec. while (GetWorld().GetBlock(block).Type != Material.Air && i <= digTimeout) { diff --git a/MinecraftClient/ChatBots/WebSocketBot.cs b/MinecraftClient/ChatBots/WebSocketBot.cs index c57f8605..a2d71eb7 100644 --- a/MinecraftClient/ChatBots/WebSocketBot.cs +++ b/MinecraftClient/ChatBots/WebSocketBot.cs @@ -651,9 +651,10 @@ public class WebSocketBot : ChatBot var result = cmd.Parameters.Length switch { - 3 => DigBlock(location), - 4 => DigBlock(location, (bool)cmd.Parameters[3]), - 5 => DigBlock(location, (bool)cmd.Parameters[3], (bool)cmd.Parameters[4]), + // TODO Get blockFace direction from arguments + 3 => DigBlock(location, Direction.Down), + 4 => DigBlock(location, Direction.Down, (bool)cmd.Parameters[3]), + 5 => DigBlock(location, Direction.Down, (bool)cmd.Parameters[3], (bool)cmd.Parameters[4]), _ => false }; diff --git a/MinecraftClient/Commands/Dig.cs b/MinecraftClient/Commands/Dig.cs index 3a00c44b..477e2c77 100644 --- a/MinecraftClient/Commands/Dig.cs +++ b/MinecraftClient/Commands/Dig.cs @@ -22,6 +22,7 @@ namespace MinecraftClient.Commands ); dispatcher.Register(l => l.Literal(CmdName) + // TODO Get blockFace direction from arguments .Executes(r => DigLookAt(r.Source)) .Then(l => l.Argument("Duration", Arguments.Double()) .Executes(r => DigLookAt(r.Source, Arguments.GetDouble(r, "Duration")))) @@ -58,7 +59,7 @@ namespace MinecraftClient.Commands Block block = handler.GetWorld().GetBlock(blockToBreak); if (block.Type == Material.Air) return r.SetAndReturn(Status.Fail, Translations.cmd_dig_no_block); - else if (handler.DigBlock(blockToBreak, duration: duration)) + else if (handler.DigBlock(blockToBreak, Direction.Down, duration: duration)) { blockToBreak = blockToBreak.ToCenter(); return r.SetAndReturn(Status.Done, string.Format(Translations.cmd_dig_dig, blockToBreak.X, blockToBreak.Y, blockToBreak.Z, block.GetTypeString())); @@ -78,7 +79,7 @@ namespace MinecraftClient.Commands return r.SetAndReturn(Status.Fail, Translations.cmd_dig_too_far); else if (block.Type == Material.Air) return r.SetAndReturn(Status.Fail, Translations.cmd_dig_no_block); - else if (handler.DigBlock(blockLoc, lookAtBlock: false, duration: duration)) + else if (handler.DigBlock(blockLoc, Direction.Down, lookAtBlock: false, duration: duration)) return r.SetAndReturn(Status.Done, string.Format(Translations.cmd_dig_dig, blockLoc.X, blockLoc.Y, blockLoc.Z, block.GetTypeString())); else return r.SetAndReturn(Status.Fail, Translations.cmd_dig_fail); diff --git a/MinecraftClient/Mapping/DirectionExtensions.cs b/MinecraftClient/Mapping/DirectionExtensions.cs new file mode 100644 index 00000000..9a42368c --- /dev/null +++ b/MinecraftClient/Mapping/DirectionExtensions.cs @@ -0,0 +1,63 @@ +using System; + +namespace MinecraftClient.Mapping +{ + public static class DirectionExtensions + { + public static Direction GetOpposite(this Direction direction) + { + switch (direction) + { + case Direction.SouthEast: + return Direction.NorthEast; + case Direction.SouthWest: + return Direction.NorthWest; + + case Direction.NorthEast: + return Direction.SouthEast; + case Direction.NorthWest: + return Direction.SouthWest; + + case Direction.West: + return Direction.East; + case Direction.East: + return Direction.West; + + case Direction.North: + return Direction.South; + case Direction.South: + return Direction.North; + + case Direction.Down: + return Direction.Up; + case Direction.Up: + return Direction.Down; + default: + return Direction.Up; + + } + } + + + public static Direction[] HORIZONTAL = + { + Direction.South, + Direction.West, + Direction.North, + Direction.East + }; + + public static Direction FromRotation(double rotation) + { + double floor = Math.Floor((rotation / 90.0) + 0.5); + int value = (int)floor & 3; + + return FromHorizontal(value); + } + + public static Direction FromHorizontal(int value) + { + return HORIZONTAL[Math.Abs(value % HORIZONTAL.Length)]; + } + } +} diff --git a/MinecraftClient/McClient.cs b/MinecraftClient/McClient.cs index f92ce1b8..f005df55 100644 --- a/MinecraftClient/McClient.cs +++ b/MinecraftClient/McClient.cs @@ -1087,6 +1087,15 @@ namespace MinecraftClient #region Getters: Retrieve data for use in other methods or ChatBots + /// + /// Gets the horizontal direction of the takeoff. + /// + /// Return direction of view + public Direction GetHorizontalFacing() + { + return DirectionExtensions.FromRotation(GetYaw()); + } + /// /// Get max length for chat messages /// @@ -2311,22 +2320,22 @@ namespace MinecraftClient return InvokeOnMainThread(() => handler.SendPlayerBlockPlacement((int)hand, location, blockFace, sequenceId++)); } + /// /// Attempt to dig a block at the specified location /// /// Location of block to dig /// Also perform the "arm swing" animation /// Also look at the block before digging - public bool DigBlock(Location location, bool swingArms = true, bool lookAtBlock = true, double duration = 0) + public bool DigBlock(Location location, Direction blockFace, bool swingArms = true, bool lookAtBlock = true, double duration = 0) { + // TODO select best face from current player location + if (!GetTerrainEnabled()) return false; if (InvokeRequired) - return InvokeOnMainThread(() => DigBlock(location, swingArms, lookAtBlock, duration)); - - // TODO select best face from current player location - Direction blockFace = Direction.Down; + return InvokeOnMainThread(() => DigBlock(location, blockFace, swingArms, lookAtBlock, duration)); lock (DigLock) { diff --git a/MinecraftClient/Scripting/ChatBot.cs b/MinecraftClient/Scripting/ChatBot.cs index 14ac29d1..d5a201f0 100644 --- a/MinecraftClient/Scripting/ChatBot.cs +++ b/MinecraftClient/Scripting/ChatBot.cs @@ -1075,11 +1075,12 @@ namespace MinecraftClient.Scripting /// Attempt to dig a block at the specified location /// /// Location of block to dig + /// Example: if your player is under a block that is being destroyed, use Down /// Also perform the "arm swing" animation /// Also look at the block before digging - protected bool DigBlock(Location location, bool swingArms = true, bool lookAtBlock = true) + protected bool DigBlock(Location location, Direction direction, bool swingArms = true, bool lookAtBlock = true) { - return Handler.DigBlock(location, swingArms, lookAtBlock); + return Handler.DigBlock(location, direction, swingArms, lookAtBlock); } /// @@ -1633,6 +1634,15 @@ namespace MinecraftClient.Scripting return Handler.GetProtocolVersion(); } + /// + /// Gets the horizontal direction of the takeoff. + /// + /// Return direction of view + protected Direction GetHorizontalFacing() + { + return Handler.GetHorizontalFacing(); + } + /// /// Invoke a task on the main thread, wait for completion and retrieve return value. ///