sprint through descend, fixes #29 and #38

This commit is contained in:
Leijurv 2018-08-26 08:12:57 -07:00
parent 5c7ffe6ed1
commit 50fd63647b
No known key found for this signature in database
GPG Key ID: 44A3EA646EADAC6A
6 changed files with 74 additions and 8 deletions

View File

@ -147,6 +147,13 @@ public class Settings {
*/ */
public Setting<Integer> maxFallHeightBucket = new Setting<>(20); public Setting<Integer> maxFallHeightBucket = new Setting<>(20);
/**
* Is it okay to sprint through a descend followed by a diagonal?
* The player overshoots the landing, but not enough to fall off. And the diagonal ensures that there isn't
* lava or anything that's !canWalkInto in that space, so it's technically safe, just a little sketchy.
*/
public Setting<Boolean> allowOvershootDiagonalDescend = new Setting<>(true);
/** /**
* If your goal is a GoalBlock in an unloaded chunk, assume it's far enough away that the Y coord * If your goal is a GoalBlock in an unloaded chunk, assume it's far enough away that the Y coord
* doesn't matter yet, and replace it with a GoalXZ to the same place before calculating a path. * doesn't matter yet, and replace it with a GoalXZ to the same place before calculating a path.

View File

@ -104,7 +104,6 @@ public abstract class Movement implements Helper, MovementHelper {
* @return Status * @return Status
*/ */
public MovementStatus update() { public MovementStatus update() {
player().setSprinting(false);
MovementState latestState = updateState(currentState); MovementState latestState = updateState(currentState);
if (BlockStateInterface.isLiquid(playerFeet())) { if (BlockStateInterface.isLiquid(playerFeet())) {
latestState.setInput(Input.JUMP, true); latestState.setInput(Input.JUMP, true);
@ -269,6 +268,10 @@ public abstract class Movement implements Helper, MovementHelper {
return state; return state;
} }
public BlockPos getDirection() {
return getDest().subtract(getSrc());
}
public List<BlockPos> toBreakCached = null; public List<BlockPos> toBreakCached = null;
public List<BlockPos> toPlaceCached = null; public List<BlockPos> toPlaceCached = null;
public List<BlockPos> toWalkIntoCached = null; public List<BlockPos> toWalkIntoCached = null;

View File

@ -158,7 +158,7 @@ public interface MovementHelper extends ActionCosts, Helper {
return true; return true;
} }
return (facing == playerFacing) == open; return facing == playerFacing == open;
} }
static boolean avoidWalkingInto(Block block) { static boolean avoidWalkingInto(Block block) {

View File

@ -17,12 +17,12 @@
package baritone.pathing.movement.movements; package baritone.pathing.movement.movements;
import baritone.Baritone;
import baritone.pathing.movement.CalculationContext; import baritone.pathing.movement.CalculationContext;
import baritone.pathing.movement.Movement; import baritone.pathing.movement.Movement;
import baritone.pathing.movement.MovementHelper; import baritone.pathing.movement.MovementHelper;
import baritone.pathing.movement.MovementState; import baritone.pathing.movement.MovementState;
import baritone.utils.BlockStateInterface; import baritone.utils.BlockStateInterface;
import baritone.utils.InputOverrideHandler;
import net.minecraft.block.BlockMagma; import net.minecraft.block.BlockMagma;
import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.IBlockState;
import net.minecraft.init.Blocks; import net.minecraft.init.Blocks;
@ -65,8 +65,8 @@ public class MovementDiagonal extends Movement {
state.setStatus(MovementState.MovementStatus.SUCCESS); state.setStatus(MovementState.MovementStatus.SUCCESS);
return state; return state;
} }
if (!BlockStateInterface.isLiquid(playerFeet()) && Baritone.settings().allowSprint.get()) { if (!BlockStateInterface.isLiquid(playerFeet())) {
player().setSprinting(true); state.setInput(InputOverrideHandler.Input.SPRINT, true);
} }
MovementHelper.moveTowards(state, dest); MovementHelper.moveTowards(state, dest);
return state; return state;

View File

@ -17,7 +17,6 @@
package baritone.pathing.movement.movements; package baritone.pathing.movement.movements;
import baritone.Baritone;
import baritone.behavior.impl.LookBehaviorUtils; import baritone.behavior.impl.LookBehaviorUtils;
import baritone.pathing.movement.CalculationContext; import baritone.pathing.movement.CalculationContext;
import baritone.pathing.movement.Movement; import baritone.pathing.movement.Movement;
@ -190,8 +189,8 @@ public class MovementTraverse extends Movement {
state.setStatus(MovementState.MovementStatus.SUCCESS); state.setStatus(MovementState.MovementStatus.SUCCESS);
return state; return state;
} }
if (wasTheBridgeBlockAlwaysThere && !BlockStateInterface.isLiquid(playerFeet()) && Baritone.settings().allowSprint.get()) { if (wasTheBridgeBlockAlwaysThere && !BlockStateInterface.isLiquid(playerFeet())) {
player().setSprinting(true); state.setInput(InputOverrideHandler.Input.SPRINT, true);
} }
Block destDown = BlockStateInterface.get(dest.down()).getBlock(); Block destDown = BlockStateInterface.get(dest.down()).getBlock();
if (ladder && (destDown instanceof BlockVine || destDown instanceof BlockLadder)) { if (ladder && (destDown instanceof BlockVine || destDown instanceof BlockLadder)) {

View File

@ -22,6 +22,9 @@ import baritone.event.events.TickEvent;
import baritone.pathing.movement.ActionCosts; import baritone.pathing.movement.ActionCosts;
import baritone.pathing.movement.Movement; import baritone.pathing.movement.Movement;
import baritone.pathing.movement.MovementState; import baritone.pathing.movement.MovementState;
import baritone.pathing.movement.movements.MovementDescend;
import baritone.pathing.movement.movements.MovementDiagonal;
import baritone.pathing.movement.movements.MovementTraverse;
import baritone.utils.BlockStateInterface; import baritone.utils.BlockStateInterface;
import baritone.utils.Helper; import baritone.utils.Helper;
import net.minecraft.client.entity.EntityPlayerSP; import net.minecraft.client.entity.EntityPlayerSP;
@ -228,6 +231,7 @@ public class PathExecutor implements Helper {
onTick(event); onTick(event);
return true; return true;
} else { } else {
sprintIfRequested();
ticksOnCurrent++; ticksOnCurrent++;
if (ticksOnCurrent > currentMovementInitialCostEstimate + Baritone.settings().movementTimeoutTicks.get()) { if (ticksOnCurrent > currentMovementInitialCostEstimate + Baritone.settings().movementTimeoutTicks.get()) {
// only fail if the total time has exceeded the initial estimate // only fail if the total time has exceeded the initial estimate
@ -245,6 +249,59 @@ public class PathExecutor implements Helper {
return false; // movement is in progress return false; // movement is in progress
} }
private void sprintIfRequested() {
if (!Baritone.settings().allowSprint.get()) {
player().setSprinting(false);
return;
}
if (Baritone.INSTANCE.getInputOverrideHandler().isInputForcedDown(mc.gameSettings.keyBindSprint)) {
if (!player().isSprinting()) {
player().setSprinting(true);
}
return;
}
Movement movement = path.movements().get(pathPosition);
if (movement instanceof MovementDescend && pathPosition < path.length() - 2) {
Movement next = path.movements().get(pathPosition + 1);
if (next instanceof MovementDescend) {
if (next.getDirection().equals(movement.getDirection())) {
if (playerFeet().equals(movement.getDest())) {
pathPosition++;
Baritone.INSTANCE.getInputOverrideHandler().clearAllKeys();
}
if (!player().isSprinting()) {
player().setSprinting(true);
}
return;
}
}
if (next instanceof MovementTraverse) {
if (next.getDirection().down().equals(movement.getDirection())) {
if (playerFeet().equals(movement.getDest())) {
pathPosition++;
Baritone.INSTANCE.getInputOverrideHandler().clearAllKeys();
}
if (!player().isSprinting()) {
player().setSprinting(true);
}
return;
}
}
if (next instanceof MovementDiagonal && Baritone.settings().allowOvershootDiagonalDescend.get()) {
if (playerFeet().equals(movement.getDest())) {
pathPosition++;
Baritone.INSTANCE.getInputOverrideHandler().clearAllKeys();
}
if (!player().isSprinting()) {
player().setSprinting(true);
}
return;
}
displayChatMessageRaw("Turning off sprinting " + movement + " " + next + " " + movement.getDirection() + " " + next.getDirection().down() + " " + next.getDirection().down().equals(movement.getDirection()));
}
player().setSprinting(false);
}
public int getPosition() { public int getPosition() {
return pathPosition; return pathPosition;
} }