First commit
This commit is contained in:
107
pathfinding/actions/ActionClimb.java
Normal file
107
pathfinding/actions/ActionClimb.java
Normal file
@@ -0,0 +1,107 @@
|
||||
/*
|
||||
* 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.pathfinding.actions;
|
||||
|
||||
import java.util.Objects;
|
||||
import baritone.ui.LookManager;
|
||||
import baritone.Baritone;
|
||||
import baritone.movement.MovementManager;
|
||||
import baritone.util.Out;
|
||||
import baritone.util.ToolSet;
|
||||
import net.minecraft.block.BlockFalling;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.entity.EntityPlayerSP;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.EnumFacing;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author leijurv
|
||||
*/
|
||||
public class ActionClimb extends ActionPlaceOrBreak {
|
||||
BlockPos[] against = new BlockPos[3];
|
||||
public ActionClimb(BlockPos start, BlockPos end) {
|
||||
super(start, end, new BlockPos[]{end, start.up(2), end.up()}, new BlockPos[]{end.down()});
|
||||
BlockPos placementLocation = positionsToPlace[0];//end.down()
|
||||
int i = 0;
|
||||
if (!placementLocation.north().equals(from)) {
|
||||
against[i] = placementLocation.north();
|
||||
i++;
|
||||
}
|
||||
if (!placementLocation.south().equals(from)) {
|
||||
against[i] = placementLocation.south();
|
||||
i++;
|
||||
}
|
||||
if (!placementLocation.east().equals(from)) {
|
||||
against[i] = placementLocation.east();
|
||||
i++;
|
||||
}
|
||||
if (!placementLocation.west().equals(from)) {
|
||||
against[i] = placementLocation.west();
|
||||
i++;
|
||||
}
|
||||
//TODO: add ability to place against .down() as well as the cardinal directions
|
||||
//useful for when you are starting a staircase without anything to place against
|
||||
}
|
||||
@Override
|
||||
protected double calculateCost(ToolSet ts) {
|
||||
if (!canWalkOn(positionsToPlace[0])) {
|
||||
if (!Baritone.isAir(positionsToPlace[0]) && !isWater(positionsToPlace[0])) {
|
||||
return COST_INF;
|
||||
}
|
||||
for (BlockPos against1 : against) {
|
||||
if (Minecraft.getMinecraft().world.getBlockState(against1).getBlock().isBlockNormalCube()) {
|
||||
return JUMP_ONE_BLOCK_COST + WALK_ONE_BLOCK_COST + PLACE_ONE_BLOCK_COST + getTotalHardnessOfBlocksToBreak(ts);
|
||||
}
|
||||
}
|
||||
return COST_INF;
|
||||
}
|
||||
if (Minecraft.getMinecraft().world.getBlockState(from.up(3)).getBlock() instanceof BlockFalling) {//it would fall on us and possibly suffocate us
|
||||
return COST_INF;
|
||||
}
|
||||
return WALK_ONE_BLOCK_COST / 2 + Math.max(JUMP_ONE_BLOCK_COST, WALK_ONE_BLOCK_COST / 2) + getTotalHardnessOfBlocksToBreak(ts);//we walk half the block to get to the edge, then we walk the other half while simultaneously jumping (math.max because of how it's in parallel)
|
||||
}
|
||||
int ticksWithoutPlacement = 0;
|
||||
@Override
|
||||
protected boolean tick0() {//basically just hold down W and space until we are where we want to be
|
||||
EntityPlayerSP thePlayer = Minecraft.getMinecraft().player;
|
||||
if (!canWalkOn(positionsToPlace[0])) {
|
||||
for (int i = 0; i < against.length; i++) {
|
||||
if (Minecraft.getMinecraft().world.getBlockState(against[i]).getBlock().isBlockNormalCube()) {
|
||||
if (!switchtothrowaway(true)) {//get ready to place a throwaway block
|
||||
return false;
|
||||
}
|
||||
double faceX = (to.getX() + against[i].getX() + 1.0D) * 0.5D;
|
||||
double faceY = (to.getY() + against[i].getY()) * 0.5D;
|
||||
double faceZ = (to.getZ() + against[i].getZ() + 1.0D) * 0.5D;
|
||||
LookManager.lookAtCoords(faceX, faceY, faceZ, true);
|
||||
EnumFacing side = Minecraft.getMinecraft().objectMouseOver.sideHit;
|
||||
if (Objects.equals(Baritone.whatAreYouLookingAt(), against[i]) && Baritone.whatAreYouLookingAt().offset(side).equals(positionsToPlace[0])) {
|
||||
ticksWithoutPlacement++;
|
||||
MovementManager.sneak = true;
|
||||
if (Minecraft.getMinecraft().player.isSneaking()) {
|
||||
Minecraft.getMinecraft().rightClickMouse();
|
||||
}
|
||||
if (ticksWithoutPlacement > 20) {
|
||||
MovementManager.backward = true;//we might be standing in the way, move back
|
||||
}
|
||||
}
|
||||
Out.log("Trying to look at " + against[i] + ", actually looking at" + Baritone.whatAreYouLookingAt());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
Out.gui("This is impossible", Out.Mode.Standard);
|
||||
return false;
|
||||
}
|
||||
double flatDistToNext = Math.abs(to.getX() - from.getX()) * Math.abs((to.getX() + 0.5D) - thePlayer.posX) + Math.abs(to.getZ() - from.getZ()) * Math.abs((to.getZ() + 0.5D) - thePlayer.posZ);
|
||||
boolean pointingInCorrectDirection = MovementManager.moveTowardsBlock(to);
|
||||
MovementManager.jumping = flatDistToNext < 1.2 && pointingInCorrectDirection;
|
||||
//once we are pointing the right way and moving, start jumping
|
||||
//this is slightly more efficient because otherwise we might start jumping before moving, and fall down without moving onto the block we want to jump onto
|
||||
//also wait until we are close enough, because we might jump and hit our head on an adjacent block
|
||||
return Minecraft.getMinecraft().player.getPosition0().equals(to);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user