From 141a48a15e56446f91b7ff2c9410c2b5b005cc52 Mon Sep 17 00:00:00 2001 From: Brady Date: Tue, 20 Jun 2023 20:30:10 -0500 Subject: [PATCH] Some refactoring, more precise `goingTo` --- .../baritone/behavior/ElytraBehavior.java | 57 +++++++++---------- .../elytra/NetherPathfinderContext.java | 13 +++++ 2 files changed, 39 insertions(+), 31 deletions(-) diff --git a/src/main/java/baritone/behavior/ElytraBehavior.java b/src/main/java/baritone/behavior/ElytraBehavior.java index 7bcedea59..328ee6818 100644 --- a/src/main/java/baritone/behavior/ElytraBehavior.java +++ b/src/main/java/baritone/behavior/ElytraBehavior.java @@ -437,13 +437,13 @@ public final class ElytraBehavior extends Behavior implements IElytraBehavior, H logDirect("no pitch solution, probably gonna crash in a few ticks LOL!!!"); return; } else { - this.aimPos = solution.goingTo; + this.aimPos = new BetterBlockPos(solution.goingTo.x, solution.goingTo.y, solution.goingTo.z); } this.tickUseFireworks( solution.context.start, - solution.context.currentlyBoosted, solution.goingTo, + solution.context.isBoosted, solution.forceUseFirework ); } @@ -465,7 +465,7 @@ public final class ElytraBehavior extends Behavior implements IElytraBehavior, H final List path = context.path; final int playerNear = context.playerNear; final Vec3d start = context.start; - final boolean currentlyBoosted = context.currentlyBoosted; + final boolean isBoosted = context.isBoosted; final IntFunction pathAt = (i) -> new Vec3d( path.get(i).x, @@ -477,9 +477,9 @@ public final class ElytraBehavior extends Behavior implements IElytraBehavior, H Solution solution = null; for (int relaxation = 0; relaxation < 3; relaxation++) { // try for a strict solution first, then relax more and more (if we're in a corner or near some blocks, it will have to relax its constraints a bit) - int[] heights = currentlyBoosted ? new int[]{20, 10, 5, 0} : new int[]{0}; // attempt to gain height, if we can, so as not to waste the boost + int[] heights = isBoosted ? new int[]{20, 10, 5, 0} : new int[]{0}; // attempt to gain height, if we can, so as not to waste the boost float[] interps = new float[] {1.0f, 0.75f, 0.5f, 0.25f}; - int steps = relaxation < 2 ? currentlyBoosted ? 5 : Baritone.settings().elytraSimulationTicks.value : 3; + int steps = relaxation < 2 ? isBoosted ? 5 : Baritone.settings().elytraSimulationTicks.value : 3; int lookahead = relaxation == 0 ? 2 : 3; // ideally this would be expressed as a distance in blocks, rather than a number of voxel steps //int minStep = Math.max(0, playerNear - relaxation); int minStep = playerNear; @@ -499,14 +499,14 @@ public final class ElytraBehavior extends Behavior implements IElytraBehavior, H continue; } if (start.distanceTo(dest) < 40) { - if (!clearView(dest, pathAt.apply(i + lookahead).add(0, dy, 0), false) - || !clearView(dest, pathAt.apply(i + lookahead), false)) { + if (!this.clearView(dest, pathAt.apply(i + lookahead).add(0, dy, 0), false) + || !this.clearView(dest, pathAt.apply(i + lookahead), false)) { // aka: don't go upwards if doing so would prevent us from being able to see the next position **OR** the modified next position continue; } } else { // but if it's far away, allow gaining altitude if we could lose it again by the time we get there - if (!clearView(dest, pathAt.apply(i), false)) { + if (!this.clearView(dest, pathAt.apply(i), false)) { continue; } } @@ -516,23 +516,18 @@ public final class ElytraBehavior extends Behavior implements IElytraBehavior, H final Double grow = relaxation == 2 ? null : relaxation == 0 ? 1.0d : 0.25d; - if (isClear(start, dest, grow, isInLava)) { + if (this.isClear(start, dest, grow, isInLava)) { + // Yaw is trivial, just calculate the rotation required to face the destination final float yaw = RotationUtils.calcRotationFromVec3d(start, dest, ctx.playerRotations()).getYaw(); - final Pair pitch = this.solvePitch(dest.subtract(start), steps, relaxation, currentlyBoosted, isInLava); + final Pair pitch = this.solvePitch(dest.subtract(start), steps, relaxation, isBoosted, isInLava); if (pitch.first() == null) { solution = new Solution(context, new Rotation(yaw, ctx.playerRotations().getPitch()), null, false, false); continue; } // A solution was found with yaw AND pitch, so just immediately return it. - return new Solution( - context, - new Rotation(yaw, pitch.first()), - new BetterBlockPos(dest.x, dest.y, dest.z), - true, - pitch.second() - ); + return new Solution(context, new Rotation(yaw, pitch.first()), dest, true, pitch.second()); } } } @@ -541,7 +536,7 @@ public final class ElytraBehavior extends Behavior implements IElytraBehavior, H return solution; } - private void tickUseFireworks(final Vec3d start, final boolean firework, final BetterBlockPos goingTo, final boolean forceUseFirework) { + private void tickUseFireworks(final Vec3d start, final Vec3d goingTo, final boolean isBoosted, final boolean forceUseFirework) { if (this.remainingSetBackTicks > 0) { logDebug("waiting for elytraFireworkSetbackUseDelay: " + this.remainingSetBackTicks); return; @@ -555,7 +550,7 @@ public final class ElytraBehavior extends Behavior implements IElytraBehavior, H ).lengthSquared(); final double elytraFireworkSpeed = Baritone.settings().elytraFireworkSpeed.value; - if (this.remainingFireworkTicks <= 0 && (forceUseFirework || (!firework + if (this.remainingFireworkTicks <= 0 && (forceUseFirework || (!isBoosted && useOnDescend && (ctx.player().posY < goingTo.y - 5 || start.distanceTo(new Vec3d(goingTo.x + 0.5, ctx.player().posY, goingTo.z + 0.5)) > 5) // UGH!!!!!!! && currentSpeed < elytraFireworkSpeed * elytraFireworkSpeed)) @@ -578,13 +573,13 @@ public final class ElytraBehavior extends Behavior implements IElytraBehavior, H public final List path; public final int playerNear; public final Vec3d start; - public final boolean currentlyBoosted; + public final boolean isBoosted; public SolverContext() { - this.path = ElytraBehavior.this.pathManager.getPath(); - this.playerNear = ElytraBehavior.this.pathManager.getNear(); - this.start = ElytraBehavior.this.ctx.playerFeetAsVec(); - this.currentlyBoosted = ElytraBehavior.this.isFireworkActive(); + this.path = ElytraBehavior.this.pathManager.getPath(); + this.playerNear = ElytraBehavior.this.pathManager.getNear(); + this.start = ElytraBehavior.this.ctx.playerFeetAsVec(); + this.isBoosted = ElytraBehavior.this.isFireworkActive(); } @Override @@ -600,7 +595,7 @@ public final class ElytraBehavior extends Behavior implements IElytraBehavior, H return this.path == other.path // Contents aren't modified, just compare by reference && this.playerNear == other.playerNear && Objects.equals(this.start, other.start) - && this.currentlyBoosted == other.currentlyBoosted; + && this.isBoosted == other.isBoosted; } } @@ -608,11 +603,11 @@ public final class ElytraBehavior extends Behavior implements IElytraBehavior, H public final SolverContext context; public final Rotation rotation; - public final BetterBlockPos goingTo; + public final Vec3d goingTo; public final boolean solvedPitch; public final boolean forceUseFirework; - public Solution(SolverContext context, Rotation rotation, BetterBlockPos goingTo, boolean solvedPitch, boolean forceUseFirework) { + public Solution(SolverContext context, Rotation rotation, Vec3d goingTo, boolean solvedPitch, boolean forceUseFirework) { this.context = context; this.rotation = rotation; this.goingTo = goingTo; @@ -642,7 +637,7 @@ public final class ElytraBehavior extends Behavior implements IElytraBehavior, H } private boolean isClear(final Vec3d start, final Vec3d dest, final Double growAmount, boolean ignoreLava) { - if (!clearView(start, dest, ignoreLava)) { + if (!this.clearView(start, dest, ignoreLava)) { return false; } if (growAmount == null) { @@ -682,7 +677,7 @@ public final class ElytraBehavior extends Behavior implements IElytraBehavior, H final boolean clear; if (!ignoreLava) { // if start == dest then the cpp raytracer dies - clear = start.equals(dest) || this.context.raytrace(start.x, start.y, start.z, dest.x, dest.y, dest.z); + clear = start.equals(dest) || this.context.raytrace(start, dest); } else { clear = ctx.world().rayTraceBlocks(start, dest, false, false, false) == null; } @@ -696,8 +691,8 @@ public final class ElytraBehavior extends Behavior implements IElytraBehavior, H } } - private Pair solvePitch(Vec3d goalDirection, int steps, int relaxation, boolean currentlyBoosted, boolean ignoreLava) { - final Float pitch = this.solvePitch(goalDirection, steps, relaxation == 2, currentlyBoosted, ignoreLava); + private Pair solvePitch(Vec3d goalDirection, int steps, int relaxation, boolean isBoosted, boolean ignoreLava) { + final Float pitch = this.solvePitch(goalDirection, steps, relaxation == 2, isBoosted, ignoreLava); if (pitch != null) { return new Pair<>(pitch, false); } diff --git a/src/main/java/baritone/behavior/elytra/NetherPathfinderContext.java b/src/main/java/baritone/behavior/elytra/NetherPathfinderContext.java index 8dcd87274..da3753bf3 100644 --- a/src/main/java/baritone/behavior/elytra/NetherPathfinderContext.java +++ b/src/main/java/baritone/behavior/elytra/NetherPathfinderContext.java @@ -22,6 +22,7 @@ import dev.babbaj.pathfinder.PathSegment; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; import net.minecraft.world.chunk.BlockStateContainer; import net.minecraft.world.chunk.Chunk; import net.minecraft.world.chunk.storage.ExtendedBlockStorage; @@ -78,6 +79,18 @@ public final class NetherPathfinderContext { return NetherPathfinder.isVisible(this.context, true, startX, startY, startZ, endX, endY, endZ); } + /** + * Performs a raytrace from the given start position to the given end position, returning {@code true} if there is + * visibility between the two points. + * + * @param start The starting point + * @param end The ending point + * @return {@code true} if there is visibility between the points + */ + public boolean raytrace(final Vec3d start, final Vec3d end) { + return NetherPathfinder.isVisible(this.context, true, start.x, start.y, start.z, end.x, end.y, end.z); + } + public boolean raytrace(final int count, final double[] src, final double[] dst, final int visibility) { switch (visibility) { case Visibility.ALL: