diff --git a/src/api/java/baritone/api/process/IGetToBlockProcess.java b/src/api/java/baritone/api/process/IGetToBlockProcess.java index f58efbd35..6b7f23b97 100644 --- a/src/api/java/baritone/api/process/IGetToBlockProcess.java +++ b/src/api/java/baritone/api/process/IGetToBlockProcess.java @@ -19,17 +19,21 @@ import baritone.api.utils.BlockOptionalMeta; import net.minecraft.block.Block; +import java.util.List; +import java.util.Arrays; /** * but it rescans the world every once in a while so it doesn't get fooled by its cache */ public interface IGetToBlockProcess extends IBaritoneProcess { - void getToBlock(BlockOptionalMeta block); - + default void getToBlock(BlockOptionalMeta block) { + getToBlock(Arrays.asList(block)); + } default void getToBlock(Block block) { getToBlock(new BlockOptionalMeta(block)); } + void getToBlock(List blocks); boolean blacklistClosest(); } diff --git a/src/main/java/baritone/command/defaults/GotoCommand.java b/src/main/java/baritone/command/defaults/GotoCommand.java index c64d7fa00..0dd0eecaa 100644 --- a/src/main/java/baritone/command/defaults/GotoCommand.java +++ b/src/main/java/baritone/command/defaults/GotoCommand.java @@ -29,6 +29,7 @@ import baritone.api.utils.BlockOptionalMeta; import java.util.Arrays; +import java.util.ArrayList; import java.util.List; import java.util.stream.Stream; @@ -51,9 +52,11 @@ public void execute(String label, IArgConsumer args) throws CommandException { baritone.getCustomGoalProcess().setGoalAndPath(goal); return; } - args.requireMax(1); - BlockOptionalMeta destination = args.getDatatypeFor(ForBlockOptionalMeta.INSTANCE); - baritone.getGetToBlockProcess().getToBlock(destination); + List destinations = new ArrayList(); + while(args.hasAny()) { + destinations.add(args.getDatatypeFor(ForBlockOptionalMeta.INSTANCE)); + } + baritone.getGetToBlockProcess().getToBlock(destinations); } @Override diff --git a/src/main/java/baritone/process/GetToBlockProcess.java b/src/main/java/baritone/process/GetToBlockProcess.java index 7f8376b84..8a00f163c 100644 --- a/src/main/java/baritone/process/GetToBlockProcess.java +++ b/src/main/java/baritone/process/GetToBlockProcess.java @@ -36,14 +36,19 @@ import net.minecraft.util.math.BlockPos; import java.util.*; +import java.util.stream.Collectors; public final class GetToBlockProcess extends BaritoneProcessHelper implements IGetToBlockProcess { - private BlockOptionalMeta gettingTo; + private List gettingTo; private List knownLocations; private List blacklist; // locations we failed to calc to private BlockPos start; + private String strGettingTo() { + return gettingTo.stream().map(bom -> bom.toString()).collect(Collectors.joining("/")); + } + private int tickCount = 0; private int arrivalTickCount = 0; @@ -52,9 +57,9 @@ public GetToBlockProcess(Baritone baritone) { } @Override - public void getToBlock(BlockOptionalMeta block) { + public void getToBlock(List blocks) { onLostControl(); - gettingTo = block; + gettingTo = blocks; start = ctx.playerFeet(); blacklist = new ArrayList<>(); arrivalTickCount = 0; @@ -85,7 +90,7 @@ public double heuristic() { } }, PathingCommandType.FORCE_REVALIDATE_GOAL_AND_PATH); } - logDirect("No known locations of " + gettingTo + ", canceling GetToBlock"); + logDirect("No known locations of " + strGettingTo() + ", canceling GetToBlock"); if (isSafeToCancel) { onLostControl(); } @@ -94,11 +99,11 @@ public double heuristic() { Goal goal = new GoalComposite(knownLocations.stream().map(this::createGoal).toArray(Goal[]::new)); if (calcFailed) { if (Baritone.settings().blacklistClosestOnFailure.value) { - logDirect("Unable to find any path to " + gettingTo + ", blacklisting presumably unreachable closest instances..."); + logDirect("Unable to find any path to " + strGettingTo() + ", blacklisting presumably unreachable closest instances..."); blacklistClosest(); return onTick(false, isSafeToCancel); // gamer moment } else { - logDirect("Unable to find any path to " + gettingTo + ", canceling GetToBlock"); + logDirect("Unable to find any path to " + strGettingTo() + ", canceling GetToBlock"); if (isSafeToCancel) { onLostControl(); } @@ -113,7 +118,8 @@ public double heuristic() { } if (goal.isInGoal(ctx.playerFeet()) && goal.isInGoal(baritone.getPathingBehavior().pathStart()) && isSafeToCancel) { // we're there - if (rightClickOnArrival(gettingTo.getBlock())) { + // currently don't know matched position/BOM, so will only right click if all BOM's in gettingTo are right clickable + if (!gettingTo.stream().anyMatch(bom -> !rightClickOnArrival(bom.getBlock()))) { if (rightClick()) { onLostControl(); return new PathingCommand(null, PathingCommandType.CANCEL_AND_SET_GOAL); @@ -187,22 +193,23 @@ public synchronized void onLostControl() { @Override public String displayName0() { if (knownLocations.isEmpty()) { - return "Exploring randomly to find " + gettingTo + ", no known locations"; + return "Exploring randomly to find " + strGettingTo() + ", no known locations"; } - return "Get To " + gettingTo + ", " + knownLocations.size() + " known locations"; + return "Get To " + strGettingTo() + ", " + knownLocations.size() + " known locations"; } private synchronized void rescan(List known, CalculationContext context) { - List positions = MineProcess.searchWorld(context, new BlockOptionalMetaLookup(gettingTo), 64, known, blacklist, Collections.emptyList()); + List positions = MineProcess.searchWorld(context, new BlockOptionalMetaLookup(gettingTo.toArray(new BlockOptionalMeta[0])), 64, known, blacklist, Collections.emptyList()); positions.removeIf(blacklist::contains); knownLocations = positions; } private Goal createGoal(BlockPos pos) { - if (walkIntoInsteadOfAdjacent(gettingTo.getBlock())) { + // determines which actions to take (action done iff should be done for all target blocks)) + if (!gettingTo.stream().anyMatch(bom -> !walkIntoInsteadOfAdjacent(bom.getBlock()))) { return new GoalTwoBlocks(pos); } - if (blockOnTopMustBeRemoved(gettingTo.getBlock()) && baritone.bsi.get0(pos.up()).isBlockNormalCube()) { + if (!gettingTo.stream().anyMatch(bom -> !blockOnTopMustBeRemoved(bom.getBlock())) && baritone.bsi.get0(pos.up()).isBlockNormalCube()) { return new GoalBlock(pos.up()); } return new GoalGetToBlock(pos);