From ecac546c6d7ebc3191681c82c9ae70d501f4d176 Mon Sep 17 00:00:00 2001 From: Leijurv Date: Sat, 9 Mar 2019 23:15:03 -0800 Subject: [PATCH 1/8] actually trolling is fine --- CODE_OF_CONDUCT.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 8811361f3..ae74fc3e4 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -26,7 +26,7 @@ Examples of unacceptable behavior by participants include: * Anime * The use of sexualized language or imagery and unwelcome sexual attention or advances -* Trolling, insulting/derogatory comments, and personal or political attacks +* ~~Trolling, insulting/derogatory comments, and personal or political attacks~~ * Public or private harassment * Publishing others' private information, such as a physical or electronic address, without explicit permission From d144d308908ec356aae4a77c0a329652b13d5567 Mon Sep 17 00:00:00 2001 From: Leijurv Date: Sun, 10 Mar 2019 23:43:00 -0700 Subject: [PATCH 2/8] crucial clarification --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9216add1c..02ed2bc52 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ A Minecraft pathfinder bot. Baritone is the pathfinding system used in [Impact](https://impactdevelopment.github.io/) since 4.4. There's a [showcase video](https://www.youtube.com/watch?v=yI8hgW_m6dQ) made by @Adovin#3153 on Baritone's integration into Impact. [Here's](https://www.youtube.com/watch?v=StquF69-_wI) a video I made showing off what it can do. This project is an updated version of [MineBot](https://github.com/leijurv/MineBot/), -the original version of the bot for Minecraft 1.8, rebuilt for 1.12.2. Baritone focuses on reliability and particularly performance (it's over [30x faster](https://github.com/cabaletta/baritone/pull/180#issuecomment-423822928) than MineBot at calculating paths). +the original version of the bot for Minecraft 1.8.9, rebuilt for 1.12.2. Baritone focuses on reliability and particularly performance (it's over [30x faster](https://github.com/cabaletta/baritone/pull/180#issuecomment-423822928) than MineBot at calculating paths). Have committed at least once a day for the last 7 months =D 🦀 From 580af2ab065605cfc42e49bd7666050980215c74 Mon Sep 17 00:00:00 2001 From: Leijurv Date: Mon, 11 Mar 2019 18:24:31 -0700 Subject: [PATCH 3/8] processes tied in priority --- .../api/process/IBaritoneProcess.java | 14 +++++++++- .../baritone/api/process/PathingCommand.java | 5 ++++ .../movement/movements/MovementAscend.java | 4 +++ .../movement/movements/MovementPillar.java | 4 +++ .../baritone/process/CustomGoalProcess.java | 10 +++---- .../java/baritone/process/ExploreProcess.java | 2 +- .../java/baritone/process/FollowProcess.java | 2 +- .../baritone/process/GetToBlockProcess.java | 7 +++-- .../java/baritone/process/MineProcess.java | 2 +- .../baritone/utils/BaritoneProcessHelper.java | 9 +----- .../utils/ExampleBaritoneControl.java | 15 ++++++++++ .../baritone/utils/PathingControlManager.java | 28 +++++++++++++------ 12 files changed, 73 insertions(+), 29 deletions(-) diff --git a/src/api/java/baritone/api/process/IBaritoneProcess.java b/src/api/java/baritone/api/process/IBaritoneProcess.java index 01e833c0b..0339179ca 100644 --- a/src/api/java/baritone/api/process/IBaritoneProcess.java +++ b/src/api/java/baritone/api/process/IBaritoneProcess.java @@ -35,6 +35,16 @@ import baritone.api.event.events.PathEvent; */ public interface IBaritoneProcess { + /** + * Default priority. Most normal processes should have this value. + *

+ * Some examples of processes that should have different values might include some kind of automated mob avoidance + * that would be temporary and would forcefully take control. Same for something that pauses pathing for auto eat, etc. + *

+ * The value is -1 beacuse that's what Impact 4.5's beta auto walk returns and I want to tie with it. + */ + double DEFAULT_PRIORITY = -1; + /** * Would this process like to be in control? * @@ -82,7 +92,9 @@ public interface IBaritoneProcess { * * @return A double representing the priority */ - double priority(); + default double priority() { + return DEFAULT_PRIORITY; + } /** * Returns a user-friendly name for this process. Suitable for a HUD. diff --git a/src/api/java/baritone/api/process/PathingCommand.java b/src/api/java/baritone/api/process/PathingCommand.java index 2caef1589..61445f8a4 100644 --- a/src/api/java/baritone/api/process/PathingCommand.java +++ b/src/api/java/baritone/api/process/PathingCommand.java @@ -53,4 +53,9 @@ public class PathingCommand { this.goal = goal; this.commandType = commandType; } + + @Override + public String toString() { + return commandType + " " + goal; + } } diff --git a/src/main/java/baritone/pathing/movement/movements/MovementAscend.java b/src/main/java/baritone/pathing/movement/movements/MovementAscend.java index 3dc65990f..d3ef9defd 100644 --- a/src/main/java/baritone/pathing/movement/movements/MovementAscend.java +++ b/src/main/java/baritone/pathing/movement/movements/MovementAscend.java @@ -155,6 +155,10 @@ public class MovementAscend extends Movement { return state.setStatus(MovementStatus.SUCCESS); } + if (ctx.playerFeet().y < src.y) { + return state.setStatus(MovementStatus.UNREACHABLE); + } + IBlockState jumpingOnto = BlockStateInterface.get(ctx, positionToPlace); if (!MovementHelper.canWalkOn(ctx, positionToPlace, jumpingOnto)) { ticksWithoutPlacement++; diff --git a/src/main/java/baritone/pathing/movement/movements/MovementPillar.java b/src/main/java/baritone/pathing/movement/movements/MovementPillar.java index 1bbfa6f91..e899ce636 100644 --- a/src/main/java/baritone/pathing/movement/movements/MovementPillar.java +++ b/src/main/java/baritone/pathing/movement/movements/MovementPillar.java @@ -148,6 +148,10 @@ public class MovementPillar extends Movement { return state; } + if (ctx.playerFeet().y < src.y) { + return state.setStatus(MovementStatus.UNREACHABLE); + } + IBlockState fromDown = BlockStateInterface.get(ctx, src); if (MovementHelper.isWater(fromDown.getBlock()) && MovementHelper.isWater(ctx, dest)) { // stay centered while swimming up a water column diff --git a/src/main/java/baritone/process/CustomGoalProcess.java b/src/main/java/baritone/process/CustomGoalProcess.java index a62342273..2c8a3c339 100644 --- a/src/main/java/baritone/process/CustomGoalProcess.java +++ b/src/main/java/baritone/process/CustomGoalProcess.java @@ -24,8 +24,6 @@ import baritone.api.process.PathingCommand; import baritone.api.process.PathingCommandType; import baritone.utils.BaritoneProcessHelper; -import java.util.Objects; - /** * As set by ExampleBaritoneControl or something idk * @@ -46,7 +44,7 @@ public class CustomGoalProcess extends BaritoneProcessHelper implements ICustomG private State state; public CustomGoalProcess(Baritone baritone) { - super(baritone, 3); + super(baritone); } @Override @@ -79,20 +77,20 @@ public class CustomGoalProcess extends BaritoneProcessHelper implements ICustomG public PathingCommand onTick(boolean calcFailed, boolean isSafeToCancel) { switch (this.state) { case GOAL_SET: - if (!baritone.getPathingBehavior().isPathing() && Objects.equals(baritone.getPathingBehavior().getGoal() + "", this.goal + "")) { - this.state = State.NONE; - } return new PathingCommand(this.goal, PathingCommandType.CANCEL_AND_SET_GOAL); case PATH_REQUESTED: + // return FORCE_REVALIDATE_GOAL_AND_PATH just once PathingCommand ret = new PathingCommand(this.goal, PathingCommandType.FORCE_REVALIDATE_GOAL_AND_PATH); this.state = State.EXECUTING; return ret; case EXECUTING: if (calcFailed) { onLostControl(); + return new PathingCommand(this.goal, PathingCommandType.CANCEL_AND_SET_GOAL); } if (this.goal == null || this.goal.isInGoal(ctx.playerFeet())) { onLostControl(); // we're there xd + return new PathingCommand(this.goal, PathingCommandType.CANCEL_AND_SET_GOAL); } return new PathingCommand(this.goal, PathingCommandType.SET_GOAL_AND_PATH); default: diff --git a/src/main/java/baritone/process/ExploreProcess.java b/src/main/java/baritone/process/ExploreProcess.java index 3f8d0f825..3343d8829 100644 --- a/src/main/java/baritone/process/ExploreProcess.java +++ b/src/main/java/baritone/process/ExploreProcess.java @@ -31,7 +31,7 @@ public class ExploreProcess extends BaritoneProcessHelper { private BlockPos explorationOrigin; public ExploreProcess(Baritone baritone) { - super(baritone, 0); + super(baritone); } @Override diff --git a/src/main/java/baritone/process/FollowProcess.java b/src/main/java/baritone/process/FollowProcess.java index 6e377decb..04e80e03c 100644 --- a/src/main/java/baritone/process/FollowProcess.java +++ b/src/main/java/baritone/process/FollowProcess.java @@ -46,7 +46,7 @@ public final class FollowProcess extends BaritoneProcessHelper implements IFollo private List cache; public FollowProcess(Baritone baritone) { - super(baritone, 1); + super(baritone); } @Override diff --git a/src/main/java/baritone/process/GetToBlockProcess.java b/src/main/java/baritone/process/GetToBlockProcess.java index 7f63c6e21..4a2aa3e2e 100644 --- a/src/main/java/baritone/process/GetToBlockProcess.java +++ b/src/main/java/baritone/process/GetToBlockProcess.java @@ -44,7 +44,7 @@ public class GetToBlockProcess extends BaritoneProcessHelper implements IGetToBl private int tickCount = 0; public GetToBlockProcess(Baritone baritone) { - super(baritone, 2); + super(baritone); } @Override @@ -161,7 +161,10 @@ public class GetToBlockProcess extends BaritoneProcessHelper implements IGetToBl @Override public String displayName() { - return "Get To Block " + gettingTo; + if (knownLocations.isEmpty()) { + return "Exploring randomly to find " + gettingTo + ", no known locations"; + } + return "Get To Block " + gettingTo + ", " + knownLocations.size() + " known locations"; } private synchronized void rescan(List known, CalculationContext context) { diff --git a/src/main/java/baritone/process/MineProcess.java b/src/main/java/baritone/process/MineProcess.java index 121ddb8f9..495fb0eea 100644 --- a/src/main/java/baritone/process/MineProcess.java +++ b/src/main/java/baritone/process/MineProcess.java @@ -60,7 +60,7 @@ public final class MineProcess extends BaritoneProcessHelper implements IMinePro private int tickCount; public MineProcess(Baritone baritone) { - super(baritone, 0); + super(baritone); } @Override diff --git a/src/main/java/baritone/utils/BaritoneProcessHelper.java b/src/main/java/baritone/utils/BaritoneProcessHelper.java index 1a66eaa5d..61c2fd448 100644 --- a/src/main/java/baritone/utils/BaritoneProcessHelper.java +++ b/src/main/java/baritone/utils/BaritoneProcessHelper.java @@ -25,12 +25,10 @@ public abstract class BaritoneProcessHelper implements IBaritoneProcess, Helper protected final Baritone baritone; protected final IPlayerContext ctx; - private final double priority; - public BaritoneProcessHelper(Baritone baritone, double priority) { + public BaritoneProcessHelper(Baritone baritone) { this.baritone = baritone; this.ctx = baritone.getPlayerContext(); - this.priority = priority; baritone.getPathingControlManager().registerProcess(this); } @@ -38,9 +36,4 @@ public abstract class BaritoneProcessHelper implements IBaritoneProcess, Helper public boolean isTemporary() { return false; } - - @Override - public double priority() { - return priority; - } } diff --git a/src/main/java/baritone/utils/ExampleBaritoneControl.java b/src/main/java/baritone/utils/ExampleBaritoneControl.java index 89aa0fb52..ca88a8285 100644 --- a/src/main/java/baritone/utils/ExampleBaritoneControl.java +++ b/src/main/java/baritone/utils/ExampleBaritoneControl.java @@ -24,6 +24,7 @@ import baritone.api.cache.IWaypoint; import baritone.api.event.events.ChatEvent; import baritone.api.pathing.goals.*; import baritone.api.pathing.movement.ActionCosts; +import baritone.api.process.IBaritoneProcess; import baritone.api.utils.BetterBlockPos; import baritone.api.utils.SettingsUtil; import baritone.behavior.Behavior; @@ -225,6 +226,20 @@ public class ExampleBaritoneControl extends Behavior implements Helper { } return true; } + if (msg.equals("proc")) { + Optional proc = baritone.getPathingControlManager().mostRecentInControl(); + if (!proc.isPresent()) { + logDirect("No process is in control"); + return true; + } + IBaritoneProcess p = proc.get(); + logDirect("Class: " + p.getClass()); + logDirect("Priority: " + p.priority()); + logDirect("Temporary: " + p.isTemporary()); + logDirect("Display name: " + p.displayName()); + logDirect("Command: " + baritone.getPathingControlManager().mostRecentCommand()); + return true; + } if (msg.equals("version")) { String version = ExampleBaritoneControl.class.getPackage().getImplementationVersion(); if (version == null) { diff --git a/src/main/java/baritone/utils/PathingControlManager.java b/src/main/java/baritone/utils/PathingControlManager.java index 8d1616c4e..a01a1036d 100644 --- a/src/main/java/baritone/utils/PathingControlManager.java +++ b/src/main/java/baritone/utils/PathingControlManager.java @@ -29,11 +29,11 @@ import baritone.pathing.path.PathExecutor; import net.minecraft.util.math.BlockPos; import java.util.*; -import java.util.stream.Stream; public class PathingControlManager implements IPathingControlManager { private final Baritone baritone; private final HashSet processes; // unGh + private final List active; private IBaritoneProcess inControlLastTick; private IBaritoneProcess inControlThisTick; private PathingCommand command; @@ -41,13 +41,13 @@ public class PathingControlManager implements IPathingControlManager { public PathingControlManager(Baritone baritone) { this.baritone = baritone; this.processes = new HashSet<>(); + this.active = new ArrayList<>(); baritone.getGameEventHandler().registerEventListener(new AbstractGameEventListener() { // needs to be after all behavior ticks @Override public void onTick(TickEvent event) { - if (event.getType() == TickEvent.Type.OUT) { - return; + if (event.getType() == TickEvent.Type.IN) { + postTick(); } - postTick(); } }); } @@ -62,6 +62,7 @@ public class PathingControlManager implements IPathingControlManager { inControlLastTick = null; inControlThisTick = null; command = null; + active.clear(); for (IBaritoneProcess proc : processes) { proc.onLostControl(); if (proc.isActive() && !proc.isTemporary()) { // it's okay only for a temporary thing (like combat pause) to maintain control even if you say to cancel @@ -87,6 +88,7 @@ public class PathingControlManager implements IPathingControlManager { command = executeProcesses(); if (command == null) { p.cancelSegmentIfSafe(); + p.secretInternalSetGoal(null); return; } switch (command.commandType) { @@ -172,12 +174,20 @@ public class PathingControlManager implements IPathingControlManager { public PathingCommand executeProcesses() { - Stream inContention = processes.stream() - .filter(IBaritoneProcess::isActive) - .sorted(Comparator.comparingDouble(IBaritoneProcess::priority).reversed()); + for (IBaritoneProcess process : processes) { + if (process.isActive()) { + if (!active.contains(process)) { + // put a newly active process at the very front of the queue + active.add(0, process); + } + } else { + active.remove(process); + } + } + // ties are broken by which was added to the beginning of the list first + active.sort(Comparator.comparingDouble(IBaritoneProcess::priority).reversed()); - - Iterator iterator = inContention.iterator(); + Iterator iterator = active.iterator(); while (iterator.hasNext()) { IBaritoneProcess proc = iterator.next(); From 6b7aca308191f33925c05ebea196b9c1fb863161 Mon Sep 17 00:00:00 2001 From: Leijurv Date: Mon, 11 Mar 2019 19:23:41 -0700 Subject: [PATCH 4/8] force revalidate on control change --- src/main/java/baritone/utils/PathingControlManager.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/baritone/utils/PathingControlManager.java b/src/main/java/baritone/utils/PathingControlManager.java index a01a1036d..addcc7911 100644 --- a/src/main/java/baritone/utils/PathingControlManager.java +++ b/src/main/java/baritone/utils/PathingControlManager.java @@ -24,6 +24,7 @@ import baritone.api.pathing.calc.IPathingControlManager; import baritone.api.pathing.goals.Goal; import baritone.api.process.IBaritoneProcess; import baritone.api.process.PathingCommand; +import baritone.api.process.PathingCommandType; import baritone.behavior.PathingBehavior; import baritone.pathing.path.PathExecutor; import net.minecraft.util.math.BlockPos; @@ -91,6 +92,11 @@ public class PathingControlManager implements IPathingControlManager { p.secretInternalSetGoal(null); return; } + if (inControlThisTick != inControlLastTick && command.commandType != PathingCommandType.REQUEST_PAUSE) { + // if control has changed, and the new process wants to do something + p.cancelSegmentIfSafe(); + // get rid of the in progress stuff from the last process + } switch (command.commandType) { case REQUEST_PAUSE: p.requestPause(); From 7cfa8376042e85c4f7e95e81cf51d39076ab0186 Mon Sep 17 00:00:00 2001 From: Leijurv Date: Mon, 11 Mar 2019 20:06:19 -0700 Subject: [PATCH 5/8] blacklistClosestOnFailure --- src/api/java/baritone/api/Settings.java | 8 ++++--- .../baritone/process/GetToBlockProcess.java | 4 ++-- .../java/baritone/process/MineProcess.java | 24 +++++++++++++------ 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/src/api/java/baritone/api/Settings.java b/src/api/java/baritone/api/Settings.java index 99fe52412..c70d60dee 100644 --- a/src/api/java/baritone/api/Settings.java +++ b/src/api/java/baritone/api/Settings.java @@ -485,10 +485,12 @@ public final class Settings { public final Setting sprintInWater = new Setting<>(true); /** - * When GetToBlockProcess fails to calculate a path, instead of just giving up, mark the closest instances - * of that block as "unreachable" and go towards the next closest + * When GetToBlockProcess or MineProcess fails to calculate a path, instead of just giving up, mark the closest instance + * of that block as "unreachable" and go towards the next closest. GetToBlock expands this seaarch to the whole "vein"; MineProcess does not. + * This is because MineProcess finds individual impossible blocks (like one block in a vein that has gravel on top then lava, so it can't break) + * Whereas GetToBlock should blacklist the whole "vein" if it can't get to any of them. */ - public final Setting blacklistOnGetToBlockFailure = new Setting<>(true); + public final Setting blacklistClosestOnFailure = new Setting<>(true); /** * 😎 Render cached chunks as semitransparent. Doesn't work with OptiFine 😭 Rarely randomly crashes, see this issue. diff --git a/src/main/java/baritone/process/GetToBlockProcess.java b/src/main/java/baritone/process/GetToBlockProcess.java index 4a2aa3e2e..caebc8654 100644 --- a/src/main/java/baritone/process/GetToBlockProcess.java +++ b/src/main/java/baritone/process/GetToBlockProcess.java @@ -83,7 +83,7 @@ public class GetToBlockProcess extends BaritoneProcessHelper implements IGetToBl } Goal goal = new GoalComposite(knownLocations.stream().map(this::createGoal).toArray(Goal[]::new)); if (calcFailed) { - if (Baritone.settings().blacklistOnGetToBlockFailure.value) { + if (Baritone.settings().blacklistClosestOnFailure.value) { logDirect("Unable to find any path to " + gettingTo + ", blacklisting presumably unreachable closest instances"); blacklistClosest(); return onTick(false, isSafeToCancel); // gamer moment @@ -168,7 +168,7 @@ public class GetToBlockProcess extends BaritoneProcessHelper implements IGetToBl } private synchronized void rescan(List known, CalculationContext context) { - List positions = MineProcess.searchWorld(context, Collections.singletonList(gettingTo), 64, known); + List positions = MineProcess.searchWorld(context, Collections.singletonList(gettingTo), 64, known, blacklist); positions.removeIf(blacklist::contains); knownLocations = positions; } diff --git a/src/main/java/baritone/process/MineProcess.java b/src/main/java/baritone/process/MineProcess.java index 495fb0eea..1c2760dea 100644 --- a/src/main/java/baritone/process/MineProcess.java +++ b/src/main/java/baritone/process/MineProcess.java @@ -54,6 +54,7 @@ public final class MineProcess extends BaritoneProcessHelper implements IMinePro private List mining; private List knownOreLocations; + private List blacklist; // inaccessible private BlockPos branchPoint; private GoalRunAway branchPointRunaway; private int desiredQuantity; @@ -80,6 +81,11 @@ public final class MineProcess extends BaritoneProcessHelper implements IMinePro return null; } } + if (calcFailed && !knownOreLocations.isEmpty() && Baritone.settings().blacklistClosestOnFailure.value) { + knownOreLocations.stream().sorted(Comparator.comparingDouble(ctx.player()::getDistanceSq)).findFirst().ifPresent(blacklist::add); + knownOreLocations.removeIf(blacklist::contains); + calcFailed = false; // 😎 + } if (calcFailed) { logDirect("Unable to find any path to " + mining + ", canceling Mine"); cancel(); @@ -118,7 +124,7 @@ public final class MineProcess extends BaritoneProcessHelper implements IMinePro boolean legit = Baritone.settings().legitMine.value; List locs = knownOreLocations; if (!locs.isEmpty()) { - List locs2 = prune(new CalculationContext(baritone), new ArrayList<>(locs), mining, ORE_LOCATIONS_COUNT); + List locs2 = prune(new CalculationContext(baritone), new ArrayList<>(locs), mining, ORE_LOCATIONS_COUNT, blacklist); // can't reassign locs, gotta make a new var locs2, because we use it in a lambda right here, and variables you use in a lambda must be effectively final Goal goal = new GoalComposite(locs2.stream().map(loc -> coalesce(ctx, loc, locs2)).toArray(Goal[]::new)); knownOreLocations = locs2; @@ -160,10 +166,10 @@ public final class MineProcess extends BaritoneProcessHelper implements IMinePro if (Baritone.settings().legitMine.value) { return; } - List locs = searchWorld(context, mining, ORE_LOCATIONS_COUNT, already); + List locs = searchWorld(context, mining, ORE_LOCATIONS_COUNT, already, blacklist); locs.addAll(droppedItemsScan(mining, ctx.world())); if (locs.isEmpty()) { - logDebug("No locations for " + mining + " known, cancelling"); + logDirect("No locations for " + mining + " known, cancelling"); cancel(); return; } @@ -204,7 +210,7 @@ public final class MineProcess extends BaritoneProcessHelper implements IMinePro return ret; } - public static List searchWorld(CalculationContext ctx, List mining, int max, List alreadyKnown) { + public static List searchWorld(CalculationContext ctx, List mining, int max, List alreadyKnown, List blacklist) { List locs = new ArrayList<>(); List uninteresting = new ArrayList<>(); //long b = System.currentTimeMillis(); @@ -216,6 +222,7 @@ public final class MineProcess extends BaritoneProcessHelper implements IMinePro uninteresting.add(m); } } + locs = prune(ctx, locs, mining, max, blacklist); //System.out.println("Scan of cached chunks took " + (System.currentTimeMillis() - b) + "ms"); if (locs.isEmpty()) { uninteresting = mining; @@ -226,7 +233,7 @@ public final class MineProcess extends BaritoneProcessHelper implements IMinePro //System.out.println("Scan of loaded chunks took " + (System.currentTimeMillis() - before) + "ms"); } locs.addAll(alreadyKnown); - return prune(ctx, locs, mining, max); + return prune(ctx, locs, mining, max, blacklist); } private void addNearby() { @@ -249,10 +256,10 @@ public final class MineProcess extends BaritoneProcessHelper implements IMinePro } } } - knownOreLocations = prune(new CalculationContext(baritone), knownOreLocations, mining, ORE_LOCATIONS_COUNT); + knownOreLocations = prune(new CalculationContext(baritone), knownOreLocations, mining, ORE_LOCATIONS_COUNT, blacklist); } - public static List prune(CalculationContext ctx, List locs2, List mining, int max) { + private static List prune(CalculationContext ctx, List locs2, List mining, int max, List blacklist) { List dropped = droppedItemsScan(mining, ctx.world); dropped.removeIf(drop -> { for (BlockPos pos : locs2) { @@ -272,6 +279,8 @@ public final class MineProcess extends BaritoneProcessHelper implements IMinePro // remove any that are implausible to mine (encased in bedrock, or touching lava) .filter(pos -> MineProcess.plausibleToBreak(ctx.bsi, pos)) + .filter(pos -> !blacklist.contains(pos)) + .sorted(Comparator.comparingDouble(ctx.getBaritone().getPlayerContext().playerFeet()::distanceSq)) .collect(Collectors.toList()); @@ -300,6 +309,7 @@ public final class MineProcess extends BaritoneProcessHelper implements IMinePro this.mining = blocks == null || blocks.length == 0 ? null : Arrays.asList(blocks); this.desiredQuantity = quantity; this.knownOreLocations = new ArrayList<>(); + this.blacklist = new ArrayList<>(); this.branchPoint = null; this.branchPointRunaway = null; if (mining != null) { From 88e41f37b1e4537b7481dbca35177297a6d48dde Mon Sep 17 00:00:00 2001 From: Leijurv Date: Mon, 11 Mar 2019 20:08:52 -0700 Subject: [PATCH 6/8] explain whats happening --- src/main/java/baritone/process/GetToBlockProcess.java | 2 +- src/main/java/baritone/process/MineProcess.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/baritone/process/GetToBlockProcess.java b/src/main/java/baritone/process/GetToBlockProcess.java index caebc8654..a7a28db0b 100644 --- a/src/main/java/baritone/process/GetToBlockProcess.java +++ b/src/main/java/baritone/process/GetToBlockProcess.java @@ -84,7 +84,7 @@ public class GetToBlockProcess extends BaritoneProcessHelper implements IGetToBl 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 " + gettingTo + ", blacklisting presumably unreachable closest instances..."); blacklistClosest(); return onTick(false, isSafeToCancel); // gamer moment } else { diff --git a/src/main/java/baritone/process/MineProcess.java b/src/main/java/baritone/process/MineProcess.java index 1c2760dea..322a966e2 100644 --- a/src/main/java/baritone/process/MineProcess.java +++ b/src/main/java/baritone/process/MineProcess.java @@ -82,6 +82,7 @@ public final class MineProcess extends BaritoneProcessHelper implements IMinePro } } if (calcFailed && !knownOreLocations.isEmpty() && Baritone.settings().blacklistClosestOnFailure.value) { + logDirect("Unable to find any path to " + mining + ", blacklisting presumably unreachable closest instance..."); knownOreLocations.stream().sorted(Comparator.comparingDouble(ctx.player()::getDistanceSq)).findFirst().ifPresent(blacklist::add); knownOreLocations.removeIf(blacklist::contains); calcFailed = false; // 😎 From 416b5b66d2d2e666492a930fa867c661fc1e00d2 Mon Sep 17 00:00:00 2001 From: Leijurv Date: Mon, 11 Mar 2019 20:57:46 -0700 Subject: [PATCH 7/8] break fewer beds --- src/main/java/baritone/utils/ExampleBaritoneControl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/baritone/utils/ExampleBaritoneControl.java b/src/main/java/baritone/utils/ExampleBaritoneControl.java index ca88a8285..719ddf00e 100644 --- a/src/main/java/baritone/utils/ExampleBaritoneControl.java +++ b/src/main/java/baritone/utils/ExampleBaritoneControl.java @@ -533,7 +533,7 @@ public class ExampleBaritoneControl extends Behavior implements Helper { return true; } } - Goal goal = new GoalBlock(waypoint.getLocation()); + Goal goal = waypoint.getTag() == Waypoint.Tag.BED ? new GoalGetToBlock(waypoint.getLocation()) : new GoalBlock(waypoint.getLocation()); customGoalProcess.setGoalAndPath(goal); return true; } From a5a795a22c65860488f72198d9e4c619c1786f67 Mon Sep 17 00:00:00 2001 From: Leijurv Date: Mon, 11 Mar 2019 22:21:35 -0700 Subject: [PATCH 8/8] lower case ok --- README.md | 2 +- src/main/java/baritone/utils/GuiClickMeme.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 02ed2bc52..a971cad0b 100644 --- a/README.md +++ b/README.md @@ -72,7 +72,7 @@ That's what it's for, sure! (As long as usage is in compliance with the LGPL 3 L ## How is it so fast? -Magic. (Hours of [Leijurv](https://github.com/leijurv) enduring excruciating pain) +Magic. (Hours of [leijurv](https://github.com/leijurv) enduring excruciating pain) ## Why is it called Baritone? diff --git a/src/main/java/baritone/utils/GuiClickMeme.java b/src/main/java/baritone/utils/GuiClickMeme.java index 1163b1b0e..9d9ce9b2e 100644 --- a/src/main/java/baritone/utils/GuiClickMeme.java +++ b/src/main/java/baritone/utils/GuiClickMeme.java @@ -40,7 +40,7 @@ import static org.lwjgl.opengl.GL11.*; public class GuiClickMeme extends GuiScreen { - // My name is Brady and I grant Leijurv permission to use this pasted code + // My name is Brady and I grant leijurv permission to use this pasted code private final FloatBuffer MODELVIEW = BufferUtils.createFloatBuffer(16); private final FloatBuffer PROJECTION = BufferUtils.createFloatBuffer(16); private final IntBuffer VIEWPORT = BufferUtils.createIntBuffer(16); @@ -58,7 +58,7 @@ public class GuiClickMeme extends GuiScreen { int mx = Mouse.getX(); int my = Mouse.getY(); Vec3d near = toWorld(mx, my, 0); - Vec3d far = toWorld(mx, my, 1); // "Use 0.945 that's what stack overflow says" - Leijurv + Vec3d far = toWorld(mx, my, 1); // "Use 0.945 that's what stack overflow says" - leijurv if (near != null && far != null) { Vec3d viewerPos = new Vec3d(mc.getRenderManager().viewerPosX, mc.getRenderManager().viewerPosY, mc.getRenderManager().viewerPosZ); RayTraceResult result = mc.world.rayTraceBlocks(near.add(viewerPos), far.add(viewerPos), false, false, true);