diff --git a/src/api/java/baritone/api/pathing/goals/GoalXZ.java b/src/api/java/baritone/api/pathing/goals/GoalXZ.java
index 5ad23336..86511b54 100644
--- a/src/api/java/baritone/api/pathing/goals/GoalXZ.java
+++ b/src/api/java/baritone/api/pathing/goals/GoalXZ.java
@@ -93,7 +93,7 @@ public class GoalXZ implements Goal {
float theta = (float) Math.toRadians(yaw);
double x = origin.x - MathHelper.sin(theta) * distance;
double z = origin.z + MathHelper.cos(theta) * distance;
- return new GoalXZ((int) x, (int) z);
+ return new GoalXZ(MathHelper.floor(x), MathHelper.floor(z));
}
public int getX() {
diff --git a/src/api/java/baritone/api/utils/command/argparser/DefaultArgParsers.java b/src/api/java/baritone/api/utils/command/argparser/DefaultArgParsers.java
index 301ad891..03d3b5c9 100644
--- a/src/api/java/baritone/api/utils/command/argparser/DefaultArgParsers.java
+++ b/src/api/java/baritone/api/utils/command/argparser/DefaultArgParsers.java
@@ -50,7 +50,7 @@ public class DefaultArgParsers {
public Float parseArg(CommandArgument arg) throws RuntimeException {
String value = arg.value;
- if (!value.matches("^[+-]?\\d+(?:\\.\\d+)$")) {
+ if (!value.matches("^([+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)|)$")) {
throw new RuntimeException("failed float format check");
}
@@ -69,7 +69,7 @@ public class DefaultArgParsers {
public Double parseArg(CommandArgument arg) throws RuntimeException {
String value = arg.value;
- if (!value.matches("^[+-]?\\d+(?:\\.\\d+)$")) {
+ if (!value.matches("^([+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)|)$")) {
throw new RuntimeException("failed double format check");
}
diff --git a/src/api/java/baritone/api/utils/command/defaults/DefaultCommands.java b/src/api/java/baritone/api/utils/command/defaults/DefaultCommands.java
index fac6422f..9d260e76 100644
--- a/src/api/java/baritone/api/utils/command/defaults/DefaultCommands.java
+++ b/src/api/java/baritone/api/utils/command/defaults/DefaultCommands.java
@@ -60,6 +60,7 @@ public class DefaultCommands {
new BlacklistCommand(),
new FindCommand(),
new MineCommand(),
- new ClickCommand()
+ new ClickCommand(),
+ new ThisWayCommand()
));
}
diff --git a/src/api/java/baritone/api/utils/command/defaults/ThisWayCommand.java b/src/api/java/baritone/api/utils/command/defaults/ThisWayCommand.java
new file mode 100644
index 00000000..5eeeeba9
--- /dev/null
+++ b/src/api/java/baritone/api/utils/command/defaults/ThisWayCommand.java
@@ -0,0 +1,63 @@
+/*
+ * This file is part of Baritone.
+ *
+ * Baritone is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Baritone is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Baritone. If not, see .
+ */
+
+package baritone.api.utils.command.defaults;
+
+import baritone.api.Settings;
+import baritone.api.pathing.goals.GoalXZ;
+import baritone.api.utils.command.Command;
+import baritone.api.utils.command.helpers.arguments.ArgConsumer;
+
+import java.util.List;
+import java.util.stream.Stream;
+
+import static java.util.Arrays.asList;
+
+public class ThisWayCommand extends Command {
+ public ThisWayCommand() {
+ super(asList("thisway", "forward"), "Travel in your current direction");
+ }
+
+ @Override
+ protected void executed(String label, ArgConsumer args, Settings settings) {
+ args.requireExactly(1);
+
+ GoalXZ goal = GoalXZ.fromDirection(
+ ctx.playerFeetAsVec(),
+ ctx.player().rotationYawHead,
+ args.getAs(Double.class)
+ );
+
+ baritone.getCustomGoalProcess().setGoal(goal);
+ logDirect(String.format("Goal: %s", goal));
+ }
+
+ @Override
+ protected Stream tabCompleted(String label, ArgConsumer args, Settings settings) {
+ return Stream.empty();
+ }
+
+ @Override
+ public List getLongDesc() {
+ return asList(
+ "Creates a GoalXZ some amount of blocks in the direction you're currently looking",
+ "",
+ "Usage:",
+ "> thisway - makes a GoalXZ distance blocks in front of you"
+ );
+ }
+}