diff --git a/src/main/java/baritone/bot/pathing/action/Action.java b/src/main/java/baritone/bot/pathing/action/Action.java index 83e559f8..c7c1120b 100644 --- a/src/main/java/baritone/bot/pathing/action/Action.java +++ b/src/main/java/baritone/bot/pathing/action/Action.java @@ -1,25 +1,33 @@ package baritone.bot.pathing.action; import baritone.bot.Baritone; -import baritone.bot.behavior.Behavior; -import baritone.bot.pathing.action.ActionState.ActionStatus; +import baritone.bot.event.AbstractGameEventListener; +import baritone.bot.utils.Helper; import baritone.bot.utils.Utils; import net.minecraft.util.Tuple; import net.minecraft.util.math.BlockPos; +import baritone.bot.pathing.action.ActionState.ActionStatus; +import net.minecraft.util.math.Vec3d; -public abstract class Action extends Behavior { +public abstract class Action implements AbstractGameEventListener, Helper { protected ActionState currentState; public Action(BlockPos dest) { - BlockPos playerEyePos = new BlockPos(player.posX, player.posY + player.getEyeHeight(), player.posZ); - Tuple desiredRotation = Utils.calcRotationFromCoords( - Utils.calcCenterFromCoords(dest, world), - playerEyePos); + this(Utils.calcCenterFromCoords(dest, mc.world)); + } - // There's honestly not a good reason for this (Builder Pattern), I just believed strongly in it + public Action(Vec3d dest) { + this(dest, dest); + } + + public Action(BlockPos dest, Vec3d rotationTarget) { + this(Utils.calcCenterFromCoords(dest, mc.world), rotationTarget); + } + + public Action(Vec3d dest, Vec3d rotationTarget) { currentState = new ActionState() - .setGoal(new ActionState.ActionGoal(dest, desiredRotation)) + .setGoal(new ActionState.ActionGoal(dest, rotationTarget)) .setStatus(ActionStatus.WAITING); } @@ -36,8 +44,10 @@ public abstract class Action extends Behavior { @Override public void onTick() { ActionState latestState = calcState(); - player.setPositionAndRotation(player.posX, player.posY, player.posZ, - latestState.getGoal().rotation.getFirst(), latestState.getGoal().rotation.getSecond()); + Tuple rotation = Utils.calcRotationFromVec3d(mc.player.getPositionEyes(1.0F), + latestState.getGoal().rotation); + player.setPositionAndRotation(mc.player.posX, mc.player.posY, mc.player.posZ, + rotation.getFirst(), rotation.getSecond()); latestState.inputState.forEach((input, forced) -> { Baritone.INSTANCE.getInputOverrideHandler().setInputForceState(input, forced); }); diff --git a/src/main/java/baritone/bot/pathing/action/ActionState.java b/src/main/java/baritone/bot/pathing/action/ActionState.java index 266d1179..996e0211 100644 --- a/src/main/java/baritone/bot/pathing/action/ActionState.java +++ b/src/main/java/baritone/bot/pathing/action/ActionState.java @@ -1,8 +1,7 @@ package baritone.bot.pathing.action; import baritone.bot.InputOverrideHandler.Input; -import net.minecraft.util.Tuple; -import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; import java.util.HashMap; import java.util.Map; @@ -28,16 +27,16 @@ public class ActionState { *

* TODO: Decide desiredMovement type */ - public BlockPos position; + public Vec3d position; /** * Yaw and pitch angles that must be matched *

* getFirst() -> YAW * getSecond() -> PITCH */ - public Tuple rotation; + public Vec3d rotation; - public ActionGoal(BlockPos position, Tuple rotation) { + public ActionGoal(Vec3d position, Vec3d rotation) { this.position = position; this.rotation = rotation; } diff --git a/src/main/java/baritone/bot/pathing/action/actions/ActionAscend.java b/src/main/java/baritone/bot/pathing/action/actions/ActionAscend.java index 61e893db..7c5cd0f6 100644 --- a/src/main/java/baritone/bot/pathing/action/actions/ActionAscend.java +++ b/src/main/java/baritone/bot/pathing/action/actions/ActionAscend.java @@ -14,7 +14,7 @@ public class ActionAscend extends Action { @Override public ActionState calcState() { ActionState latestState = currentState.setInput(InputOverrideHandler.Input.JUMP,true).setInput(InputOverrideHandler.Input.MOVE_FORWARD, true); - if(player.getPosition().equals(latestState.getGoal().position)) + if(mc.player.getPosition().equals(latestState.getGoal().position)) latestState.setStatus(ActionState.ActionStatus.SUCCESS); return latestState; } diff --git a/src/main/java/baritone/bot/utils/Utils.java b/src/main/java/baritone/bot/utils/Utils.java index ca69a0e3..0326c468 100755 --- a/src/main/java/baritone/bot/utils/Utils.java +++ b/src/main/java/baritone/bot/utils/Utils.java @@ -4,6 +4,7 @@ import net.minecraft.block.state.IBlockState; import net.minecraft.util.Tuple; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; /** @@ -13,24 +14,32 @@ import net.minecraft.world.World; public final class Utils { public static Tuple calcRotationFromCoords(BlockPos orig, BlockPos dest) { - double yaw = Math.atan2(orig.getX() - dest.getX(), -orig.getZ() + dest.getZ()); - double dist = Math.sqrt((orig.getX() - dest.getX()) * (orig.getX() - dest.getX()) + (-orig.getZ() + dest.getZ()) * (-orig.getZ() + dest.getZ())); - double pitch = Math.atan2(orig.getY() - dest.getY(), dist); + return calcRotationFromVec3d(vec3dFromBlockPos(orig), vec3dFromBlockPos(dest)); + } + + public static Tuple calcRotationFromVec3d(Vec3d orig, Vec3d dest) { + double yaw = Math.atan2(orig.x - dest.x, -orig.z + dest.z); + double dist = Math.sqrt((orig.x - dest.x) * (orig.x - dest.x) + (-orig.x + dest.x) * (-orig.z + dest.z)); + double pitch = Math.atan2(orig.y - dest.y, dist); return new Tuple<>((float) (yaw * 180 / Math.PI), (float) (pitch * 180 / Math.PI)); } - public static BlockPos calcCenterFromCoords(BlockPos orig, World world) { + public static Vec3d calcCenterFromCoords(BlockPos orig, World world) { IBlockState b = world.getBlockState(orig); AxisAlignedBB bbox = b.getBoundingBox(world, orig); double xDiff = (bbox.minX + bbox.maxX) / 2; double yDiff = (bbox.minY + bbox.maxY) / 2; double zDiff = (bbox.minZ + bbox.maxZ) / 2; - return new BlockPos(orig.getX() + xDiff, + return new Vec3d(orig.getX() + xDiff, orig.getY() + yDiff, orig.getZ() + zDiff); } + public static Vec3d vec3dFromBlockPos(BlockPos orig) { + return new Vec3d(orig.getX() + 0.0D, orig.getY() + 0.0D, orig.getZ() + 0.0D); + } + public static double distanceToCenter(BlockPos pos, double x, double y, double z) { double xdiff = x - (pos.getX() + 0.5D); double ydiff = y - (pos.getY() + 0.5D);