baritone/movement/MovementManager.java

203 lines
6.5 KiB
Java

/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package baritone.movement;
import baritone.ui.LookManager;
import net.minecraft.block.Block;
import net.minecraft.block.BlockLadder;
import net.minecraft.block.BlockVine;
import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.EntityPlayerSP;
import net.minecraft.util.math.BlockPos;
/**
*
* @author leijurv
*/
public class MovementManager {
public static boolean forward = false;
public static int leftPressTime = 0;
public static boolean isRightClick = false;
public static int rightPressTime = 0;
public static boolean right = false;
public static boolean left = false;
public static boolean jumping = false;
public static boolean sneak = false;
public static boolean isLeftClick = false;
public static boolean backward = false;
/**
* calls moveTowardsCoords on the center of this block
*
* @param p
* @return am I moving, or am I still rotating
*/
public static boolean moveTowardsBlock(BlockPos p) {
return moveTowardsBlock(p, true);
}
public static boolean moveTowardsBlock(BlockPos p, boolean rotate) {
Block b = Minecraft.getMinecraft().world.getBlockState(p).getBlock();
double xDiff = (b.getBlockBoundsMinX() + b.getBlockBoundsMaxX()) / 2;
double yolo = (b.getBlockBoundsMinY() + b.getBlockBoundsMaxY()) / 2;
double zDiff = (b.getBlockBoundsMinZ() + b.getBlockBoundsMaxZ()) / 2;
if (b instanceof BlockLadder || b instanceof BlockVine) {
xDiff = 0.5;
yolo = 0.5;
zDiff = 0.5;
}
double x = p.getX() + xDiff;
double y = p.getY() + yolo;
double z = p.getZ() + zDiff;
return moveTowardsCoords(x, y, z, rotate);
}
/**
* Clears movement, but nothing else. Includes jumping and sneaking, but not
* left clicking.
*/
public static void clearMovement() {
jumping = false;
forward = false;
left = false;
right = false;
backward = false;
sneak = false;
isRightClick = false;
//rightPressTime = 0;
isLeftClick = false;
//leftPressTime = 0;
}
/**
* Do not question the logic. Called by Minecraft.java
*
* @return
*/
public static boolean rightIsPressed() {
if (rightPressTime <= 0) {
return false;
} else {
--rightPressTime;
return true;
}
}
/**
* Called by our code
*/
public static void letGoOfLeftClick() {
leftPressTime = 0;
isLeftClick = false;
}
/**
* Do not question the logic. Called by Minecraft.java
*
* @return
*/
public static boolean getLeftIsPressed() {
return isLeftClick && leftPressTime >= -2;
}
/**
* Do not question the logic. Called by Minecraft.java
*
* @return
*/
public static boolean leftIsPressed() {
if (leftPressTime <= 0) {
return false;
} else {
--leftPressTime;
return true;
}
}
/**
* Do not question the logic. Called by Minecraft.java
*
* @return
*/
public static boolean getRightIsPressed() {
return isRightClick && rightPressTime >= -2;
}
public static boolean moveTowardsCoords(double x, double y, double z) {
return moveTowardsCoords(x, y, z, true);
}
/**
* Move towards coordinates, not necesarily forwards. e.g. if coordinates
* are closest to being directly behind us, go backwards. This minimizes
* time spent waiting for rotating
*
* @param x
* @param y
* @param z
* @param doRotate
* @return true if we are moving, false if we are still rotating. we will
* rotate until within ANGLE_THRESHOLD (currently 7°) of moving in correct
* direction
*/
public static boolean moveTowardsCoords(double x, double y, double z, boolean doRotate) {
boolean rotate = doRotate;
EntityPlayerSP thePlayer = Minecraft.getMinecraft().player;
float currentYaw = thePlayer.rotationYaw;
float yaw = (float) (Math.atan2(thePlayer.posX - x, -thePlayer.posZ + z) * 180 / Math.PI);
float diff = yaw - currentYaw;
if (diff < 0) {
diff += 360;
}
float distanceToForward = Math.min(Math.abs(diff - 0), Math.abs(diff - 360)) % 360;
float distanceToForwardRight = Math.abs(diff - 45) % 360;
float distanceToRight = Math.abs(diff - 90) % 360;
float distanceToBackwardRight = Math.abs(diff - 135) % 360;
float distanceToBackward = Math.abs(diff - 180) % 360;
float distanceToBackwardLeft = Math.abs(diff - 225) % 360;
float distanceToLeft = Math.abs(diff - 270) % 360;
float distanceToForwardLeft = Math.abs(diff - 315) % 360;
float tmp = Math.round(diff / 45) * 45;
if (tmp > 359) {
tmp -= 360;
}
if (rotate) {
if (LookManager.lookingYaw()) {//if something else has set the yaw, just move anyway
rotate = false;
}
LookManager.setDesiredYaw(yaw - tmp);
}
double t = rotate ? LookManager.ANGLE_THRESHOLD : 23;
if (distanceToForward < t || distanceToForward > 360 - t) {
forward = true;
return true;
}
if (distanceToForwardLeft < t || distanceToForwardLeft > 360 - t) {
forward = true;
left = true;
return true;
}
if (distanceToForwardRight < t || distanceToForwardRight > 360 - t) {
forward = true;
right = true;
return true;
}
if (distanceToBackward < t || distanceToBackward > 360 - t) {
backward = true;
return true;
}
if (distanceToBackwardLeft < t || distanceToBackwardLeft > 360 - t) {
backward = true;
left = true;
return true;
}
if (distanceToBackwardRight < t || distanceToBackwardRight > 360 - t) {
backward = true;
right = true;
return true;
}
if (distanceToLeft < t || distanceToLeft > 360 - t) {
left = true;
return true;
}
if (distanceToRight < t || distanceToRight > 360 - t) {
right = true;
return true;
}
return false;
}
}