From 9a6241af8a5cf4d8bd686ccefc3a3dab11dbfeff Mon Sep 17 00:00:00 2001 From: Babbaj Date: Sun, 16 Jul 2023 22:56:17 -0400 Subject: [PATCH] refactor elytra into being just a process --- src/api/java/baritone/api/IBaritone.java | 13 +- .../IElytraProcess.java} | 9 +- src/main/java/baritone/Baritone.java | 11 +- .../baritone/behavior/PathingBehavior.java | 2 +- .../command/defaults/ElytraCommand.java | 4 +- .../defaults/ExecutionControlCommands.java | 2 +- .../command/defaults/ForceCancelCommand.java | 2 +- .../java/baritone/process/ElytraProcess.java | 255 ++++++++++++++++ .../elytra/BlockStateOctreeInterface.java | 2 +- .../elytra/LegacyElytraBehavior.java} | 275 +++--------------- .../elytra/NetherPath.java | 2 +- .../elytra/NetherPathfinderContext.java | 4 +- .../elytra/NullElytraProcess.java} | 26 +- .../elytra/PathCalculationException.java | 2 +- .../elytra/UnpackedSegment.java | 2 +- 15 files changed, 340 insertions(+), 271 deletions(-) rename src/api/java/baritone/api/{behavior/IElytraBehavior.java => process/IElytraProcess.java} (87%) create mode 100644 src/main/java/baritone/process/ElytraProcess.java rename src/main/java/baritone/{behavior => process}/elytra/BlockStateOctreeInterface.java (98%) rename src/main/java/baritone/{behavior/ElytraBehavior.java => process/elytra/LegacyElytraBehavior.java} (84%) rename src/main/java/baritone/{behavior => process}/elytra/NetherPath.java (98%) rename src/main/java/baritone/{behavior => process}/elytra/NetherPathfinderContext.java (98%) rename src/main/java/baritone/{behavior/elytra/NullElytraBehavior.java => process/elytra/NullElytraProcess.java} (72%) rename src/main/java/baritone/{behavior => process}/elytra/PathCalculationException.java (96%) rename src/main/java/baritone/{behavior => process}/elytra/UnpackedSegment.java (98%) diff --git a/src/api/java/baritone/api/IBaritone.java b/src/api/java/baritone/api/IBaritone.java index 0913a8c43..3c9681532 100644 --- a/src/api/java/baritone/api/IBaritone.java +++ b/src/api/java/baritone/api/IBaritone.java @@ -17,7 +17,6 @@ package baritone.api; -import baritone.api.behavior.IElytraBehavior; import baritone.api.behavior.ILookBehavior; import baritone.api.behavior.IPathingBehavior; import baritone.api.cache.IWorldProvider; @@ -41,12 +40,6 @@ public interface IBaritone { */ IPathingBehavior getPathingBehavior(); - /** - * @return The {@link IElytraBehavior} instance - * @see IElytraBehavior - */ - IElytraBehavior getElytraBehavior(); - /** * @return The {@link ILookBehavior} instance * @see ILookBehavior @@ -95,6 +88,12 @@ public interface IBaritone { */ IGetToBlockProcess getGetToBlockProcess(); + /** + * @return The {@link IElytraProcess} instance + * @see IElytraProcess + */ + IElytraProcess getElytraProcess(); + /** * @return The {@link IWorldProvider} instance * @see IWorldProvider diff --git a/src/api/java/baritone/api/behavior/IElytraBehavior.java b/src/api/java/baritone/api/process/IElytraProcess.java similarity index 87% rename from src/api/java/baritone/api/behavior/IElytraBehavior.java rename to src/api/java/baritone/api/process/IElytraProcess.java index 95ae62926..06c658f42 100644 --- a/src/api/java/baritone/api/behavior/IElytraBehavior.java +++ b/src/api/java/baritone/api/process/IElytraProcess.java @@ -15,13 +15,13 @@ * along with Baritone. If not, see . */ -package baritone.api.behavior; +package baritone.api.process; import net.minecraft.util.math.BlockPos; import java.util.concurrent.CompletableFuture; -public interface IElytraBehavior extends IBehavior { +public interface IElytraProcess extends IBaritoneProcess { /** * Marks the nether pathfinder context to be reset when it is safe to do so. Because this operation is not @@ -37,11 +37,6 @@ public interface IElytraBehavior extends IBehavior { void cancel(); - /** - * Returns {@code true} if the current {@link IElytraBehavior} is actively pathing. - */ - boolean isActive(); - /** * @return {@code true} if the native library loaded and elytra is actually usable */ diff --git a/src/main/java/baritone/Baritone.java b/src/main/java/baritone/Baritone.java index 61866e927..c6d31a3dd 100755 --- a/src/main/java/baritone/Baritone.java +++ b/src/main/java/baritone/Baritone.java @@ -21,9 +21,9 @@ import baritone.api.BaritoneAPI; import baritone.api.IBaritone; import baritone.api.Settings; import baritone.api.behavior.IBehavior; -import baritone.api.behavior.IElytraBehavior; import baritone.api.event.listener.IEventBus; import baritone.api.process.IBaritoneProcess; +import baritone.api.process.IElytraProcess; import baritone.api.utils.IPlayerContext; import baritone.behavior.*; import baritone.cache.WorldProvider; @@ -68,7 +68,6 @@ public class Baritone implements IBaritone { private final List behaviors; private final PathingBehavior pathingBehavior; - private final IElytraBehavior elytraBehavior; private final LookBehavior lookBehavior; private final InventoryBehavior inventoryBehavior; private final InputOverrideHandler inputOverrideHandler; @@ -81,6 +80,7 @@ public class Baritone implements IBaritone { private final ExploreProcess exploreProcess; private final FarmProcess farmProcess; private final InventoryPauserProcess inventoryPauserProcess; + private final ElytraProcess elytraProcess; private final PathingControlManager pathingControlManager; private final SelectionManager selectionManager; @@ -108,7 +108,6 @@ public class Baritone implements IBaritone { { this.lookBehavior = this.registerBehavior(LookBehavior::new); - this.elytraBehavior = this.registerBehavior(ElytraBehavior::create); this.pathingBehavior = this.registerBehavior(PathingBehavior::new); this.inventoryBehavior = this.registerBehavior(InventoryBehavior::new); this.inputOverrideHandler = this.registerBehavior(InputOverrideHandler::new); @@ -125,6 +124,8 @@ public class Baritone implements IBaritone { this.exploreProcess = this.registerProcess(ExploreProcess::new); this.farmProcess = this.registerProcess(FarmProcess::new); this.inventoryPauserProcess = this.registerProcess(InventoryPauserProcess::new); + this.elytraProcess = this.registerProcess(ElytraProcess::create); + this.registerProcess(BackfillProcess::new); } @@ -241,8 +242,8 @@ public class Baritone implements IBaritone { } @Override - public IElytraBehavior getElytraBehavior() { - return this.elytraBehavior; + public IElytraProcess getElytraProcess() { + return this.elytraProcess; } @Override diff --git a/src/main/java/baritone/behavior/PathingBehavior.java b/src/main/java/baritone/behavior/PathingBehavior.java index 670dd827c..0404921ae 100644 --- a/src/main/java/baritone/behavior/PathingBehavior.java +++ b/src/main/java/baritone/behavior/PathingBehavior.java @@ -310,7 +310,7 @@ public final class PathingBehavior extends Behavior implements IPathingBehavior, public boolean isSafeToCancel() { if (current == null) { - return !baritone.getElytraBehavior().isActive() || baritone.getElytraBehavior().isSafeToCancel(); + return !baritone.getElytraProcess().isActive() || baritone.getElytraProcess().isSafeToCancel(); } return safeToCancel; } diff --git a/src/main/java/baritone/command/defaults/ElytraCommand.java b/src/main/java/baritone/command/defaults/ElytraCommand.java index 5288ade47..05695d82b 100644 --- a/src/main/java/baritone/command/defaults/ElytraCommand.java +++ b/src/main/java/baritone/command/defaults/ElytraCommand.java @@ -18,7 +18,6 @@ package baritone.command.defaults; import baritone.api.IBaritone; -import baritone.api.behavior.IElytraBehavior; import baritone.api.command.Command; import baritone.api.command.argument.IArgConsumer; import baritone.api.command.exception.CommandException; @@ -27,6 +26,7 @@ import baritone.api.pathing.goals.Goal; import baritone.api.pathing.goals.GoalBlock; import baritone.api.pathing.goals.GoalXZ; import baritone.api.process.ICustomGoalProcess; +import baritone.api.process.IElytraProcess; import net.minecraft.util.math.BlockPos; import java.util.Arrays; @@ -42,7 +42,7 @@ public class ElytraCommand extends Command { @Override public void execute(String label, IArgConsumer args) throws CommandException { final ICustomGoalProcess customGoalProcess = baritone.getCustomGoalProcess(); - final IElytraBehavior elytra = baritone.getElytraBehavior(); + final IElytraProcess elytra = baritone.getElytraProcess(); if (!elytra.isLoaded()) { final String osArch = System.getProperty("os.arch"); final String osName = System.getProperty("os.name"); diff --git a/src/main/java/baritone/command/defaults/ExecutionControlCommands.java b/src/main/java/baritone/command/defaults/ExecutionControlCommands.java index 43adca19f..b91014a67 100644 --- a/src/main/java/baritone/command/defaults/ExecutionControlCommands.java +++ b/src/main/java/baritone/command/defaults/ExecutionControlCommands.java @@ -180,7 +180,7 @@ public class ExecutionControlCommands { paused[0] = false; } baritone.getPathingBehavior().cancelEverything(); - baritone.getElytraBehavior().cancel(); + baritone.getElytraProcess().cancel(); // TODO: this shouldnt be necessary logDirect("ok canceled"); } diff --git a/src/main/java/baritone/command/defaults/ForceCancelCommand.java b/src/main/java/baritone/command/defaults/ForceCancelCommand.java index ad19f168c..d86cddd5e 100644 --- a/src/main/java/baritone/command/defaults/ForceCancelCommand.java +++ b/src/main/java/baritone/command/defaults/ForceCancelCommand.java @@ -39,7 +39,7 @@ public class ForceCancelCommand extends Command { IPathingBehavior pathingBehavior = baritone.getPathingBehavior(); pathingBehavior.cancelEverything(); pathingBehavior.forceCancel(); - baritone.getElytraBehavior().cancel(); + baritone.getElytraProcess().cancel(); logDirect("ok force canceled"); } diff --git a/src/main/java/baritone/process/ElytraProcess.java b/src/main/java/baritone/process/ElytraProcess.java new file mode 100644 index 000000000..121b37b8a --- /dev/null +++ b/src/main/java/baritone/process/ElytraProcess.java @@ -0,0 +1,255 @@ +/* + * This file is part of Baritone. + * + * Baritone is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Baritone is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Baritone. If not, see . + */ + +package baritone.process; + +import baritone.Baritone; +import baritone.api.pathing.goals.Goal; +import baritone.api.pathing.goals.GoalYLevel; +import baritone.api.pathing.movement.IMovement; +import baritone.api.pathing.path.IPathExecutor; +import baritone.api.process.IBaritoneProcess; +import baritone.api.process.IElytraProcess; +import baritone.api.process.PathingCommand; +import baritone.api.process.PathingCommandType; +import baritone.api.utils.BetterBlockPos; +import baritone.api.utils.Rotation; +import baritone.api.utils.RotationUtils; +import baritone.api.utils.input.Input; +import baritone.pathing.movement.movements.MovementFall; +import baritone.process.elytra.LegacyElytraBehavior; +import baritone.process.elytra.NetherPathfinderContext; +import baritone.process.elytra.NullElytraProcess; +import baritone.utils.BaritoneProcessHelper; +import baritone.utils.PathingCommandContext; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; + + +import java.util.concurrent.*; +import java.util.function.Supplier; + +public class ElytraProcess extends BaritoneProcessHelper implements IBaritoneProcess, IElytraProcess { + public State state; + private Goal goal; + private LegacyElytraBehavior behavior; + + private ElytraProcess(Baritone baritone) { + super(baritone); + this.behavior = new LegacyElytraBehavior(baritone, this); + baritone.getGameEventHandler().registerEventListener(this.behavior); + } + + public static T create(final Baritone baritone) { + return (T) (NetherPathfinderContext.isSupported() + ? new ElytraProcess(baritone) + : new NullElytraProcess(baritone)); + } + + @Override + public boolean isActive() { + return behavior.destination != null; + } + + @Override + public PathingCommand onTick(boolean calcFailed, boolean isSafeToCancel) { + if (calcFailed) { + onLostControl(); + logDirect("Failed to get to jump off spot, canceling"); + return new PathingCommand(null, PathingCommandType.CANCEL_AND_SET_GOAL); + } + + if (ctx.player().isElytraFlying()) { + final BetterBlockPos last = behavior.pathManager.path.getLast(); + if (last != null && ctx.player().getDistanceSqToCenter(last) < (5 * 5)) { + this.state = State.LANDING; + } + } + + if (this.state == State.LANDING) { + final BetterBlockPos endPos = behavior.pathManager.path.getLast(); + if (ctx.player().isElytraFlying() && endPos != null) { + Vec3d from = ctx.player().getPositionVector(); + Vec3d to = new Vec3d(endPos.x, from.y, endPos.z); + Rotation rotation = RotationUtils.calcRotationFromVec3d(from, to, ctx.playerRotations()); + baritone.getLookBehavior().updateTarget(rotation, false); + } else { + this.onLostControl(); + return new PathingCommand(null, PathingCommandType.REQUEST_PAUSE); + } + } else if (ctx.player().isElytraFlying()) { + this.state = State.FLYING; + this.goal = null; + baritone.getInputOverrideHandler().clearAllKeys(); + behavior.tick(); + return new PathingCommand(null, PathingCommandType.CANCEL_AND_SET_GOAL); + } + + if (this.state == State.FLYING || this.state == State.START_FLYING) { + this.state = ctx.player().onGround && Baritone.settings().elytraAutoJump.value + ? State.LOCATE_JUMP + : State.START_FLYING; + } + + if (this.state == State.LOCATE_JUMP) { + if (this.goal == null) { + this.goal = new GoalYLevel(31); + } + final IPathExecutor executor = baritone.getPathingBehavior().getCurrent(); + if (executor != null && executor.getPath().getGoal() == this.goal) { + final IMovement fall = executor.getPath().movements().stream() + .filter(movement -> movement instanceof MovementFall) + .findFirst().orElse(null); + + if (fall != null) { + final BetterBlockPos from = new BetterBlockPos( + (fall.getSrc().x + fall.getDest().x) / 2, + (fall.getSrc().y + fall.getDest().y) / 2, + (fall.getSrc().z + fall.getDest().z) / 2 + ); + behavior.pathManager.pathToDestination(from).whenComplete((result, ex) -> { + if (!behavior.clearView(new Vec3d(from), behavior.pathManager.getPath().getVec(0), false)) { + onLostControl(); + // TODO: Get to higher ground and then look again + logDirect("Can't see start of path from jump spot, canceling"); + return; + } + if (ex == null) { + this.state = State.GET_TO_JUMP; + return; + } + onLostControl(); + }); + this.state = State.PAUSE; + } else { + onLostControl(); + logDirect("Jump off path didn't include a fall movement, canceling"); + return new PathingCommand(null, PathingCommandType.CANCEL_AND_SET_GOAL); + } + } + return new PathingCommandContext(this.goal, PathingCommandType.SET_GOAL_AND_PAUSE, new LegacyElytraBehavior.WalkOffCalculationContext(baritone)); + } + + // yucky + if (this.state == State.PAUSE) { + return new PathingCommand(null, PathingCommandType.REQUEST_PAUSE); + } + + if (this.state == State.GET_TO_JUMP) { + final IPathExecutor executor = baritone.getPathingBehavior().getCurrent(); + final boolean canStartFlying = ctx.player().fallDistance > 1.0f + && !isSafeToCancel + && executor != null + && executor.getPath().movements().get(executor.getPosition()) instanceof MovementFall; + + if (canStartFlying) { + this.state = State.START_FLYING; + } else { + return new PathingCommand(null, PathingCommandType.SET_GOAL_AND_PATH); + } + } + + if (this.state == State.START_FLYING) { + if (!isSafeToCancel) { + // owned + baritone.getPathingBehavior().secretInternalSegmentCancel(); + } + baritone.getInputOverrideHandler().clearAllKeys(); + if (ctx.player().fallDistance > 1.0f) { + baritone.getInputOverrideHandler().setInputForceState(Input.JUMP, true); + } + } + return new PathingCommand(null, PathingCommandType.CANCEL_AND_SET_GOAL); + } + + @Override + public boolean isTemporary() { + return false; + } + + @Override + public void onLostControl() { + this.goal = null; + this.state = State.START_FLYING; + behavior.cancel(); + } + + + + @Override + public String displayName0() { + final Supplier status = () -> { + switch (this.state) { + case LOCATE_JUMP: + return "Finding spot to jump off"; + case PAUSE: + return "Waiting for elytra path"; + case GET_TO_JUMP: + return "Walking to takeoff"; + case START_FLYING: + return "Begin flying"; + case FLYING: + return "Flying"; + case LANDING: + return "Landing"; + default: + return "Unknown"; + } + }; + return "Elytra - " + status.get(); + } + + @Override + public CompletableFuture resetContext() { + return behavior.resetContext(); + } + + @Override + public void repackChunks() { + behavior.repackChunks(); + } + + @Override + public void pathTo(BlockPos destination) { + behavior.pathTo(destination); + } + + @Override + public void cancel() { + behavior.cancel(); + } + + @Override + public boolean isLoaded() { + return true; + } + + @Override + public boolean isSafeToCancel() { + return behavior.isSafeToCancel(); + } + + public enum State { + LOCATE_JUMP, + VALIDATE_PATH, + PAUSE, + GET_TO_JUMP, + START_FLYING, + FLYING, + LANDING + } +} diff --git a/src/main/java/baritone/behavior/elytra/BlockStateOctreeInterface.java b/src/main/java/baritone/process/elytra/BlockStateOctreeInterface.java similarity index 98% rename from src/main/java/baritone/behavior/elytra/BlockStateOctreeInterface.java rename to src/main/java/baritone/process/elytra/BlockStateOctreeInterface.java index b81a6aed5..f9e700085 100644 --- a/src/main/java/baritone/behavior/elytra/BlockStateOctreeInterface.java +++ b/src/main/java/baritone/process/elytra/BlockStateOctreeInterface.java @@ -15,7 +15,7 @@ * along with Baritone. If not, see . */ -package baritone.behavior.elytra; +package baritone.process.elytra; import dev.babbaj.pathfinder.NetherPathfinder; import dev.babbaj.pathfinder.Octree; diff --git a/src/main/java/baritone/behavior/ElytraBehavior.java b/src/main/java/baritone/process/elytra/LegacyElytraBehavior.java similarity index 84% rename from src/main/java/baritone/behavior/ElytraBehavior.java rename to src/main/java/baritone/process/elytra/LegacyElytraBehavior.java index 6e1765180..48066f3ea 100644 --- a/src/main/java/baritone/behavior/ElytraBehavior.java +++ b/src/main/java/baritone/process/elytra/LegacyElytraBehavior.java @@ -15,33 +15,23 @@ * along with Baritone. If not, see . */ -package baritone.behavior; +package baritone.process.elytra; import baritone.Baritone; import baritone.api.IBaritone; import baritone.api.Settings; -import baritone.api.behavior.IElytraBehavior; import baritone.api.behavior.look.IAimProcessor; import baritone.api.behavior.look.ITickableAimProcessor; import baritone.api.event.events.*; import baritone.api.event.events.type.EventState; -import baritone.api.pathing.goals.Goal; +import baritone.api.event.listener.AbstractGameEventListener; import baritone.api.pathing.goals.GoalBlock; -import baritone.api.pathing.goals.GoalYLevel; -import baritone.api.pathing.movement.IMovement; -import baritone.api.pathing.path.IPathExecutor; -import baritone.api.process.IBaritoneProcess; -import baritone.api.process.PathingCommand; -import baritone.api.process.PathingCommandType; import baritone.api.utils.*; -import baritone.api.utils.input.Input; -import baritone.behavior.elytra.*; import baritone.pathing.movement.CalculationContext; -import baritone.pathing.movement.movements.MovementFall; +import baritone.process.ElytraProcess; import baritone.utils.BlockStateInterface; import baritone.utils.IRenderer; import baritone.utils.PathRenderer; -import baritone.utils.PathingCommandContext; import baritone.utils.accessor.IChunkProviderClient; import baritone.utils.accessor.IEntityFireworkRocket; import it.unimi.dsi.fastutil.floats.FloatArrayList; @@ -67,14 +57,16 @@ import java.awt.*; import java.util.*; import java.util.List; import java.util.concurrent.*; -import java.util.function.Supplier; import java.util.function.UnaryOperator; import static baritone.api.pathing.movement.ActionCosts.COST_INF; import static baritone.utils.BaritoneMath.fastCeil; import static baritone.utils.BaritoneMath.fastFloor; -public final class ElytraBehavior extends Behavior implements IElytraBehavior, Helper { +public final class LegacyElytraBehavior implements AbstractGameEventListener, Helper { + private final Baritone baritone; + private final IPlayerContext ctx; + // Used exclusively for PathRenderer public List> clearLines; @@ -86,7 +78,7 @@ public final class ElytraBehavior extends Behavior implements IElytraBehavior, H // :sunglasses: private NetherPathfinderContext context; private CompletableFuture forceResetContext; - private final PathManager pathManager; + public final PathManager pathManager; private final ElytraProcess process; /** @@ -111,7 +103,7 @@ public final class ElytraBehavior extends Behavior implements IElytraBehavior, H private BlockStateInterface bsi; private BlockStateOctreeInterface boi; - private BlockPos destination; + public BlockPos destination; private final ExecutorService solverExecutor; private Future solver; @@ -124,24 +116,20 @@ public final class ElytraBehavior extends Behavior implements IElytraBehavior, H private int invTickCountdown = 0; private final Queue invTransactionQueue = new LinkedList<>(); - private ElytraBehavior(Baritone baritone) { - super(baritone); + public LegacyElytraBehavior(Baritone baritone, ElytraProcess process) { + this.baritone = baritone; + this.ctx = baritone.getPlayerContext(); this.clearLines = new CopyOnWriteArrayList<>(); this.blockedLines = new CopyOnWriteArrayList<>(); this.pathManager = this.new PathManager(); - this.process = new ElytraProcess(); + this.process = process; this.solverExecutor = Executors.newSingleThreadExecutor(); this.nextTickBoostCounter = new int[2]; } - @Override - public void onLoad() { - baritone.getPathingControlManager().registerProcess(this.process); - } + public final class PathManager { - private final class PathManager { - - private NetherPath path; + public NetherPath path; private boolean completePath; private boolean recalculating; @@ -177,7 +165,7 @@ public final class ElytraBehavior extends Behavior implements IElytraBehavior, H public CompletableFuture pathToDestination(final BlockPos from) { final long start = System.nanoTime(); - return this.path0(from, ElytraBehavior.this.destination, UnaryOperator.identity()) + return this.path0(from, LegacyElytraBehavior.this.destination, UnaryOperator.identity()) .thenRun(() -> { final double distance = this.path.get(0).distanceTo(this.path.get(this.path.size() - 1)); if (this.completePath) { @@ -231,7 +219,7 @@ public final class ElytraBehavior extends Behavior implements IElytraBehavior, H final List before = this.path.subList(0, afterIncl + 1); final long start = System.nanoTime(); - this.path0(this.path.get(afterIncl), ElytraBehavior.this.destination, segment -> segment.prepend(before.stream())) + this.path0(this.path.get(afterIncl), LegacyElytraBehavior.this.destination, segment -> segment.prepend(before.stream())) .thenRun(() -> { final int recompute = this.path.size() - before.size() - 1; final double distance = this.path.get(0).distanceTo(this.path.get(recompute)); @@ -282,7 +270,7 @@ public final class ElytraBehavior extends Behavior implements IElytraBehavior, H // mickey resigned private CompletableFuture path0(BlockPos src, BlockPos dst, UnaryOperator operator) { - return ElytraBehavior.this.context.pathFindAsync(src, dst) + return LegacyElytraBehavior.this.context.pathFindAsync(src, dst) .thenApply(UnpackedSegment::from) .thenApply(operator) .thenAcceptAsync(this::setPath, ctx.minecraft()::addScheduledTask); @@ -303,12 +291,12 @@ public final class ElytraBehavior extends Behavior implements IElytraBehavior, H return; } final BetterBlockPos rangeStart = path.get(rangeStartIncl); - if (!ElytraBehavior.this.passable(rangeStart.x, rangeStart.y, rangeStart.z, false)) { + if (!LegacyElytraBehavior.this.passable(rangeStart.x, rangeStart.y, rangeStart.z, false)) { // we're in a wall return; // previous iterations of this function SHOULD have fixed this by now :rage_cat: } - if (ElytraBehavior.this.process.state != State.LANDING && this.ticksNearUnchanged > 100) { + if (LegacyElytraBehavior.this.process.state != ElytraProcess.State.LANDING && this.ticksNearUnchanged > 100) { this.pathRecalcSegment(rangeEndExcl - 1) .thenRun(() -> { logDirect("Recalculating segment, no progress in last 100 ticks"); @@ -318,7 +306,7 @@ public final class ElytraBehavior extends Behavior implements IElytraBehavior, H } for (int i = rangeStartIncl; i < rangeEndExcl - 1; i++) { - if (!ElytraBehavior.this.clearView(this.path.getVec(i), this.path.getVec(i + 1), false)) { + if (!LegacyElytraBehavior.this.clearView(this.path.getVec(i), this.path.getVec(i + 1), false)) { // obstacle. where do we return to pathing? // find the next valid segment final BetterBlockPos blockage = this.path.get(i); @@ -461,7 +449,6 @@ public final class ElytraBehavior extends Behavior implements IElytraBehavior, H } } - @Override public void pathTo(BlockPos destination) { this.destination = destination; if (!Baritone.settings().elytraAutoJump.value || ctx.player().isElytraFlying()) { @@ -469,7 +456,6 @@ public final class ElytraBehavior extends Behavior implements IElytraBehavior, H } } - @Override public void cancel() { this.destination = null; this.pathManager.clear(); @@ -483,7 +469,6 @@ public final class ElytraBehavior extends Behavior implements IElytraBehavior, H Arrays.fill(this.nextTickBoostCounter, 0); } - @Override public CompletableFuture resetContext() { if (this.forceResetContext == null) { this.forceResetContext = new CompletableFuture<>(); @@ -491,26 +476,18 @@ public final class ElytraBehavior extends Behavior implements IElytraBehavior, H return this.forceResetContext; } - @Override public void repackChunks() { ((IChunkProviderClient) ctx.world().getChunkProvider()).loadedChunks().values() .forEach(this.context::queueForPacking); } - @Override public boolean isActive() { return baritone.getPathingControlManager().mostRecentInControl() .filter(process -> this.process == process).isPresent(); } - @Override - public boolean isLoaded() { - return true; - } - - @Override public boolean isSafeToCancel() { - return !this.isActive() || !(this.process.state == State.FLYING || this.process.state == State.START_FLYING); + return !this.isActive() || !(this.process.state == ElytraProcess.State.FLYING || this.process.state == ElytraProcess.State.START_FLYING); } @Override @@ -598,9 +575,9 @@ public final class ElytraBehavior extends Behavior implements IElytraBehavior, H } /** - * Called by {@link ElytraProcess#onTick(boolean, boolean)} when the process is in control and the player is flying + * Called by {@link baritone.process.ElytraProcess#onTick(boolean, boolean)} when the process is in control and the player is flying */ - private void tick() { + public void tick() { if (this.pathManager.getPath().isEmpty()) { return; } @@ -770,8 +747,8 @@ public final class ElytraBehavior extends Behavior implements IElytraBehavior, H ) { // Prioritize boosting fireworks over regular ones // TODO: Take the minimum boost time into account? - if (!baritone.getInventoryBehavior().throwaway(true, ElytraBehavior::isBoostingFireworks) && - !baritone.getInventoryBehavior().throwaway(true, ElytraBehavior::isFireworks)) { + if (!baritone.getInventoryBehavior().throwaway(true, LegacyElytraBehavior::isBoostingFireworks) && + !baritone.getInventoryBehavior().throwaway(true, LegacyElytraBehavior::isFireworks)) { logDirect("no fireworks"); return; } @@ -793,21 +770,21 @@ public final class ElytraBehavior extends Behavior implements IElytraBehavior, H public final IAimProcessor aimProcessor; public SolverContext(boolean async) { - this.path = ElytraBehavior.this.pathManager.getPath(); - this.playerNear = ElytraBehavior.this.pathManager.getNear(); - this.start = ElytraBehavior.this.ctx.playerFeetAsVec(); - this.ignoreLava = ElytraBehavior.this.ctx.player().isInLava(); + this.path = LegacyElytraBehavior.this.pathManager.getPath(); + this.playerNear = LegacyElytraBehavior.this.pathManager.getNear(); + this.start = LegacyElytraBehavior.this.ctx.playerFeetAsVec(); + this.ignoreLava = LegacyElytraBehavior.this.ctx.player().isInLava(); final Integer fireworkTicksExisted; - if (async && ElytraBehavior.this.deployedFireworkLastTick) { - final int[] counter = ElytraBehavior.this.nextTickBoostCounter; + if (async && LegacyElytraBehavior.this.deployedFireworkLastTick) { + final int[] counter = LegacyElytraBehavior.this.nextTickBoostCounter; fireworkTicksExisted = counter[1] > counter[0] ? 0 : null; } else { - fireworkTicksExisted = ElytraBehavior.this.getAttachedFirework().map(e -> e.ticksExisted).orElse(null); + fireworkTicksExisted = LegacyElytraBehavior.this.getAttachedFirework().map(e -> e.ticksExisted).orElse(null); } - this.boost = new FireworkBoost(fireworkTicksExisted, ElytraBehavior.this.minimumBoostTicks); + this.boost = new FireworkBoost(fireworkTicksExisted, LegacyElytraBehavior.this.minimumBoostTicks); - ITickableAimProcessor aim = ElytraBehavior.this.baritone.getLookBehavior().getAimProcessor().fork(); + ITickableAimProcessor aim = LegacyElytraBehavior.this.baritone.getLookBehavior().getAimProcessor().fork(); if (async) { // async computation is done at the end of a tick, advance by 1 to prepare for the next tick aim.advance(1); @@ -1001,7 +978,7 @@ public final class ElytraBehavior extends Behavior implements IElytraBehavior, H return this.context.raytrace(8, src, dst, NetherPathfinderContext.Visibility.ALL); } - private boolean clearView(Vec3d start, Vec3d dest, boolean ignoreLava) { + public boolean clearView(Vec3d start, Vec3d dest, boolean ignoreLava) { final boolean clear; if (!ignoreLava) { // if start == dest then the cpp raytracer dies @@ -1303,7 +1280,7 @@ public final class ElytraBehavior extends Behavior implements IElytraBehavior, H ItemStack chest = ctx.player().inventory.armorInventory.get(2); if (chest.getItem() != Items.ELYTRA - || chest.getItem().getMaxDamage() - chest.getItemDamage() > Baritone.settings().elytraMinimumDurability.value) { + || chest.getItem().getMaxDamage() - chest.getItemDamage() > Baritone.settings().elytraMinimumDurability.value) { return; } @@ -1382,172 +1359,10 @@ public final class ElytraBehavior extends Behavior implements IElytraBehavior, H } } - private final class ElytraProcess implements IBaritoneProcess { - - private State state; - private Goal goal; - - @Override - public boolean isActive() { - return ElytraBehavior.this.destination != null; - } - - @Override - public PathingCommand onTick(boolean calcFailed, boolean isSafeToCancel) { - if (calcFailed) { - onLostControl(); - logDirect("Failed to get to jump off spot, canceling"); - return new PathingCommand(null, PathingCommandType.CANCEL_AND_SET_GOAL); - } - - if (ctx.player().isElytraFlying()) { - final BetterBlockPos last = ElytraBehavior.this.pathManager.path.getLast(); - if (last != null && ctx.player().getDistanceSqToCenter(last) < (5 * 5)) { - this.state = State.LANDING; - } - } - - if (this.state == State.LANDING) { - final BetterBlockPos endPos = ElytraBehavior.this.pathManager.path.getLast(); - if (ctx.player().isElytraFlying() && endPos != null) { - Vec3d from = ctx.player().getPositionVector(); - Vec3d to = new Vec3d(endPos.x, from.y, endPos.z); - Rotation rotation = RotationUtils.calcRotationFromVec3d(from, to, ctx.playerRotations()); - baritone.getLookBehavior().updateTarget(rotation, false); - } else { - this.onLostControl(); - return new PathingCommand(null, PathingCommandType.REQUEST_PAUSE); - } - } else if (ctx.player().isElytraFlying()) { - this.state = State.FLYING; - this.goal = null; - baritone.getInputOverrideHandler().clearAllKeys(); - ElytraBehavior.this.tick(); - return new PathingCommand(null, PathingCommandType.CANCEL_AND_SET_GOAL); - } - - if (this.state == State.FLYING || this.state == State.START_FLYING) { - this.state = ctx.player().onGround && Baritone.settings().elytraAutoJump.value - ? State.LOCATE_JUMP - : State.START_FLYING; - } - - if (this.state == State.LOCATE_JUMP) { - if (this.goal == null) { - this.goal = new GoalYLevel(31); - } - final IPathExecutor executor = baritone.getPathingBehavior().getCurrent(); - if (executor != null && executor.getPath().getGoal() == this.goal) { - final IMovement fall = executor.getPath().movements().stream() - .filter(movement -> movement instanceof MovementFall) - .findFirst().orElse(null); - - if (fall != null) { - final BetterBlockPos from = new BetterBlockPos( - (fall.getSrc().x + fall.getDest().x) / 2, - (fall.getSrc().y + fall.getDest().y) / 2, - (fall.getSrc().z + fall.getDest().z) / 2 - ); - ElytraBehavior.this.pathManager.pathToDestination(from).whenComplete((result, ex) -> { - if (!ElytraBehavior.this.clearView(new Vec3d(from), ElytraBehavior.this.pathManager.getPath().getVec(0), false)) { - onLostControl(); - // TODO: Get to higher ground and then look again - logDirect("Can't see start of path from jump spot, canceling"); - return; - } - if (ex == null) { - this.state = State.GET_TO_JUMP; - return; - } - onLostControl(); - }); - this.state = State.PAUSE; - } else { - onLostControl(); - logDirect("Jump off path didn't include a fall movement, canceling"); - return new PathingCommand(null, PathingCommandType.CANCEL_AND_SET_GOAL); - } - } - return new PathingCommandContext(this.goal, PathingCommandType.SET_GOAL_AND_PAUSE, new WalkOffCalculationContext(baritone)); - } - - // yucky - if (this.state == State.PAUSE) { - return new PathingCommand(null, PathingCommandType.REQUEST_PAUSE); - } - - if (this.state == State.GET_TO_JUMP) { - final IPathExecutor executor = baritone.getPathingBehavior().getCurrent(); - final boolean canStartFlying = ctx.player().fallDistance > 1.0f - && !isSafeToCancel - && executor != null - && executor.getPath().movements().get(executor.getPosition()) instanceof MovementFall; - - if (canStartFlying) { - this.state = State.START_FLYING; - } else { - return new PathingCommand(null, PathingCommandType.SET_GOAL_AND_PATH); - } - } - - if (this.state == State.START_FLYING) { - if (!isSafeToCancel) { - // owned - baritone.getPathingBehavior().secretInternalSegmentCancel(); - } - baritone.getInputOverrideHandler().clearAllKeys(); - if (ctx.player().fallDistance > 1.0f) { - baritone.getInputOverrideHandler().setInputForceState(Input.JUMP, true); - } - } - return new PathingCommand(null, PathingCommandType.CANCEL_AND_SET_GOAL); - } - - @Override - public boolean isTemporary() { - return false; - } - - @Override - public void onLostControl() { - this.goal = null; - this.state = State.START_FLYING; - ElytraBehavior.this.cancel(); - } - - @Override - public double priority() { - return 10; - } - - @Override - public String displayName0() { - final Supplier status = () -> { - switch (this.state) { - case LOCATE_JUMP: - return "Finding spot to jump off"; - case PAUSE: - return "Waiting for elytra path"; - case GET_TO_JUMP: - return "Walking to takeoff"; - case START_FLYING: - return "Begin flying"; - case FLYING: - return "Flying"; - case LANDING: - return "Landing"; - default: - return "Unknown"; - } - }; - return "Elytra - " + status.get(); - } - } - /** * Custom calculation context which makes the player fall into lava */ - private static final class WalkOffCalculationContext extends CalculationContext { + public static final class WalkOffCalculationContext extends CalculationContext { public WalkOffCalculationContext(IBaritone baritone) { super(baritone, true); @@ -1572,19 +1387,5 @@ public final class ElytraBehavior extends Behavior implements IElytraBehavior, H } } - private enum State { - LOCATE_JUMP, - VALIDATE_PATH, - PAUSE, - GET_TO_JUMP, - START_FLYING, - FLYING, - LANDING - } - public static T create(final Baritone baritone) { - return (T) (NetherPathfinderContext.isSupported() - ? new ElytraBehavior(baritone) - : new NullElytraBehavior(baritone)); - } } diff --git a/src/main/java/baritone/behavior/elytra/NetherPath.java b/src/main/java/baritone/process/elytra/NetherPath.java similarity index 98% rename from src/main/java/baritone/behavior/elytra/NetherPath.java rename to src/main/java/baritone/process/elytra/NetherPath.java index e746665c4..59cd447ce 100644 --- a/src/main/java/baritone/behavior/elytra/NetherPath.java +++ b/src/main/java/baritone/process/elytra/NetherPath.java @@ -15,7 +15,7 @@ * along with Baritone. If not, see . */ -package baritone.behavior.elytra; +package baritone.process.elytra; import baritone.api.utils.BetterBlockPos; import net.minecraft.util.math.Vec3d; diff --git a/src/main/java/baritone/behavior/elytra/NetherPathfinderContext.java b/src/main/java/baritone/process/elytra/NetherPathfinderContext.java similarity index 98% rename from src/main/java/baritone/behavior/elytra/NetherPathfinderContext.java rename to src/main/java/baritone/process/elytra/NetherPathfinderContext.java index ebe563374..46a840981 100644 --- a/src/main/java/baritone/behavior/elytra/NetherPathfinderContext.java +++ b/src/main/java/baritone/process/elytra/NetherPathfinderContext.java @@ -15,7 +15,7 @@ * along with Baritone. If not, see . */ -package baritone.behavior.elytra; +package baritone.process.elytra; import baritone.api.event.events.BlockChangeEvent; import baritone.utils.accessor.IBitArray; @@ -38,6 +38,7 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; /** * @author Brady @@ -51,6 +52,7 @@ public final class NetherPathfinderContext { final long context; private final long seed; private final ExecutorService executor; + private final AtomicInteger packQueueSize = new AtomicInteger(); public NetherPathfinderContext(long seed) { this.context = NetherPathfinder.newContext(seed); diff --git a/src/main/java/baritone/behavior/elytra/NullElytraBehavior.java b/src/main/java/baritone/process/elytra/NullElytraProcess.java similarity index 72% rename from src/main/java/baritone/behavior/elytra/NullElytraBehavior.java rename to src/main/java/baritone/process/elytra/NullElytraProcess.java index b173d82b8..a84caf43f 100644 --- a/src/main/java/baritone/behavior/elytra/NullElytraBehavior.java +++ b/src/main/java/baritone/process/elytra/NullElytraProcess.java @@ -15,11 +15,12 @@ * along with Baritone. If not, see . */ -package baritone.behavior.elytra; +package baritone.process.elytra; import baritone.Baritone; -import baritone.api.behavior.IElytraBehavior; -import baritone.behavior.Behavior; +import baritone.api.process.IElytraProcess; +import baritone.api.process.PathingCommand; +import baritone.utils.BaritoneProcessHelper; import net.minecraft.util.math.BlockPos; import java.util.concurrent.CompletableFuture; @@ -27,9 +28,9 @@ import java.util.concurrent.CompletableFuture; /** * @author Brady */ -public final class NullElytraBehavior extends Behavior implements IElytraBehavior { +public final class NullElytraProcess extends BaritoneProcessHelper implements IElytraProcess { - public NullElytraBehavior(Baritone baritone) { + public NullElytraProcess(Baritone baritone) { super(baritone); } @@ -58,6 +59,21 @@ public final class NullElytraBehavior extends Behavior implements IElytraBehavio return false; } + @Override + public PathingCommand onTick(boolean calcFailed, boolean isSafeToCancel) { + throw new UnsupportedOperationException("Called onTick on NullElytraProcess"); + } + + @Override + public void onLostControl() { + + } + + @Override + public String displayName0() { + return "NullElytraProcess"; + } + @Override public boolean isLoaded() { return false; diff --git a/src/main/java/baritone/behavior/elytra/PathCalculationException.java b/src/main/java/baritone/process/elytra/PathCalculationException.java similarity index 96% rename from src/main/java/baritone/behavior/elytra/PathCalculationException.java rename to src/main/java/baritone/process/elytra/PathCalculationException.java index 73ce82faf..7c9721487 100644 --- a/src/main/java/baritone/behavior/elytra/PathCalculationException.java +++ b/src/main/java/baritone/process/elytra/PathCalculationException.java @@ -15,7 +15,7 @@ * along with Baritone. If not, see . */ -package baritone.behavior.elytra; +package baritone.process.elytra; /** * @author Brady diff --git a/src/main/java/baritone/behavior/elytra/UnpackedSegment.java b/src/main/java/baritone/process/elytra/UnpackedSegment.java similarity index 98% rename from src/main/java/baritone/behavior/elytra/UnpackedSegment.java rename to src/main/java/baritone/process/elytra/UnpackedSegment.java index 0e0759625..02f07feb8 100644 --- a/src/main/java/baritone/behavior/elytra/UnpackedSegment.java +++ b/src/main/java/baritone/process/elytra/UnpackedSegment.java @@ -15,7 +15,7 @@ * along with Baritone. If not, see . */ -package baritone.behavior.elytra; +package baritone.process.elytra; import baritone.api.utils.BetterBlockPos; import dev.babbaj.pathfinder.PathSegment;