From 93217a3ae3ec6c653506ea5c2ccbbebba59cf2f2 Mon Sep 17 00:00:00 2001 From: Leijurv Date: Sat, 24 Nov 2018 22:04:36 -0800 Subject: [PATCH 01/24] this is just not possible --- src/main/java/baritone/pathing/calc/AStarPathFinder.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/baritone/pathing/calc/AStarPathFinder.java b/src/main/java/baritone/pathing/calc/AStarPathFinder.java index d0061921..989fda55 100644 --- a/src/main/java/baritone/pathing/calc/AStarPathFinder.java +++ b/src/main/java/baritone/pathing/calc/AStarPathFinder.java @@ -143,9 +143,6 @@ public final class AStarPathFinder extends AbstractNodeCostSearch implements Hel PathNode neighbor = getNodeAtPosition(res.x, res.y, res.z, hashCode); double tentativeCost = currentNode.cost + actionCost; if (tentativeCost < neighbor.cost) { - if (tentativeCost < 0) { - throw new IllegalStateException(moves + " overflowed into negative " + actionCost + " " + neighbor.cost + " " + tentativeCost); - } double improvementBy = neighbor.cost - tentativeCost; // there are floating point errors caused by random combinations of traverse and diagonal over a flat area // that means that sometimes there's a cost improvement of like 10 ^ -16 From 2b56d68f7d1c99b3afbc273a808bed6c39569908 Mon Sep 17 00:00:00 2001 From: Leijurv Date: Sun, 25 Nov 2018 11:53:51 -0800 Subject: [PATCH 02/24] many fixes to segment calculator, and chat demo usage --- .../baritone/behavior/PathingBehavior.java | 12 ++++++---- src/main/java/baritone/cache/CachedWorld.java | 4 ++++ .../baritone/pathing/path/SplicedPath.java | 3 ++- .../utils/ExampleBaritoneControl.java | 18 +++++++++++++++ .../utils/pathing/SegmentedCalculator.java | 23 +++++++++++++++++-- 5 files changed, 53 insertions(+), 7 deletions(-) diff --git a/src/main/java/baritone/behavior/PathingBehavior.java b/src/main/java/baritone/behavior/PathingBehavior.java index 42186b5b..3e8c3595 100644 --- a/src/main/java/baritone/behavior/PathingBehavior.java +++ b/src/main/java/baritone/behavior/PathingBehavior.java @@ -330,12 +330,16 @@ public final class PathingBehavior extends Behavior implements IPathingBehavior, } } + public void secretCursedFunctionDoNotCall(IPath path) { + current = new PathExecutor(this, path); + } + /** * See issue #209 * * @return The starting {@link BlockPos} for a new path */ - public BlockPos pathStart() { // TODO move to a helper or util class + public BetterBlockPos pathStart() { // TODO move to a helper or util class BetterBlockPos feet = ctx.playerFeet(); if (!MovementHelper.canWalkOn(ctx, feet.down())) { if (ctx.player().onGround) { @@ -406,7 +410,7 @@ public final class PathingBehavior extends Behavior implements IPathingBehavior, failureTimeout = Baritone.settings().planAheadFailureTimeoutMS.get(); } CalculationContext context = new CalculationContext(baritone); // not safe to create on the other thread, it looks up a lot of stuff in minecraft - AbstractNodeCostSearch pathfinder = createPathfinder(start, goal, current == null ? null : current.getPath(), context); + AbstractNodeCostSearch pathfinder = createPathfinder(start, goal, current == null ? null : current.getPath(), context, true); if (!Objects.equals(pathfinder.getGoal(), goal)) { logDebug("Simplifying " + goal.getClass() + " to GoalXZ due to distance"); } @@ -480,9 +484,9 @@ public final class PathingBehavior extends Behavior implements IPathingBehavior, }); } - public static AbstractNodeCostSearch createPathfinder(BlockPos start, Goal goal, IPath previous, CalculationContext context) { + public static AbstractNodeCostSearch createPathfinder(BlockPos start, Goal goal, IPath previous, CalculationContext context, boolean allowSimplifyUnloaded) { Goal transformed = goal; - if (Baritone.settings().simplifyUnloadedYCoord.get() && goal instanceof IGoalRenderPos) { + if (Baritone.settings().simplifyUnloadedYCoord.get() && goal instanceof IGoalRenderPos && allowSimplifyUnloaded) { BlockPos pos = ((IGoalRenderPos) goal).getGoalPos(); if (context.world().getChunk(pos) instanceof EmptyChunk) { transformed = new GoalXZ(pos.getX(), pos.getZ()); diff --git a/src/main/java/baritone/cache/CachedWorld.java b/src/main/java/baritone/cache/CachedWorld.java index 31bcceab..e9caddfe 100644 --- a/src/main/java/baritone/cache/CachedWorld.java +++ b/src/main/java/baritone/cache/CachedWorld.java @@ -255,6 +255,10 @@ public final class CachedWorld implements ICachedWorld, Helper { }); } + public void tryLoadFromDisk(int regionX, int regionZ) { + getOrCreateRegion(regionX, regionZ); + } + /** * Returns the region ID based on the region coordinates. 0 will be * returned if the specified region coordinates are out of bounds. diff --git a/src/main/java/baritone/pathing/path/SplicedPath.java b/src/main/java/baritone/pathing/path/SplicedPath.java index 92610c86..f3263718 100644 --- a/src/main/java/baritone/pathing/path/SplicedPath.java +++ b/src/main/java/baritone/pathing/path/SplicedPath.java @@ -77,6 +77,7 @@ public class SplicedPath extends PathBase { for (int i = 0; i < first.length() - 1; i++) { // overlap in the very last element is fine (and required) so only go up to first.length() - 1 if (secondPos.contains(first.positions().get(i))) { firstPositionInSecond = i; + break; } } if (firstPositionInSecond != -1) { @@ -94,7 +95,7 @@ public class SplicedPath extends PathBase { List movements = new ArrayList<>(); positions.addAll(first.positions().subList(0, firstPositionInSecond + 1)); movements.addAll(first.movements().subList(0, firstPositionInSecond)); - + positions.addAll(second.positions().subList(positionInSecond + 1, second.length())); movements.addAll(second.movements().subList(positionInSecond, second.length() - 1)); return Optional.of(new SplicedPath(positions, movements, first.getNumNodesConsidered() + second.getNumNodesConsidered(), first.getGoal())); diff --git a/src/main/java/baritone/utils/ExampleBaritoneControl.java b/src/main/java/baritone/utils/ExampleBaritoneControl.java index 93e2742a..6b2c7448 100644 --- a/src/main/java/baritone/utils/ExampleBaritoneControl.java +++ b/src/main/java/baritone/utils/ExampleBaritoneControl.java @@ -32,6 +32,7 @@ import baritone.pathing.movement.CalculationContext; import baritone.pathing.movement.Movement; import baritone.pathing.movement.Moves; import baritone.process.CustomGoalProcess; +import baritone.utils.pathing.SegmentedCalculator; import net.minecraft.block.Block; import net.minecraft.client.multiplayer.ChunkProviderClient; import net.minecraft.entity.Entity; @@ -202,6 +203,23 @@ public class ExampleBaritoneControl extends Behavior implements Helper { } return true; } + if (msg.equals("fullpath")) { + if (pathingBehavior.getGoal() == null) { + logDirect("No goal."); + } else { + logDirect("Started segmented calculator"); + SegmentedCalculator.calculateSegmentsThreaded(pathingBehavior.pathStart(), pathingBehavior.getGoal(), new CalculationContext(baritone), ipath -> { + logDirect("Found a path"); + logDirect("Ends at " + ipath.getDest()); + logDirect("Length " + ipath.length()); + logDirect("Estimated time " + ipath.ticksRemainingFrom(0)); + pathingBehavior.secretCursedFunctionDoNotCall(ipath); // it's okay when *I* do it + }, () -> { + logDirect("Path calculation failed, no path"); + }); + } + return true; + } if (msg.equals("repack") || msg.equals("rescan")) { ChunkProviderClient cli = (ChunkProviderClient) ctx.world().getChunkProvider(); int playerChunkX = ctx.playerFeet().getX() >> 4; diff --git a/src/main/java/baritone/utils/pathing/SegmentedCalculator.java b/src/main/java/baritone/utils/pathing/SegmentedCalculator.java index 75dd0282..d3f6703e 100644 --- a/src/main/java/baritone/utils/pathing/SegmentedCalculator.java +++ b/src/main/java/baritone/utils/pathing/SegmentedCalculator.java @@ -23,9 +23,11 @@ import baritone.api.pathing.goals.Goal; import baritone.api.utils.BetterBlockPos; import baritone.api.utils.PathCalculationResult; import baritone.behavior.PathingBehavior; +import baritone.cache.CachedWorld; import baritone.pathing.calc.AbstractNodeCostSearch; import baritone.pathing.movement.CalculationContext; import baritone.pathing.path.SplicedPath; +import net.minecraft.util.EnumFacing; import java.util.Optional; import java.util.function.Consumer; @@ -52,8 +54,8 @@ public class SegmentedCalculator { PathCalculationResult result = segment(soFar); switch (result.getType()) { case SUCCESS_SEGMENT: + case SUCCESS_TO_GOAL: break; - case SUCCESS_TO_GOAL: // if we've gotten all the way to the goal, we're done case FAILURE: // if path calculation failed, we're done case EXCEPTION: // if path calculation threw an exception, we're done return soFar; @@ -62,13 +64,30 @@ public class SegmentedCalculator { } IPath segment = result.getPath().get(); // path calculation result type is SUCCESS_SEGMENT, so the path must be present IPath combined = soFar.map(previous -> (IPath) SplicedPath.trySplice(previous, segment, true).get()).orElse(segment); + loadAdjacent(combined.getDest().getX(), combined.getDest().getZ()); soFar = Optional.of(combined); + if (result.getType() == PathCalculationResult.Type.SUCCESS_TO_GOAL) { + return soFar; + } + } + } + + private void loadAdjacent(int blockX, int blockZ) { + BetterBlockPos bp = new BetterBlockPos(blockX, 64, blockZ); + CachedWorld cached = (CachedWorld) context.getBaritone().getPlayerContext().worldData().getCachedWorld(); + for (int i = 0; i < 4; i++) { + // pathing thread is not allowed to load new cached regions from disk + // it checks if every chunk is loaded before getting blocks from it + // so you see path segments ending at multiples of 512 (plus or minus one) on either x or z axis + // this loads every adjacent chunk to the segment end, so it can continue into the next cached region + BetterBlockPos toLoad = bp.offset(EnumFacing.byHorizontalIndex(i), 16); + cached.tryLoadFromDisk(toLoad.x >> 9, toLoad.z >> 9); } } private PathCalculationResult segment(Optional previous) { BetterBlockPos segmentStart = previous.map(IPath::getDest).orElse(start); // <-- e p i c - AbstractNodeCostSearch search = PathingBehavior.createPathfinder(segmentStart, goal, previous.orElse(null), context); + AbstractNodeCostSearch search = PathingBehavior.createPathfinder(segmentStart, goal, previous.orElse(null), context, false); return search.calculate(Baritone.settings().primaryTimeoutMS.get(), Baritone.settings().failureTimeoutMS.get()); // use normal time settings, not the plan ahead settings, so as to not overwhelm the computer } From 943b75455b8759f4d7774afa6fb3d0563ba7b051 Mon Sep 17 00:00:00 2001 From: Leijurv Date: Sun, 25 Nov 2018 12:13:49 -0800 Subject: [PATCH 03/24] no point if you don't copy it, really fixes #210 --- src/main/java/baritone/utils/BlockStateInterface.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/baritone/utils/BlockStateInterface.java b/src/main/java/baritone/utils/BlockStateInterface.java index b6b264d0..96493e00 100644 --- a/src/main/java/baritone/utils/BlockStateInterface.java +++ b/src/main/java/baritone/utils/BlockStateInterface.java @@ -23,6 +23,7 @@ import baritone.cache.CachedRegion; import baritone.cache.WorldData; import baritone.utils.accessor.IChunkProviderClient; import it.unimi.dsi.fastutil.longs.Long2ObjectMap; +import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.client.Minecraft; @@ -53,7 +54,7 @@ public class BlockStateInterface { public BlockStateInterface(World world, WorldData worldData) { this.worldData = worldData; - this.loadedChunks = ((IChunkProviderClient) world.getChunkProvider()).loadedChunks(); + this.loadedChunks = new Long2ObjectOpenHashMap<>(((IChunkProviderClient) world.getChunkProvider()).loadedChunks()); // make a copy that we can safely access from another thread if (!Minecraft.getMinecraft().isCallingFromMinecraftThread()) { throw new IllegalStateException(); } From 2ba0e6ada673e7952aa1fd650646a1e27a55a070 Mon Sep 17 00:00:00 2001 From: Leijurv Date: Sun, 25 Nov 2018 22:19:04 -0800 Subject: [PATCH 04/24] don't create a new bsi hundreds of times a tick maybe? --- .../api/pathing/movement/IMovement.java | 8 ------- .../baritone/pathing/movement/Movement.java | 13 ++++------- .../movement/movements/MovementDiagonal.java | 9 ++++---- .../baritone/pathing/path/PathExecutor.java | 23 +++++++++++-------- 4 files changed, 23 insertions(+), 30 deletions(-) diff --git a/src/api/java/baritone/api/pathing/movement/IMovement.java b/src/api/java/baritone/api/pathing/movement/IMovement.java index 7b3eca5f..c9b9ea4b 100644 --- a/src/api/java/baritone/api/pathing/movement/IMovement.java +++ b/src/api/java/baritone/api/pathing/movement/IMovement.java @@ -20,8 +20,6 @@ package baritone.api.pathing.movement; import baritone.api.utils.BetterBlockPos; import net.minecraft.util.math.BlockPos; -import java.util.List; - /** * @author Brady * @since 10/8/2018 @@ -58,10 +56,4 @@ public interface IMovement { BetterBlockPos getDest(); BlockPos getDirection(); - - List toBreak(); - - List toPlace(); - - List toWalkInto(); } diff --git a/src/main/java/baritone/pathing/movement/Movement.java b/src/main/java/baritone/pathing/movement/Movement.java index a3e841c6..f0f20648 100644 --- a/src/main/java/baritone/pathing/movement/Movement.java +++ b/src/main/java/baritone/pathing/movement/Movement.java @@ -244,14 +244,13 @@ public abstract class Movement implements IMovement, MovementHelper { toWalkIntoCached = null; } - @Override - public List toBreak() { + public List toBreak(BlockStateInterface bsi) { if (toBreakCached != null) { return toBreakCached; } List result = new ArrayList<>(); for (BetterBlockPos positionToBreak : positionsToBreak) { - if (!MovementHelper.canWalkThrough(ctx, positionToBreak)) { + if (!MovementHelper.canWalkThrough(bsi, positionToBreak.x, positionToBreak.y, positionToBreak.z)) { result.add(positionToBreak); } } @@ -259,21 +258,19 @@ public abstract class Movement implements IMovement, MovementHelper { return result; } - @Override - public List toPlace() { + public List toPlace(BlockStateInterface bsi) { if (toPlaceCached != null) { return toPlaceCached; } List result = new ArrayList<>(); - if (positionToPlace != null && !MovementHelper.canWalkOn(ctx, positionToPlace)) { + if (positionToPlace != null && !MovementHelper.canWalkOn(bsi, positionToPlace.x, positionToPlace.y, positionToPlace.z)) { result.add(positionToPlace); } toPlaceCached = result; return result; } - @Override - public List toWalkInto() { // overridden by movementdiagonal + public List toWalkInto(BlockStateInterface bsi) { // overridden by movementdiagonal if (toWalkIntoCached == null) { toWalkIntoCached = new ArrayList<>(); } diff --git a/src/main/java/baritone/pathing/movement/movements/MovementDiagonal.java b/src/main/java/baritone/pathing/movement/movements/MovementDiagonal.java index 4a098380..49385273 100644 --- a/src/main/java/baritone/pathing/movement/movements/MovementDiagonal.java +++ b/src/main/java/baritone/pathing/movement/movements/MovementDiagonal.java @@ -25,6 +25,7 @@ import baritone.pathing.movement.CalculationContext; import baritone.pathing.movement.Movement; import baritone.pathing.movement.MovementHelper; import baritone.pathing.movement.MovementState; +import baritone.utils.BlockStateInterface; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.init.Blocks; @@ -158,13 +159,13 @@ public class MovementDiagonal extends Movement { } @Override - public List toBreak() { + public List toBreak(BlockStateInterface bsi) { if (toBreakCached != null) { return toBreakCached; } List result = new ArrayList<>(); for (int i = 4; i < 6; i++) { - if (!MovementHelper.canWalkThrough(ctx, positionsToBreak[i])) { + if (!MovementHelper.canWalkThrough(bsi, positionsToBreak[i].x, positionsToBreak[i].y, positionsToBreak[i].z)) { result.add(positionsToBreak[i]); } } @@ -173,13 +174,13 @@ public class MovementDiagonal extends Movement { } @Override - public List toWalkInto() { + public List toWalkInto(BlockStateInterface bsi) { if (toWalkIntoCached == null) { toWalkIntoCached = new ArrayList<>(); } List result = new ArrayList<>(); for (int i = 0; i < 4; i++) { - if (!MovementHelper.canWalkThrough(ctx, positionsToBreak[i])) { + if (!MovementHelper.canWalkThrough(bsi, positionsToBreak[i].x, positionsToBreak[i].y, positionsToBreak[i].z)) { result.add(positionsToBreak[i]); } } diff --git a/src/main/java/baritone/pathing/path/PathExecutor.java b/src/main/java/baritone/pathing/path/PathExecutor.java index 171dd769..b17cd281 100644 --- a/src/main/java/baritone/pathing/path/PathExecutor.java +++ b/src/main/java/baritone/pathing/path/PathExecutor.java @@ -30,6 +30,7 @@ import baritone.api.utils.input.Input; import baritone.behavior.PathingBehavior; import baritone.pathing.calc.AbstractNodeCostSearch; import baritone.pathing.movement.CalculationContext; +import baritone.pathing.movement.Movement; import baritone.pathing.movement.MovementHelper; import baritone.pathing.movement.movements.*; import baritone.utils.BlockStateInterface; @@ -186,22 +187,23 @@ public class PathExecutor implements IPathExecutor, Helper { } }*/ //long start = System.nanoTime() / 1000000L; + BlockStateInterface bsi = new BlockStateInterface(ctx); for (int i = pathPosition - 10; i < pathPosition + 10; i++) { if (i < 0 || i >= path.movements().size()) { continue; } - IMovement m = path.movements().get(i); - HashSet prevBreak = new HashSet<>(m.toBreak()); - HashSet prevPlace = new HashSet<>(m.toPlace()); - HashSet prevWalkInto = new HashSet<>(m.toWalkInto()); + Movement m = (Movement) path.movements().get(i); + HashSet prevBreak = new HashSet<>(m.toBreak(bsi)); + HashSet prevPlace = new HashSet<>(m.toPlace(bsi)); + HashSet prevWalkInto = new HashSet<>(m.toWalkInto(bsi)); m.resetBlockCache(); - if (!prevBreak.equals(new HashSet<>(m.toBreak()))) { + if (!prevBreak.equals(new HashSet<>(m.toBreak(bsi)))) { recalcBP = true; } - if (!prevPlace.equals(new HashSet<>(m.toPlace()))) { + if (!prevPlace.equals(new HashSet<>(m.toPlace(bsi)))) { recalcBP = true; } - if (!prevWalkInto.equals(new HashSet<>(m.toWalkInto()))) { + if (!prevWalkInto.equals(new HashSet<>(m.toWalkInto(bsi)))) { recalcBP = true; } } @@ -210,9 +212,10 @@ public class PathExecutor implements IPathExecutor, Helper { HashSet newPlace = new HashSet<>(); HashSet newWalkInto = new HashSet<>(); for (int i = pathPosition; i < path.movements().size(); i++) { - newBreak.addAll(path.movements().get(i).toBreak()); - newPlace.addAll(path.movements().get(i).toPlace()); - newWalkInto.addAll(path.movements().get(i).toWalkInto()); + Movement movement = (Movement) path.movements().get(i); + newBreak.addAll(movement.toBreak(bsi)); + newPlace.addAll(movement.toPlace(bsi)); + newWalkInto.addAll(movement.toWalkInto(bsi)); } toBreak = newBreak; toPlace = newPlace; From f9a3a3b78bc0229f266745b3cbabd6e11040c4bb Mon Sep 17 00:00:00 2001 From: Leijurv Date: Sun, 25 Nov 2018 22:30:37 -0800 Subject: [PATCH 05/24] main thread bsi creation doesn't need to copy loaded chunks --- .../java/baritone/behavior/PathingBehavior.java | 2 +- .../pathing/movement/CalculationContext.java | 6 +++++- .../java/baritone/process/GetToBlockProcess.java | 2 +- src/main/java/baritone/process/MineProcess.java | 2 +- .../java/baritone/utils/BlockStateInterface.java | 15 ++++++++++++--- .../baritone/utils/ExampleBaritoneControl.java | 2 +- 6 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/main/java/baritone/behavior/PathingBehavior.java b/src/main/java/baritone/behavior/PathingBehavior.java index 3e8c3595..1a4b12b9 100644 --- a/src/main/java/baritone/behavior/PathingBehavior.java +++ b/src/main/java/baritone/behavior/PathingBehavior.java @@ -409,7 +409,7 @@ public final class PathingBehavior extends Behavior implements IPathingBehavior, primaryTimeout = Baritone.settings().planAheadPrimaryTimeoutMS.get(); failureTimeout = Baritone.settings().planAheadFailureTimeoutMS.get(); } - CalculationContext context = new CalculationContext(baritone); // not safe to create on the other thread, it looks up a lot of stuff in minecraft + CalculationContext context = new CalculationContext(baritone, true); // not safe to create on the other thread, it looks up a lot of stuff in minecraft AbstractNodeCostSearch pathfinder = createPathfinder(start, goal, current == null ? null : current.getPath(), context, true); if (!Objects.equals(pathfinder.getGoal(), goal)) { logDebug("Simplifying " + goal.getClass() + " to GoalXZ due to distance"); diff --git a/src/main/java/baritone/pathing/movement/CalculationContext.java b/src/main/java/baritone/pathing/movement/CalculationContext.java index cb4727cc..ace7670c 100644 --- a/src/main/java/baritone/pathing/movement/CalculationContext.java +++ b/src/main/java/baritone/pathing/movement/CalculationContext.java @@ -60,11 +60,15 @@ public class CalculationContext { private final BetterWorldBorder worldBorder; public CalculationContext(IBaritone baritone) { + this(baritone, false); + } + + public CalculationContext(IBaritone baritone, boolean forUseOnAnotherThread) { this.baritone = baritone; this.player = baritone.getPlayerContext().player(); this.world = baritone.getPlayerContext().world(); this.worldData = (WorldData) baritone.getWorldProvider().getCurrentWorld(); - this.bsi = new BlockStateInterface(world, worldData); // TODO TODO TODO + this.bsi = new BlockStateInterface(world, worldData, forUseOnAnotherThread); // TODO TODO TODO // new CalculationContext() needs to happen, can't add an argument (i'll beat you), can we get the world provider from currentlyTicking? this.toolSet = new ToolSet(player); this.hasThrowaway = Baritone.settings().allowPlace.get() && MovementHelper.throwaway(baritone.getPlayerContext(), false); diff --git a/src/main/java/baritone/process/GetToBlockProcess.java b/src/main/java/baritone/process/GetToBlockProcess.java index 95f2122b..920e5743 100644 --- a/src/main/java/baritone/process/GetToBlockProcess.java +++ b/src/main/java/baritone/process/GetToBlockProcess.java @@ -77,7 +77,7 @@ public class GetToBlockProcess extends BaritoneProcessHelper implements IGetToBl int mineGoalUpdateInterval = Baritone.settings().mineGoalUpdateInterval.get(); if (mineGoalUpdateInterval != 0 && tickCount++ % mineGoalUpdateInterval == 0) { // big brain List current = new ArrayList<>(knownLocations); - CalculationContext context = new CalculationContext(baritone); + CalculationContext context = new CalculationContext(baritone, true); Baritone.getExecutor().execute(() -> rescan(current, context)); } Goal goal = new GoalComposite(knownLocations.stream().map(GoalGetToBlock::new).toArray(Goal[]::new)); diff --git a/src/main/java/baritone/process/MineProcess.java b/src/main/java/baritone/process/MineProcess.java index 4ea75387..8b93d1cb 100644 --- a/src/main/java/baritone/process/MineProcess.java +++ b/src/main/java/baritone/process/MineProcess.java @@ -89,7 +89,7 @@ public final class MineProcess extends BaritoneProcessHelper implements IMinePro int mineGoalUpdateInterval = Baritone.settings().mineGoalUpdateInterval.get(); if (mineGoalUpdateInterval != 0 && tickCount++ % mineGoalUpdateInterval == 0) { // big brain List curr = new ArrayList<>(knownOreLocations); - CalculationContext context = new CalculationContext(baritone); + CalculationContext context = new CalculationContext(baritone, true); Baritone.getExecutor().execute(() -> rescan(curr, context)); } if (Baritone.settings().legitMine.get()) { diff --git a/src/main/java/baritone/utils/BlockStateInterface.java b/src/main/java/baritone/utils/BlockStateInterface.java index 96493e00..be49c97c 100644 --- a/src/main/java/baritone/utils/BlockStateInterface.java +++ b/src/main/java/baritone/utils/BlockStateInterface.java @@ -49,12 +49,21 @@ public class BlockStateInterface { private static final IBlockState AIR = Blocks.AIR.getDefaultState(); public BlockStateInterface(IPlayerContext ctx) { - this(ctx.world(), (WorldData) ctx.worldData()); + this(ctx, false); } - public BlockStateInterface(World world, WorldData worldData) { + public BlockStateInterface(IPlayerContext ctx, boolean copyLoadedChunks) { + this(ctx.world(), (WorldData) ctx.worldData(), copyLoadedChunks); + } + + public BlockStateInterface(World world, WorldData worldData, boolean copyLoadedChunks) { this.worldData = worldData; - this.loadedChunks = new Long2ObjectOpenHashMap<>(((IChunkProviderClient) world.getChunkProvider()).loadedChunks()); // make a copy that we can safely access from another thread + Long2ObjectMap worldLoaded = ((IChunkProviderClient) world.getChunkProvider()).loadedChunks(); + if (copyLoadedChunks) { + this.loadedChunks = new Long2ObjectOpenHashMap<>(worldLoaded); // make a copy that we can safely access from another thread + } else { + this.loadedChunks = worldLoaded; // this will only be used on the main thread + } if (!Minecraft.getMinecraft().isCallingFromMinecraftThread()) { throw new IllegalStateException(); } diff --git a/src/main/java/baritone/utils/ExampleBaritoneControl.java b/src/main/java/baritone/utils/ExampleBaritoneControl.java index 6b2c7448..2c112ee3 100644 --- a/src/main/java/baritone/utils/ExampleBaritoneControl.java +++ b/src/main/java/baritone/utils/ExampleBaritoneControl.java @@ -208,7 +208,7 @@ public class ExampleBaritoneControl extends Behavior implements Helper { logDirect("No goal."); } else { logDirect("Started segmented calculator"); - SegmentedCalculator.calculateSegmentsThreaded(pathingBehavior.pathStart(), pathingBehavior.getGoal(), new CalculationContext(baritone), ipath -> { + SegmentedCalculator.calculateSegmentsThreaded(pathingBehavior.pathStart(), pathingBehavior.getGoal(), new CalculationContext(baritone, true), ipath -> { logDirect("Found a path"); logDirect("Ends at " + ipath.getDest()); logDirect("Length " + ipath.length()); From 14daf2ce85160a6b746ae0826075640af311b99b Mon Sep 17 00:00:00 2001 From: Leijurv Date: Sun, 25 Nov 2018 22:50:22 -0800 Subject: [PATCH 06/24] unneeded, and was allocating thousands of sets a second --- src/main/java/baritone/pathing/movement/MovementHelper.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/baritone/pathing/movement/MovementHelper.java b/src/main/java/baritone/pathing/movement/MovementHelper.java index 917adc7c..581b0d0f 100644 --- a/src/main/java/baritone/pathing/movement/MovementHelper.java +++ b/src/main/java/baritone/pathing/movement/MovementHelper.java @@ -465,7 +465,6 @@ public interface MovementHelper extends ActionCosts, Helper { static boolean isFlowing(IBlockState state) { // Will be IFluidState in 1.13 return state.getBlock() instanceof BlockLiquid - && state.getPropertyKeys().contains(BlockLiquid.LEVEL) && state.getValue(BlockLiquid.LEVEL) != 0; } } From 06dd07dbc67b01cc6fa51c01ba7568af76aeb631 Mon Sep 17 00:00:00 2001 From: Leijurv Date: Sun, 25 Nov 2018 22:57:08 -0800 Subject: [PATCH 07/24] believe it or not, this saves thousands of object allocations per second --- src/api/java/baritone/api/utils/VecUtils.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/api/java/baritone/api/utils/VecUtils.java b/src/api/java/baritone/api/utils/VecUtils.java index 090cb9d7..1df01163 100644 --- a/src/api/java/baritone/api/utils/VecUtils.java +++ b/src/api/java/baritone/api/utils/VecUtils.java @@ -81,10 +81,9 @@ public final class VecUtils { * @see #getBlockPosCenter(BlockPos) */ public static double distanceToCenter(BlockPos pos, double x, double y, double z) { - Vec3d center = getBlockPosCenter(pos); - double xdiff = x - center.x; - double ydiff = y - center.y; - double zdiff = z - center.z; + double xdiff = pos.getX() + 0.5 - x; + double ydiff = pos.getY() + 0.5 - y; + double zdiff = pos.getZ() + 0.5 - z; return Math.sqrt(xdiff * xdiff + ydiff * ydiff + zdiff * zdiff); } From cf2765e017d218a465c29901806647ed6439dbcb Mon Sep 17 00:00:00 2001 From: Leijurv Date: Sun, 25 Nov 2018 22:57:54 -0800 Subject: [PATCH 08/24] thousands here too, on long paths --- src/api/java/baritone/api/pathing/calc/IPath.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/api/java/baritone/api/pathing/calc/IPath.java b/src/api/java/baritone/api/pathing/calc/IPath.java index 133de5ef..8f0cb68e 100644 --- a/src/api/java/baritone/api/pathing/calc/IPath.java +++ b/src/api/java/baritone/api/pathing/calc/IPath.java @@ -109,8 +109,9 @@ public interface IPath { default double ticksRemainingFrom(int pathPosition) { double sum = 0; //this is fast because we aren't requesting recalculation, it's just cached - for (int i = pathPosition; i < movements().size(); i++) { - sum += movements().get(i).getCost(); + List movements = movements(); + for (int i = pathPosition; i < movements.size(); i++) { + sum += movements.get(i).getCost(); } return sum; } From d9effc4a299f5cad54b6a6f2b9acb7b46589f505 Mon Sep 17 00:00:00 2001 From: Leijurv Date: Sun, 25 Nov 2018 22:59:47 -0800 Subject: [PATCH 09/24] avoid creating thousands of unmodifiable lists just to get their size --- src/main/java/baritone/pathing/path/SplicedPath.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/baritone/pathing/path/SplicedPath.java b/src/main/java/baritone/pathing/path/SplicedPath.java index f3263718..f2187fe7 100644 --- a/src/main/java/baritone/pathing/path/SplicedPath.java +++ b/src/main/java/baritone/pathing/path/SplicedPath.java @@ -62,6 +62,11 @@ public class SplicedPath extends PathBase { return numNodes; } + @Override + public int length() { + return path.size(); + } + public static Optional trySplice(IPath first, IPath second, boolean allowOverlapCutoff) { if (second == null || first == null) { return Optional.empty(); From 6d1130d2c3eadcfbfa880edb791940cf6b3c5305 Mon Sep 17 00:00:00 2001 From: Leijurv Date: Mon, 26 Nov 2018 07:52:00 -0800 Subject: [PATCH 10/24] favored lookup performance --- .../java/baritone/behavior/PathingBehavior.java | 13 +++++++++---- .../java/baritone/pathing/calc/AStarPathFinder.java | 7 ++++--- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/main/java/baritone/behavior/PathingBehavior.java b/src/main/java/baritone/behavior/PathingBehavior.java index 1a4b12b9..106f52cc 100644 --- a/src/main/java/baritone/behavior/PathingBehavior.java +++ b/src/main/java/baritone/behavior/PathingBehavior.java @@ -37,12 +37,15 @@ import baritone.pathing.path.CutoffPath; import baritone.pathing.path.PathExecutor; import baritone.utils.Helper; import baritone.utils.PathRenderer; +import it.unimi.dsi.fastutil.longs.LongOpenHashSet; import net.minecraft.util.math.BlockPos; import net.minecraft.world.chunk.EmptyChunk; -import java.util.*; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.Objects; +import java.util.Optional; import java.util.concurrent.LinkedBlockingQueue; -import java.util.stream.Collectors; public final class PathingBehavior extends Behavior implements IPathingBehavior, Helper { @@ -492,9 +495,11 @@ public final class PathingBehavior extends Behavior implements IPathingBehavior, transformed = new GoalXZ(pos.getX(), pos.getZ()); } } - HashSet favoredPositions = null; + LongOpenHashSet favoredPositions = null; if (Baritone.settings().backtrackCostFavoringCoefficient.get() != 1D && previous != null) { - favoredPositions = previous.positions().stream().map(BetterBlockPos::longHash).collect(Collectors.toCollection(HashSet::new)); + LongOpenHashSet tmp = new LongOpenHashSet(); + previous.positions().forEach(pos -> tmp.add(BetterBlockPos.longHash(pos))); + favoredPositions = tmp; } return new AStarPathFinder(start.getX(), start.getY(), start.getZ(), transformed, favoredPositions, context); } diff --git a/src/main/java/baritone/pathing/calc/AStarPathFinder.java b/src/main/java/baritone/pathing/calc/AStarPathFinder.java index 989fda55..d7292da7 100644 --- a/src/main/java/baritone/pathing/calc/AStarPathFinder.java +++ b/src/main/java/baritone/pathing/calc/AStarPathFinder.java @@ -28,6 +28,7 @@ import baritone.pathing.movement.Moves; import baritone.utils.Helper; import baritone.utils.pathing.BetterWorldBorder; import baritone.utils.pathing.MutableMoveResult; +import it.unimi.dsi.fastutil.longs.LongOpenHashSet; import java.util.HashSet; import java.util.Optional; @@ -39,10 +40,10 @@ import java.util.Optional; */ public final class AStarPathFinder extends AbstractNodeCostSearch implements Helper { - private final HashSet favoredPositions; + private final LongOpenHashSet favoredPositions; private final CalculationContext calcContext; - public AStarPathFinder(int startX, int startY, int startZ, Goal goal, HashSet favoredPositions, CalculationContext context) { + public AStarPathFinder(int startX, int startY, int startZ, Goal goal, LongOpenHashSet favoredPositions, CalculationContext context) { super(startX, startY, startZ, goal, context); this.favoredPositions = favoredPositions; this.calcContext = context; @@ -63,7 +64,7 @@ public final class AStarPathFinder extends AbstractNodeCostSearch implements Hel bestSoFar[i] = startNode; } MutableMoveResult res = new MutableMoveResult(); - HashSet favored = favoredPositions; + LongOpenHashSet favored = favoredPositions; BetterWorldBorder worldBorder = new BetterWorldBorder(calcContext.world().getWorldBorder()); long startTime = System.nanoTime() / 1000000L; boolean slowPath = Baritone.settings().slowPath.get(); From f25786635bde9539ec745b4b45b28994a0d0b269 Mon Sep 17 00:00:00 2001 From: Leijurv Date: Mon, 26 Nov 2018 07:58:10 -0800 Subject: [PATCH 11/24] over 10k less objects per second --- src/main/java/baritone/cache/ChunkPacker.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/baritone/cache/ChunkPacker.java b/src/main/java/baritone/cache/ChunkPacker.java index cd072bb6..f83d374e 100644 --- a/src/main/java/baritone/cache/ChunkPacker.java +++ b/src/main/java/baritone/cache/ChunkPacker.java @@ -39,6 +39,8 @@ import java.util.*; */ public final class ChunkPacker { + private static final Map resourceCache = new HashMap<>(); + private ChunkPacker() {} public static CachedChunk pack(Chunk chunk) { @@ -120,7 +122,7 @@ public final class ChunkPacker { } public static Block stringToBlock(String name) { - return Block.getBlockFromName(name.contains(":") ? name : "minecraft:" + name); + return resourceCache.computeIfAbsent(name, n -> Block.getBlockFromName(n.contains(":") ? n : "minecraft:" + n)); } private static PathingBlockType getPathingBlockType(IBlockState state) { From 58d91342865ab2baf2a6c61f094a590b5cfcd2bd Mon Sep 17 00:00:00 2001 From: Leijurv Date: Mon, 26 Nov 2018 15:01:34 -0800 Subject: [PATCH 12/24] fix behavior around cocoa pods and vines, fixes #277 --- .../java/baritone/pathing/movement/MovementHelper.java | 3 ++- .../pathing/movement/movements/MovementDiagonal.java | 7 ++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/java/baritone/pathing/movement/MovementHelper.java b/src/main/java/baritone/pathing/movement/MovementHelper.java index 581b0d0f..30f48b3b 100644 --- a/src/main/java/baritone/pathing/movement/MovementHelper.java +++ b/src/main/java/baritone/pathing/movement/MovementHelper.java @@ -70,7 +70,7 @@ public interface MovementHelper extends ActionCosts, Helper { if (block == Blocks.AIR) { // early return for most common case return true; } - if (block == Blocks.FIRE || block == Blocks.TRIPWIRE || block == Blocks.WEB || block == Blocks.END_PORTAL) { + if (block == Blocks.FIRE || block == Blocks.TRIPWIRE || block == Blocks.WEB || block == Blocks.END_PORTAL || block == Blocks.COCOA) { return false; } if (block instanceof BlockDoor || block instanceof BlockFenceGate) { @@ -139,6 +139,7 @@ public interface MovementHelper extends ActionCosts, Helper { || block == Blocks.WEB || block == Blocks.VINE || block == Blocks.LADDER + || block == Blocks.COCOA || block instanceof BlockDoor || block instanceof BlockFenceGate || block instanceof BlockSnow diff --git a/src/main/java/baritone/pathing/movement/movements/MovementDiagonal.java b/src/main/java/baritone/pathing/movement/movements/MovementDiagonal.java index 49385273..afe5a976 100644 --- a/src/main/java/baritone/pathing/movement/movements/MovementDiagonal.java +++ b/src/main/java/baritone/pathing/movement/movements/MovementDiagonal.java @@ -116,7 +116,8 @@ public class MovementDiagonal extends Movement { return COST_INF; } boolean water = false; - if (MovementHelper.isWater(context.getBlock(x, y, z)) || MovementHelper.isWater(destInto.getBlock())) { + Block startIn = context.getBlock(x, y, z); + if (MovementHelper.isWater(startIn) || MovementHelper.isWater(destInto.getBlock())) { // Ignore previous multiplier // Whatever we were walking on (possibly soul sand) doesn't matter as we're actually floating on water // Not even touching the blocks below @@ -125,6 +126,10 @@ public class MovementDiagonal extends Movement { } if (optionA != 0 || optionB != 0) { multiplier *= SQRT_2 - 0.001; // TODO tune + if (startIn == Blocks.LADDER || startIn == Blocks.VINE) { + // edging around doesn't work if doing so would climb a ladder or vine instead of moving sideways + return COST_INF; + } } if (context.canSprint() && !water) { // If we aren't edging around anything, and we aren't in water From a8404a728631cd1ac91b3a7096841b74b10d786c Mon Sep 17 00:00:00 2001 From: Leijurv Date: Mon, 26 Nov 2018 15:32:28 -0800 Subject: [PATCH 13/24] only walk through supported snow, fixes #276 --- src/main/java/baritone/pathing/movement/MovementHelper.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/baritone/pathing/movement/MovementHelper.java b/src/main/java/baritone/pathing/movement/MovementHelper.java index 30f48b3b..9d31a379 100644 --- a/src/main/java/baritone/pathing/movement/MovementHelper.java +++ b/src/main/java/baritone/pathing/movement/MovementHelper.java @@ -92,7 +92,11 @@ public interface MovementHelper extends ActionCosts, Helper { if (snow) { // the check in BlockSnow.isPassable is layers < 5 // while actually, we want < 3 because 3 or greater makes it impassable in a 2 high ceiling - return state.getValue(BlockSnow.LAYERS) < 3; + if (state.getValue(BlockSnow.LAYERS) >= 3) { + return false; + } + // ok, it's low enough we could walk through it, but is it supported? + return canWalkOn(bsi, x, y - 1, z); } if (trapdoor) { return !state.getValue(BlockTrapDoor.OPEN); // see BlockTrapDoor.isPassable From 043d6ffd2088eda7e085d9b84806698a461b3c43 Mon Sep 17 00:00:00 2001 From: Leijurv Date: Tue, 27 Nov 2018 10:37:48 -0800 Subject: [PATCH 14/24] improve pathingbehavior resiliency --- src/main/java/baritone/behavior/PathingBehavior.java | 4 +++- .../java/baritone/pathing/calc/AbstractNodeCostSearch.java | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/baritone/behavior/PathingBehavior.java b/src/main/java/baritone/behavior/PathingBehavior.java index 106f52cc..c6c8042f 100644 --- a/src/main/java/baritone/behavior/PathingBehavior.java +++ b/src/main/java/baritone/behavior/PathingBehavior.java @@ -470,7 +470,9 @@ public final class PathingBehavior extends Behavior implements IPathingBehavior, queuePathEvent(PathEvent.NEXT_CALC_FAILED); } } else { - throw new IllegalStateException("I have no idea what to do with this path"); + //throw new IllegalStateException("I have no idea what to do with this path"); + // no point in throwing an exception here, and it gets it stuck with inProgress being not null + logDirect("Warning: PathingBehaivor illegal state! Discarding invalid path!"); } } if (talkAboutIt && current != null && current.getPath() != null) { diff --git a/src/main/java/baritone/pathing/calc/AbstractNodeCostSearch.java b/src/main/java/baritone/pathing/calc/AbstractNodeCostSearch.java index f2dcf4b1..2a1681b7 100644 --- a/src/main/java/baritone/pathing/calc/AbstractNodeCostSearch.java +++ b/src/main/java/baritone/pathing/calc/AbstractNodeCostSearch.java @@ -86,7 +86,7 @@ public abstract class AbstractNodeCostSearch implements IPathFinder { @Override public synchronized PathCalculationResult calculate(long primaryTimeout, long failureTimeout) { if (isFinished) { - throw new IllegalStateException("Path Finder is currently in use, and cannot be reused!"); + throw new IllegalStateException("Path finder cannot be reused!"); } cancelRequested = false; try { From 6f7729e34ea68be69ff5fb4d178f6a0ad79ecfe8 Mon Sep 17 00:00:00 2001 From: Leijurv Date: Wed, 28 Nov 2018 18:21:27 -0800 Subject: [PATCH 15/24] add missing synchronized blocks --- .../baritone/behavior/PathingBehavior.java | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/main/java/baritone/behavior/PathingBehavior.java b/src/main/java/baritone/behavior/PathingBehavior.java index c6c8042f..bd2146b8 100644 --- a/src/main/java/baritone/behavior/PathingBehavior.java +++ b/src/main/java/baritone/behavior/PathingBehavior.java @@ -280,11 +280,13 @@ public final class PathingBehavior extends Behavior implements IPathingBehavior, } public void softCancelIfSafe() { - if (!isSafeToCancel()) { - return; + synchronized (pathPlanLock) { + if (!isSafeToCancel()) { + return; + } + current = null; + next = null; } - current = null; - next = null; cancelRequested = true; getInProgress().ifPresent(AbstractNodeCostSearch::cancel); // only cancel ours // do everything BUT clear keys @@ -293,8 +295,10 @@ public final class PathingBehavior extends Behavior implements IPathingBehavior, // just cancel the current path public void secretInternalSegmentCancel() { queuePathEvent(PathEvent.CANCELED); - current = null; - next = null; + synchronized (pathPlanLock) { + current = null; + next = null; + } baritone.getInputOverrideHandler().clearAllKeys(); getInProgress().ifPresent(AbstractNodeCostSearch::cancel); baritone.getInputOverrideHandler().getBlockBreakHelper().stopBreakingBlock(); @@ -334,7 +338,9 @@ public final class PathingBehavior extends Behavior implements IPathingBehavior, } public void secretCursedFunctionDoNotCall(IPath path) { - current = new PathExecutor(this, path); + synchronized (pathPlanLock) { + current = new PathExecutor(this, path); + } } /** From 5daaaf5282455ddda314fd3e030909efbc41445d Mon Sep 17 00:00:00 2001 From: Leijurv Date: Thu, 29 Nov 2018 15:33:35 -0800 Subject: [PATCH 16/24] add settings reset command --- src/api/java/baritone/api/Settings.java | 6 ++++++ src/main/java/baritone/utils/ExampleBaritoneControl.java | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/src/api/java/baritone/api/Settings.java b/src/api/java/baritone/api/Settings.java index a835ed73..1a3fef08 100644 --- a/src/api/java/baritone/api/Settings.java +++ b/src/api/java/baritone/api/Settings.java @@ -553,6 +553,12 @@ public class Settings { */ public final List> allSettings; + public void reset() { + for (Setting setting : allSettings) { + setting.value = setting.defaultValue; + } + } + public class Setting { public T value; public final T defaultValue; diff --git a/src/main/java/baritone/utils/ExampleBaritoneControl.java b/src/main/java/baritone/utils/ExampleBaritoneControl.java index 2c112ee3..958af776 100644 --- a/src/main/java/baritone/utils/ExampleBaritoneControl.java +++ b/src/main/java/baritone/utils/ExampleBaritoneControl.java @@ -277,6 +277,11 @@ public class ExampleBaritoneControl extends Behavior implements Helper { }); return true; } + if (msg.equals("reset")) { + Baritone.settings().reset(); + logDirect("Baritone settings reset"); + return true; + } if (msg.startsWith("followplayers")) { baritone.getFollowProcess().follow(EntityPlayer.class::isInstance); // O P P A logDirect("Following any players"); From 6a402b4a2bd6867e2fdff0348bc4b63300f7095d Mon Sep 17 00:00:00 2001 From: Leijurv Date: Thu, 29 Nov 2018 20:36:19 -0800 Subject: [PATCH 17/24] fix the fire thing in a slightly different way --- src/api/java/baritone/api/utils/Rotation.java | 11 +++++++++++ src/main/java/baritone/pathing/movement/Movement.java | 5 +++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/api/java/baritone/api/utils/Rotation.java b/src/api/java/baritone/api/utils/Rotation.java index ea10c7ec..28afbf65 100644 --- a/src/api/java/baritone/api/utils/Rotation.java +++ b/src/api/java/baritone/api/utils/Rotation.java @@ -110,6 +110,17 @@ public class Rotation { ); } + /** + * Is really close to + * + * @param other another rotation + * @return are they really close + */ + public boolean isReallyCloseTo(Rotation other) { + float yawDiff = Math.abs(this.yaw - other.yaw); // you cant fool me + return (yawDiff < 0.01 || yawDiff > 359.9) && Math.abs(this.pitch - other.pitch) < 0.01; + } + /** * Clamps the specified pitch value between -90 and 90. * diff --git a/src/main/java/baritone/pathing/movement/Movement.java b/src/main/java/baritone/pathing/movement/Movement.java index f0f20648..4105b5e7 100644 --- a/src/main/java/baritone/pathing/movement/Movement.java +++ b/src/main/java/baritone/pathing/movement/Movement.java @@ -151,9 +151,10 @@ public abstract class Movement implements IMovement, MovementHelper { somethingInTheWay = true; Optional reachable = RotationUtils.reachable(ctx.player(), blockPos, ctx.playerController().getBlockReachDistance()); if (reachable.isPresent()) { + Rotation rotTowardsBlock = reachable.get(); MovementHelper.switchToBestToolFor(ctx, BlockStateInterface.get(ctx, blockPos)); - state.setTarget(new MovementState.MovementTarget(reachable.get(), true)); - if (Objects.equals(ctx.getSelectedBlock().orElse(null), blockPos)) { + state.setTarget(new MovementState.MovementTarget(rotTowardsBlock, true)); + if (Objects.equals(ctx.getSelectedBlock().orElse(null), blockPos) || ctx.playerRotations().isReallyCloseTo(rotTowardsBlock)) { state.setInput(Input.CLICK_LEFT, true); } return false; From 5ef03ba1d570072ebe9e8716932eabf8cce3e009 Mon Sep 17 00:00:00 2001 From: Leijurv Date: Fri, 30 Nov 2018 23:06:16 -0800 Subject: [PATCH 18/24] didn't make sense like that --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9fa8a2c9..904f3d61 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ Building Baritone: $ gradlew build ``` -For example, to replace out Impact 4.4's Baritone build with a customized one, switch to the `impact4.4-compat` branch, build Baritone as above then copy `dist/baritone-api-$VERSION$.jar` into `minecraft/libraries/cabaletta/baritone-api/1.0.0/baritone-api-1.0.0.jar`, replacing the jar that was previously there. You also need to edit `minecraft/versions/1.12.2-Impact_4.4/1.12.2-Impact_4.4.json`, find the line `"name": "cabaletta:baritone-api:1.0.0"`, remove the comma from the end, and entirely remove the line that's immediately after (starts with `"url"`). +To replace out Impact 4.4's Baritone build with a customized one, switch to the `impact4.4-compat` branch, build Baritone as above then copy `dist/baritone-api-$VERSION$.jar` into `minecraft/libraries/cabaletta/baritone-api/1.0.0/baritone-api-1.0.0.jar`, replacing the jar that was previously there. You also need to edit `minecraft/versions/1.12.2-Impact_4.4/1.12.2-Impact_4.4.json`, find the line `"name": "cabaletta:baritone-api:1.0.0"`, remove the comma from the end, and entirely remove the line that's immediately after (starts with `"url"`). ## IntelliJ's Gradle UI - Open the project in IntelliJ as a Gradle project From a017e14a48dc7770991edc541c971501488720a0 Mon Sep 17 00:00:00 2001 From: babbaj Date: Sat, 1 Dec 2018 06:31:40 -0500 Subject: [PATCH 19/24] give proguard the right jar based on mapping type --- .../baritone/gradle/task/ProguardTask.java | 105 ++++++++++++++++-- .../baritone/gradle/util/MappingType.java | 9 ++ .../baritone/gradle/util/ReobfWrapper.java | 40 +++++++ scripts/proguard.pro | 5 +- 4 files changed, 149 insertions(+), 10 deletions(-) create mode 100644 buildSrc/src/main/java/baritone/gradle/util/MappingType.java create mode 100644 buildSrc/src/main/java/baritone/gradle/util/ReobfWrapper.java diff --git a/buildSrc/src/main/java/baritone/gradle/task/ProguardTask.java b/buildSrc/src/main/java/baritone/gradle/task/ProguardTask.java index 350f7446..bae59bb7 100644 --- a/buildSrc/src/main/java/baritone/gradle/task/ProguardTask.java +++ b/buildSrc/src/main/java/baritone/gradle/task/ProguardTask.java @@ -18,10 +18,17 @@ package baritone.gradle.task; import baritone.gradle.util.Determinizer; +import baritone.gradle.util.MappingType; +import baritone.gradle.util.ReobfWrapper; import com.google.gson.*; +import java.lang.reflect.Field; +import java.nio.file.StandardCopyOption; +import java.util.stream.Collectors; import org.apache.commons.io.IOUtils; +import org.gradle.api.NamedDomainObjectContainer; import org.gradle.api.artifacts.Configuration; import org.gradle.api.artifacts.Dependency; +import org.gradle.api.internal.plugins.DefaultConvention; import org.gradle.api.tasks.Input; import org.gradle.api.tasks.TaskAction; import org.gradle.internal.Pair; @@ -163,15 +170,13 @@ public class ProguardTask extends BaritoneGradleTask { // Iterate the required libraries to copy them to tempLibraries for (String lib : this.requiredLibraries) { - // Download the version jar from the URL acquired from the version manifest - if (lib.startsWith("minecraft")) { - String version = lib.split("-")[1]; - Path versionJar = getTemporaryFile("tempLibraries/" + lib + ".jar"); - if (!Files.exists(versionJar)) { - JsonObject versionJson = PARSER.parse(new InputStreamReader(new URL(this.versionDownloadMap.get(version)).openStream())).getAsJsonObject(); - String url = versionJson.getAsJsonObject("downloads").getAsJsonObject("client").getAsJsonPrimitive("url").getAsString(); - write(new URL(url).openStream(), versionJar); - } + // copy from the forgegradle cache + if (lib.equals("minecraft")) { + final Path cachedJar = getMinecraftJar(); + final Path inTempDir = getTemporaryFile("tempLibraries/" + "minecraft.jar"); + // TODO: maybe try not to copy every time + Files.copy(cachedJar, inTempDir, StandardCopyOption.REPLACE_EXISTING); + continue; } @@ -195,6 +200,88 @@ public class ProguardTask extends BaritoneGradleTask { } } + // a bunch of bullshit to get the path to the cached jar + private Path getMinecraftJar() throws Exception { + MappingType mappingType; + try { + mappingType = getMappingType(); + } catch (Exception e) { + System.err.println("Failed to get mapping type, assuming NOTCH"); + mappingType = MappingType.SEARGE; + } + + String suffix; + switch (mappingType) { + case NOTCH: + suffix = ""; + break; + case SEARGE: + suffix = "-srgBin"; + break; + case CUSTOM: + throw new IllegalStateException("custom mappings not supported"); + default: + throw new IllegalStateException("Unknown mapping type: " + mappingType); + } + + DefaultConvention convention = (DefaultConvention)this.getProject().getConvention(); + final Object extension = convention.getAsMap().get("minecraft"); + Objects.requireNonNull(extension); + + // for some reason cant use Class.forName + Class class_baseExtension = extension.getClass().getSuperclass().getSuperclass().getSuperclass(); + Field f_replacer = class_baseExtension.getDeclaredField("replacer"); + f_replacer.setAccessible(true); + final Object replacer = f_replacer.get(extension); + Class class_replacementProvider = replacer.getClass(); + Field replacement_replaceMap = class_replacementProvider.getDeclaredField("replaceMap"); + replacement_replaceMap.setAccessible(true); + + final Map replacements = (Map)replacement_replaceMap.get(replacer); + final String cacheDir = replacements.get("CACHE_DIR").toString() + "/net/minecraft"; + final String mcVersion = replacements.get("MC_VERSION").toString(); + final String mcpInsert = replacements.get("MAPPING_CHANNEL").toString() + "/" + replacements.get("MAPPING_VERSION").toString(); + final String fullJarName = "minecraft" + "-" + mcVersion + suffix + ".jar"; + + final String baseDir = String.format("%s/minecraft/%s/", cacheDir, mcVersion); + + String jarPath; + if (mappingType == MappingType.SEARGE) { + jarPath = String.format("%s/%s/%s", baseDir, mcpInsert, fullJarName); + + } else { + jarPath = baseDir + fullJarName; + } + jarPath = jarPath + .replace("/", File.separator) + .replace("\\", File.separator);// fucking regex + + return new File(jarPath).toPath(); + } + + // throws IllegalStateException if mapping type is ambiguous or it fails to find it + private MappingType getMappingType() { + // if it fails to find this then its probably a forgegradle version problem + final Set reobf = (NamedDomainObjectContainer) this.getProject().getExtensions().getByName("reobf"); + + final List mappingTypes = getUsedMappingTypes(reobf); + final long mappingTypesUsed = mappingTypes.size(); + if (mappingTypesUsed == 0) + throw new IllegalStateException("Failed to find mapping type (no jar task?)"); + if (mappingTypesUsed > 1) + throw new IllegalStateException("Ambiguous mapping type (multiple jars with different mapping types?)"); + + return mappingTypes.get(0); + } + + private List getUsedMappingTypes(Set reobf) { + return reobf.stream() + .map(ReobfWrapper::new) + .map(ReobfWrapper::getMappingType) + .distinct() + .collect(Collectors.toList()); + } + private void proguardApi() throws Exception { runProguard(getTemporaryFile(PROGUARD_API_CONFIG)); Determinizer.determinize(this.proguardOut.toString(), this.artifactApiPath.toString()); diff --git a/buildSrc/src/main/java/baritone/gradle/util/MappingType.java b/buildSrc/src/main/java/baritone/gradle/util/MappingType.java new file mode 100644 index 00000000..1de59d76 --- /dev/null +++ b/buildSrc/src/main/java/baritone/gradle/util/MappingType.java @@ -0,0 +1,9 @@ +package baritone.gradle.util; + +// this should be the same as in ForgeGradle +// credit 2 asmlibgradle (i made this btw) +public enum MappingType { + SEARGE, + NOTCH, + CUSTOM // forgegradle +} \ No newline at end of file diff --git a/buildSrc/src/main/java/baritone/gradle/util/ReobfWrapper.java b/buildSrc/src/main/java/baritone/gradle/util/ReobfWrapper.java new file mode 100644 index 00000000..128a1941 --- /dev/null +++ b/buildSrc/src/main/java/baritone/gradle/util/ReobfWrapper.java @@ -0,0 +1,40 @@ +package baritone.gradle.util; + +import java.lang.reflect.Field; +import java.util.Objects; + +public class ReobfWrapper { + + private final Object instance; + private final Class type; + + public ReobfWrapper(Object instance) { + this.instance = instance; + Objects.requireNonNull(instance); + this.type = instance.getClass(); + } + + public String getName() { + try { + Field nameField = type.getDeclaredField("name"); + nameField.setAccessible(true); + return (String)nameField.get(this.instance); + } catch (ReflectiveOperationException ex) { + throw new Error(ex); + } + } + + public MappingType getMappingType() { + try { + Field enumField = type.getDeclaredField("mappingType"); + enumField.setAccessible(true); + Enum meme = (Enum) enumField.get(this.instance); + MappingType mappingType = MappingType.values()[meme.ordinal()]; + if (!meme.name().equals(mappingType.name())) + throw new IllegalStateException("ForgeGradle ReobfMappingType is not equivalent to MappingType (version error?)"); + return mappingType; + } catch (ReflectiveOperationException ex) { + throw new Error(ex); + } + } +} \ No newline at end of file diff --git a/scripts/proguard.pro b/scripts/proguard.pro index 270a0631..24650dda 100644 --- a/scripts/proguard.pro +++ b/scripts/proguard.pro @@ -31,7 +31,10 @@ # copy all necessary libraries into tempLibraries to build --libraryjars 'tempLibraries/minecraft-1.12.2.jar' +-libraryjars 'tempLibraries/minecraft.jar' + +# The correct jar will be copied from the forgegradle cache based on the mapping type being compiled with +#-libraryjars 'tempLibraries/minecraft.jar' -libraryjars 'tempLibraries/SimpleTweaker-1.2.jar' From 0a2e45b64bbe73c50c9d68a639030d41e6dc38b5 Mon Sep 17 00:00:00 2001 From: babbaj Date: Sat, 1 Dec 2018 06:42:21 -0500 Subject: [PATCH 20/24] make codacy happy --- buildSrc/src/main/java/baritone/gradle/task/ProguardTask.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/baritone/gradle/task/ProguardTask.java b/buildSrc/src/main/java/baritone/gradle/task/ProguardTask.java index bae59bb7..f9da3118 100644 --- a/buildSrc/src/main/java/baritone/gradle/task/ProguardTask.java +++ b/buildSrc/src/main/java/baritone/gradle/task/ProguardTask.java @@ -175,7 +175,7 @@ public class ProguardTask extends BaritoneGradleTask { final Path cachedJar = getMinecraftJar(); final Path inTempDir = getTemporaryFile("tempLibraries/" + "minecraft.jar"); // TODO: maybe try not to copy every time - Files.copy(cachedJar, inTempDir, StandardCopyOption.REPLACE_EXISTING); + Files.copy(cachedJar, inTempDir, REPLACE_EXISTING); continue; } From f2e02794b8d50c7a726b35b71db107fbd7010d57 Mon Sep 17 00:00:00 2001 From: Leijurv Date: Sat, 1 Dec 2018 10:04:49 -0800 Subject: [PATCH 21/24] tweak block scanning, fixes #200 --- src/main/java/baritone/cache/CachedChunk.java | 2 +- src/main/java/baritone/cache/ChunkPacker.java | 5 +---- src/main/java/baritone/process/MineProcess.java | 2 +- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/main/java/baritone/cache/CachedChunk.java b/src/main/java/baritone/cache/CachedChunk.java index 1e55cb64..ebf0bfc9 100644 --- a/src/main/java/baritone/cache/CachedChunk.java +++ b/src/main/java/baritone/cache/CachedChunk.java @@ -35,7 +35,7 @@ public final class CachedChunk { static { HashSet temp = new HashSet<>(); - temp.add(Blocks.DIAMOND_ORE); + //temp.add(Blocks.DIAMOND_ORE); temp.add(Blocks.DIAMOND_BLOCK); //temp.add(Blocks.COAL_ORE); temp.add(Blocks.COAL_BLOCK); diff --git a/src/main/java/baritone/cache/ChunkPacker.java b/src/main/java/baritone/cache/ChunkPacker.java index f83d374e..60ac6331 100644 --- a/src/main/java/baritone/cache/ChunkPacker.java +++ b/src/main/java/baritone/cache/ChunkPacker.java @@ -93,10 +93,7 @@ public final class ChunkPacker { IBlockState[] blocks = new IBlockState[256]; for (int z = 0; z < 16; z++) { - // @formatter:off - https: -//www.ibm.com/developerworks/library/j-perry-writing-good-java-code/index.html - // @formatter:on + https://www.ibm.com/developerworks/library/j-perry-writing-good-java-code/index.html for (int x = 0; x < 16; x++) { for (int y = 255; y >= 0; y--) { int index = CachedChunk.getPositionIndex(x, y, z); diff --git a/src/main/java/baritone/process/MineProcess.java b/src/main/java/baritone/process/MineProcess.java index 8b93d1cb..9347dba2 100644 --- a/src/main/java/baritone/process/MineProcess.java +++ b/src/main/java/baritone/process/MineProcess.java @@ -210,7 +210,7 @@ public final class MineProcess extends BaritoneProcessHelper implements IMinePro //long b = System.currentTimeMillis(); for (Block m : mining) { if (CachedChunk.BLOCKS_TO_KEEP_TRACK_OF.contains(m)) { - locs.addAll(ctx.worldData().getCachedWorld().getLocationsOf(ChunkPacker.blockToString(m), 1, ctx.getBaritone().getPlayerContext().playerFeet().getX(), ctx.getBaritone().getPlayerContext().playerFeet().getZ(), 1)); + locs.addAll(ctx.worldData().getCachedWorld().getLocationsOf(ChunkPacker.blockToString(m), 1, ctx.getBaritone().getPlayerContext().playerFeet().getX(), ctx.getBaritone().getPlayerContext().playerFeet().getZ(), 2)); } else { uninteresting.add(m); } From 7f73b4554aaa82d257a9c7e87166cb40de2c7983 Mon Sep 17 00:00:00 2001 From: 0x22 <0x22@futureclient.net> Date: Sat, 1 Dec 2018 13:22:11 -0500 Subject: [PATCH 22/24] Feed codacy and leijurv at the same time? --- build.gradle | 1 - .../baritone/gradle/task/ProguardTask.java | 51 +++--------- .../baritone/gradle/util/MappingType.java | 30 +++++-- .../baritone/gradle/util/ReobfWrapper.java | 79 ++++++++++++------- scripts/proguard.pro | 4 +- 5 files changed, 90 insertions(+), 75 deletions(-) diff --git a/build.gradle b/build.gradle index e0b556a2..80a2de1c 100755 --- a/build.gradle +++ b/build.gradle @@ -107,7 +107,6 @@ jar { task proguard(type: ProguardTask) { url 'https://downloads.sourceforge.net/project/proguard/proguard/6.0/proguard6.0.3.zip' extract 'proguard6.0.3/lib/proguard.jar' - versionManifest 'https://launchermeta.mojang.com/mc/game/version_manifest.json' } task createDist(type: CreateDistTask, dependsOn: proguard) diff --git a/buildSrc/src/main/java/baritone/gradle/task/ProguardTask.java b/buildSrc/src/main/java/baritone/gradle/task/ProguardTask.java index f9da3118..84f9663b 100644 --- a/buildSrc/src/main/java/baritone/gradle/task/ProguardTask.java +++ b/buildSrc/src/main/java/baritone/gradle/task/ProguardTask.java @@ -20,9 +20,7 @@ package baritone.gradle.task; import baritone.gradle.util.Determinizer; import baritone.gradle.util.MappingType; import baritone.gradle.util.ReobfWrapper; -import com.google.gson.*; import java.lang.reflect.Field; -import java.nio.file.StandardCopyOption; import java.util.stream.Collectors; import org.apache.commons.io.IOUtils; import org.gradle.api.NamedDomainObjectContainer; @@ -59,10 +57,6 @@ public class ProguardTask extends BaritoneGradleTask { @Input private String extract; - @Input - private String versionManifest; - - private Map versionDownloadMap; private List requiredLibraries; @TaskAction @@ -74,7 +68,6 @@ public class ProguardTask extends BaritoneGradleTask { downloadProguard(); extractProguard(); generateConfigs(); - downloadVersionManifest(); acquireDependencies(); proguardApi(); proguardStandalone(); @@ -139,20 +132,6 @@ public class ProguardTask extends BaritoneGradleTask { }); } - private void downloadVersionManifest() throws Exception { - Path manifestJson = getTemporaryFile(VERSION_MANIFEST); - write(new URL(this.versionManifest).openStream(), manifestJson); - - // Place all the versions in the map with their download URL - this.versionDownloadMap = new HashMap<>(); - JsonObject json = readJson(Files.readAllLines(manifestJson)).getAsJsonObject(); - JsonArray versions = json.getAsJsonArray("versions"); - versions.forEach(element -> { - JsonObject object = element.getAsJsonObject(); - this.versionDownloadMap.put(object.get("id").getAsString(), object.get("url").getAsString()); - }); - } - private void acquireDependencies() throws Exception { // Create a map of all of the dependencies that we are able to access in this project @@ -173,7 +152,7 @@ public class ProguardTask extends BaritoneGradleTask { // copy from the forgegradle cache if (lib.equals("minecraft")) { final Path cachedJar = getMinecraftJar(); - final Path inTempDir = getTemporaryFile("tempLibraries/" + "minecraft.jar"); + final Path inTempDir = getTemporaryFile("tempLibraries/minecraft.jar"); // TODO: maybe try not to copy every time Files.copy(cachedJar, inTempDir, REPLACE_EXISTING); @@ -200,14 +179,14 @@ public class ProguardTask extends BaritoneGradleTask { } } - // a bunch of bullshit to get the path to the cached jar + // a bunch of epic stuff to get the path to the cached jar private Path getMinecraftJar() throws Exception { MappingType mappingType; try { mappingType = getMappingType(); } catch (Exception e) { - System.err.println("Failed to get mapping type, assuming NOTCH"); - mappingType = MappingType.SEARGE; + System.err.println("Failed to get mapping type, assuming NOTCH."); + mappingType = MappingType.NOTCH; } String suffix; @@ -219,12 +198,12 @@ public class ProguardTask extends BaritoneGradleTask { suffix = "-srgBin"; break; case CUSTOM: - throw new IllegalStateException("custom mappings not supported"); + throw new IllegalStateException("Custom mappings not supported!"); default: throw new IllegalStateException("Unknown mapping type: " + mappingType); } - DefaultConvention convention = (DefaultConvention)this.getProject().getConvention(); + DefaultConvention convention = (DefaultConvention) this.getProject().getConvention(); final Object extension = convention.getAsMap().get("minecraft"); Objects.requireNonNull(extension); @@ -237,24 +216,23 @@ public class ProguardTask extends BaritoneGradleTask { Field replacement_replaceMap = class_replacementProvider.getDeclaredField("replaceMap"); replacement_replaceMap.setAccessible(true); - final Map replacements = (Map)replacement_replaceMap.get(replacer); + final Map replacements = (Map) replacement_replaceMap.get(replacer); final String cacheDir = replacements.get("CACHE_DIR").toString() + "/net/minecraft"; final String mcVersion = replacements.get("MC_VERSION").toString(); final String mcpInsert = replacements.get("MAPPING_CHANNEL").toString() + "/" + replacements.get("MAPPING_VERSION").toString(); - final String fullJarName = "minecraft" + "-" + mcVersion + suffix + ".jar"; + final String fullJarName = "minecraft-" + mcVersion + suffix + ".jar"; final String baseDir = String.format("%s/minecraft/%s/", cacheDir, mcVersion); String jarPath; if (mappingType == MappingType.SEARGE) { jarPath = String.format("%s/%s/%s", baseDir, mcpInsert, fullJarName); - } else { jarPath = baseDir + fullJarName; } jarPath = jarPath - .replace("/", File.separator) - .replace("\\", File.separator);// fucking regex + .replace("/", File.separator) + .replace("\\", File.separator); // hecking regex return new File(jarPath).toPath(); } @@ -266,10 +244,11 @@ public class ProguardTask extends BaritoneGradleTask { final List mappingTypes = getUsedMappingTypes(reobf); final long mappingTypesUsed = mappingTypes.size(); - if (mappingTypesUsed == 0) + if (mappingTypesUsed == 0) { throw new IllegalStateException("Failed to find mapping type (no jar task?)"); - if (mappingTypesUsed > 1) + } if (mappingTypesUsed > 1) { throw new IllegalStateException("Ambiguous mapping type (multiple jars with different mapping types?)"); + } return mappingTypes.get(0); } @@ -306,10 +285,6 @@ public class ProguardTask extends BaritoneGradleTask { this.extract = extract; } - public void setVersionManifest(String versionManifest) { - this.versionManifest = versionManifest; - } - private void runProguard(Path config) throws Exception { // Delete the existing proguard output file. Proguard probably handles this already, but why not do it ourselves if (Files.exists(this.proguardOut)) { diff --git a/buildSrc/src/main/java/baritone/gradle/util/MappingType.java b/buildSrc/src/main/java/baritone/gradle/util/MappingType.java index 1de59d76..4a6c10ff 100644 --- a/buildSrc/src/main/java/baritone/gradle/util/MappingType.java +++ b/buildSrc/src/main/java/baritone/gradle/util/MappingType.java @@ -1,9 +1,29 @@ +/* + * 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.gradle.util; -// this should be the same as in ForgeGradle -// credit 2 asmlibgradle (i made this btw) +/** + * All credits go to AsmLibGradle and its contributors. + * + * @see Original Source + */ public enum MappingType { - SEARGE, - NOTCH, - CUSTOM // forgegradle + SEARGE, + NOTCH, + CUSTOM // forgegradle } \ No newline at end of file diff --git a/buildSrc/src/main/java/baritone/gradle/util/ReobfWrapper.java b/buildSrc/src/main/java/baritone/gradle/util/ReobfWrapper.java index 128a1941..92f38a9f 100644 --- a/buildSrc/src/main/java/baritone/gradle/util/ReobfWrapper.java +++ b/buildSrc/src/main/java/baritone/gradle/util/ReobfWrapper.java @@ -1,40 +1,63 @@ +/* + * 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.gradle.util; import java.lang.reflect.Field; import java.util.Objects; +/** + * All credits go to AsmLibGradle and its contributors. + * + * @see Original Source + */ public class ReobfWrapper { - private final Object instance; - private final Class type; + private final Object instance; + private final Class type; - public ReobfWrapper(Object instance) { - this.instance = instance; - Objects.requireNonNull(instance); - this.type = instance.getClass(); - } - - public String getName() { - try { - Field nameField = type.getDeclaredField("name"); - nameField.setAccessible(true); - return (String)nameField.get(this.instance); - } catch (ReflectiveOperationException ex) { - throw new Error(ex); + public ReobfWrapper(Object instance) { + this.instance = instance; + Objects.requireNonNull(instance); + this.type = instance.getClass(); } - } - public MappingType getMappingType() { - try { - Field enumField = type.getDeclaredField("mappingType"); - enumField.setAccessible(true); - Enum meme = (Enum) enumField.get(this.instance); - MappingType mappingType = MappingType.values()[meme.ordinal()]; - if (!meme.name().equals(mappingType.name())) - throw new IllegalStateException("ForgeGradle ReobfMappingType is not equivalent to MappingType (version error?)"); - return mappingType; - } catch (ReflectiveOperationException ex) { - throw new Error(ex); + public String getName() { + try { + Field nameField = type.getDeclaredField("name"); + nameField.setAccessible(true); + return (String) nameField.get(this.instance); + } catch (ReflectiveOperationException ex) { + throw new IllegalStateException(ex); + } + } + + public MappingType getMappingType() { + try { + Field enumField = type.getDeclaredField("mappingType"); + enumField.setAccessible(true); + Enum aEnum = (Enum) enumField.get(this.instance); + MappingType mappingType = MappingType.values()[aEnum.ordinal()]; + if (!aEnum.name().equals(mappingType.name())) { + throw new IllegalStateException("ForgeGradle ReobfMappingType is not equivalent to MappingType (version error?)"); + } + return mappingType; + } catch (ReflectiveOperationException ex) { + throw new IllegalStateException(ex); + } } - } } \ No newline at end of file diff --git a/scripts/proguard.pro b/scripts/proguard.pro index 24650dda..07e1ec41 100644 --- a/scripts/proguard.pro +++ b/scripts/proguard.pro @@ -31,10 +31,8 @@ # copy all necessary libraries into tempLibraries to build --libraryjars 'tempLibraries/minecraft.jar' - # The correct jar will be copied from the forgegradle cache based on the mapping type being compiled with -#-libraryjars 'tempLibraries/minecraft.jar' +-libraryjars 'tempLibraries/minecraft.jar' -libraryjars 'tempLibraries/SimpleTweaker-1.2.jar' From 07ce0a47f7f02bdfcebbf8c75b7237fd41c7c6de Mon Sep 17 00:00:00 2001 From: Leijurv Date: Sat, 1 Dec 2018 10:45:58 -0800 Subject: [PATCH 23/24] cleanup --- .../baritone/gradle/task/ProguardTask.java | 43 ++++++++++--------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/buildSrc/src/main/java/baritone/gradle/task/ProguardTask.java b/buildSrc/src/main/java/baritone/gradle/task/ProguardTask.java index 84f9663b..235b0d31 100644 --- a/buildSrc/src/main/java/baritone/gradle/task/ProguardTask.java +++ b/buildSrc/src/main/java/baritone/gradle/task/ProguardTask.java @@ -20,8 +20,6 @@ package baritone.gradle.task; import baritone.gradle.util.Determinizer; import baritone.gradle.util.MappingType; import baritone.gradle.util.ReobfWrapper; -import java.lang.reflect.Field; -import java.util.stream.Collectors; import org.apache.commons.io.IOUtils; import org.gradle.api.NamedDomainObjectContainer; import org.gradle.api.artifacts.Configuration; @@ -32,12 +30,14 @@ import org.gradle.api.tasks.TaskAction; import org.gradle.internal.Pair; import java.io.*; +import java.lang.reflect.Field; import java.net.URL; import java.nio.file.Files; import java.nio.file.Path; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; @@ -151,8 +151,8 @@ public class ProguardTask extends BaritoneGradleTask { for (String lib : this.requiredLibraries) { // copy from the forgegradle cache if (lib.equals("minecraft")) { - final Path cachedJar = getMinecraftJar(); - final Path inTempDir = getTemporaryFile("tempLibraries/minecraft.jar"); + Path cachedJar = getMinecraftJar(); + Path inTempDir = getTemporaryFile("tempLibraries/minecraft.jar"); // TODO: maybe try not to copy every time Files.copy(cachedJar, inTempDir, REPLACE_EXISTING); @@ -204,25 +204,25 @@ public class ProguardTask extends BaritoneGradleTask { } DefaultConvention convention = (DefaultConvention) this.getProject().getConvention(); - final Object extension = convention.getAsMap().get("minecraft"); + Object extension = convention.getAsMap().get("minecraft"); Objects.requireNonNull(extension); // for some reason cant use Class.forName Class class_baseExtension = extension.getClass().getSuperclass().getSuperclass().getSuperclass(); Field f_replacer = class_baseExtension.getDeclaredField("replacer"); f_replacer.setAccessible(true); - final Object replacer = f_replacer.get(extension); + Object replacer = f_replacer.get(extension); Class class_replacementProvider = replacer.getClass(); Field replacement_replaceMap = class_replacementProvider.getDeclaredField("replaceMap"); replacement_replaceMap.setAccessible(true); - final Map replacements = (Map) replacement_replaceMap.get(replacer); - final String cacheDir = replacements.get("CACHE_DIR").toString() + "/net/minecraft"; - final String mcVersion = replacements.get("MC_VERSION").toString(); - final String mcpInsert = replacements.get("MAPPING_CHANNEL").toString() + "/" + replacements.get("MAPPING_VERSION").toString(); - final String fullJarName = "minecraft-" + mcVersion + suffix + ".jar"; + Map replacements = (Map) replacement_replaceMap.get(replacer); + String cacheDir = replacements.get("CACHE_DIR").toString() + "/net/minecraft"; + String mcVersion = replacements.get("MC_VERSION").toString(); + String mcpInsert = replacements.get("MAPPING_CHANNEL").toString() + "/" + replacements.get("MAPPING_VERSION").toString(); + String fullJarName = "minecraft-" + mcVersion + suffix + ".jar"; - final String baseDir = String.format("%s/minecraft/%s/", cacheDir, mcVersion); + String baseDir = String.format("%s/minecraft/%s/", cacheDir, mcVersion); String jarPath; if (mappingType == MappingType.SEARGE) { @@ -240,13 +240,14 @@ public class ProguardTask extends BaritoneGradleTask { // throws IllegalStateException if mapping type is ambiguous or it fails to find it private MappingType getMappingType() { // if it fails to find this then its probably a forgegradle version problem - final Set reobf = (NamedDomainObjectContainer) this.getProject().getExtensions().getByName("reobf"); + Set reobf = (NamedDomainObjectContainer) this.getProject().getExtensions().getByName("reobf"); - final List mappingTypes = getUsedMappingTypes(reobf); - final long mappingTypesUsed = mappingTypes.size(); + List mappingTypes = getUsedMappingTypes(reobf); + long mappingTypesUsed = mappingTypes.size(); if (mappingTypesUsed == 0) { throw new IllegalStateException("Failed to find mapping type (no jar task?)"); - } if (mappingTypesUsed > 1) { + } + if (mappingTypesUsed > 1) { throw new IllegalStateException("Ambiguous mapping type (multiple jars with different mapping types?)"); } @@ -255,10 +256,10 @@ public class ProguardTask extends BaritoneGradleTask { private List getUsedMappingTypes(Set reobf) { return reobf.stream() - .map(ReobfWrapper::new) - .map(ReobfWrapper::getMappingType) - .distinct() - .collect(Collectors.toList()); + .map(ReobfWrapper::new) + .map(ReobfWrapper::getMappingType) + .distinct() + .collect(Collectors.toList()); } private void proguardApi() throws Exception { @@ -314,7 +315,7 @@ public class ProguardTask extends BaritoneGradleTask { while ((line = reader.readLine()) != null) { System.out.println(line); } - } catch (final Exception e) { + } catch (Exception e) { e.printStackTrace(); } }).start(); From 57a3330200f5644f829df8e441b833d0a843fd7c Mon Sep 17 00:00:00 2001 From: Leijurv Date: Sat, 1 Dec 2018 10:49:14 -0800 Subject: [PATCH 24/24] don't splice if not on ground --- src/main/java/baritone/pathing/path/PathExecutor.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/baritone/pathing/path/PathExecutor.java b/src/main/java/baritone/pathing/path/PathExecutor.java index b17cd281..15948d45 100644 --- a/src/main/java/baritone/pathing/path/PathExecutor.java +++ b/src/main/java/baritone/pathing/path/PathExecutor.java @@ -349,6 +349,9 @@ public class PathExecutor implements IPathExecutor, Helper { * Regardless of current path position, snap to the current player feet if possible */ public boolean snipsnapifpossible() { + if (!ctx.player().onGround) { + return false; + } int index = path.positions().indexOf(ctx.playerFeet()); if (index == -1) { return false;