Remove Java pathfinder in preparation for insertChunkData

This commit is contained in:
Brady
2023-06-16 19:54:37 -05:00
parent 8c12416348
commit 53a0069704

View File

@@ -48,6 +48,16 @@ public class Elytra extends Behavior implements Helper {
private long context;
private Long seed;
public int playerNear;
public int goingTo;
public int sinceFirework;
public BlockPos goal;
public List<Pair<Vec3d, Vec3d>> lines = new ArrayList<>();
protected Elytra(Baritone baritone) {
super(baritone);
}
public void path(long seed, BlockPos destination) {
this.setupContext(seed);
@@ -87,11 +97,6 @@ public class Elytra extends Behavior implements Helper {
this.context = 0;
}
public int playerNear;
public int goingTo;
public int sinceFirework;
public BlockPos goal;
public void cancel() {
this.path.clear();
this.goal = null;
@@ -100,147 +105,10 @@ public class Elytra extends Behavior implements Helper {
this.sinceFirework = 0;
}
private void pathfindAroundObstacles() {
outer:
while (true) {
int rangeStartIncl = playerNear;
int rangeEndExcl = playerNear;
while (rangeEndExcl < path.size() && ctx.world().isBlockLoaded(path.get(rangeEndExcl), false)) {
rangeEndExcl++;
}
if (rangeStartIncl >= rangeEndExcl) {
// not loaded yet?
return;
}
if (!passable(ctx.world().getBlockState(path.get(rangeStartIncl)))) {
// we're in a wall
return; // previous iterations of this function SHOULD have fixed this by now :rage_cat:
}
for (int i = rangeStartIncl; i < rangeEndExcl - 1; i++) {
if (!clearView(pathAt(i), pathAt(i + 1))) {
// obstacle. where do we return to pathing?
// find the next valid segment
for (int j = i + 1; j < rangeEndExcl - 1; j++) {
if (clearView(pathAt(j), pathAt(j + 1))) {
// found it
// path from i to j
List<BetterBlockPos> newPath = simplePathfind(path.get(i), path.get(j));
if (newPath == null) {
logDirect("no path");
return;
}
path.subList(i + 1, j).clear();
for (int k = newPath.size() - 1; k >= 0; k--) {
path.add(i + 1, newPath.get(k));
}
logDirect("replaced path starting at " + path.get(i));
removeBacktracks();
break outer; // eventually "continue outer"
}
}
}
}
break;
}
}
private int manhattanDist(BlockPos start, BlockPos dest) {
return Math.abs(start.getX() - dest.getX()) + Math.abs(start.getY() - dest.getY()) + Math.abs(start.getZ() - dest.getZ());
}
private class SearchNode {
BetterBlockPos pos;
int dist;
int heuristic;
SearchNode prev;
boolean canceled;
public SearchNode(BetterBlockPos pos, int dist, int heuristic, SearchNode prev) {
this.pos = pos;
this.dist = dist;
this.heuristic = heuristic;
this.prev = prev;
}
}
private List<BetterBlockPos> simplePathfind(BetterBlockPos start, BetterBlockPos dest) {
Map<BetterBlockPos, SearchNode> map = new HashMap<>();
PriorityQueue<SearchNode> queue = new PriorityQueue<>(Comparator.comparingInt(node -> node.dist + node.heuristic));
SearchNode origin = new SearchNode(start, 0, manhattanDist(start, dest) * 10, null);
map.put(start, origin);
queue.add(origin);
int count = 0;
while (!queue.isEmpty()) {
if (count++ > 10000) {
logDirect("oopsie");
return null;
}
SearchNode node = queue.poll();
if (node.canceled) {
continue;
}
if (node.pos.equals(dest)) {
List<BetterBlockPos> path = new ArrayList<>();
while (node != null) {
path.add(node.pos);
node = node.prev;
}
Collections.reverse(path);
return simplify(path);
}
BetterBlockPos[] adjs = new BetterBlockPos[]{node.pos.up(), node.pos.down(), node.pos.north(), node.pos.south(), node.pos.east(), node.pos.west()};
boolean nearAWall = false;
for (BetterBlockPos adj : adjs) {
if (!passable(ctx.world().getBlockState(adj))) {
nearAWall = true;
break;
}
}
for (BetterBlockPos adj : adjs) {
if (!passable(ctx.world().getBlockState(adj))) {
continue;
}
int cost = node.dist + (nearAWall ? 11 : 10);
if (map.containsKey(adj)) {
if (map.get(adj).dist <= cost) {
continue;
}
map.get(adj).canceled = true;
}
map.put(adj, new SearchNode(adj, cost, manhattanDist(adj, dest) * 10, node));
queue.add(map.get(adj));
}
}
return null;
}
private List<BetterBlockPos> simplify(List<BetterBlockPos> path) {
List<BetterBlockPos> simplified = new ArrayList<>(path);
for (int i = 0; i < simplified.size() - 2; i++) {
BlockPos dir = simplified.get(i + 1).subtract(simplified.get(i));
while (i + 2 < simplified.size()) {
if (simplified.get(i + 2).subtract(simplified.get(i + 1)).equals(dir)) {
simplified.remove(i + 1);
} else {
break;
}
}
}
return simplified;
}
private Vec3d pathAt(int i) {
return new Vec3d(path.get(i).x + 0.5, path.get(i).y + 0.5, path.get(i).z + 0.5);
}
public List<Pair<Vec3d, Vec3d>> lines = new ArrayList<>();
protected Elytra(Baritone baritone) {
super(baritone);
}
@Override
public void onTick(TickEvent event) {
if (event.getType() == TickEvent.Type.OUT) {
@@ -252,7 +120,6 @@ public class Elytra extends Behavior implements Helper {
fixNearPlayer();
baritone.getInputOverrideHandler().clearAllKeys();
lines.clear();
pathfindAroundObstacles();
if (ctx.player().isElytraFlying()) {
if (ctx.player().collidedHorizontally) {
logDirect("hbonk");
@@ -323,7 +190,9 @@ public class Elytra extends Behavior implements Helper {
}
private boolean firework() {
return ctx.world().loadedEntityList.stream().anyMatch(x -> (x instanceof EntityFireworkRocket) && ((EntityFireworkRocket) x).isAttachedToEntity());
// TODO: Validate that the EntityFireworkRocket is attached to ctx.player()
return ctx.world().loadedEntityList.stream()
.anyMatch(x -> (x instanceof EntityFireworkRocket) && ((EntityFireworkRocket) x).isAttachedToEntity());
}
private boolean isClear(Vec3d start, Vec3d dest) {
@@ -390,7 +259,7 @@ public class Elytra extends Behavior implements Helper {
return state.getMaterial() == Material.AIR;
}
public static Vec3d step(Vec3d motion, float rotationPitch, float rotationYaw, boolean firework) {
private static Vec3d step(Vec3d motion, float rotationPitch, float rotationYaw, boolean firework) {
double motionX = motion.x;
double motionY = motion.y;
double motionZ = motion.z;
@@ -438,7 +307,7 @@ public class Elytra extends Behavior implements Helper {
return new Vec3d(motionX, motionY, motionZ);
}
public void fixNearPlayer() {
private void fixNearPlayer() {
BetterBlockPos pos = ctx.playerFeet();
for (int i = playerNear; i >= Math.max(playerNear - 1000, 0); i -= 10) {
if (path.get(i).distanceSq(pos) < path.get(playerNear).distanceSq(pos)) {
@@ -463,7 +332,7 @@ public class Elytra extends Behavior implements Helper {
//System.out.println(playerNear);
}
public void removeBacktracks() {
private void removeBacktracks() {
Map<BetterBlockPos, Integer> positionFirstSeen = new HashMap<>();
for (int i = 0; i < path.size(); i++) {
BetterBlockPos pos = path.get(i);
@@ -479,7 +348,8 @@ public class Elytra extends Behavior implements Helper {
}
}
public RayTraceResult rayTraceBlocks(Vec3d start, Vec3d end) {
// TODO: Use the optimized version from builder-2
private RayTraceResult rayTraceBlocks(Vec3d start, Vec3d end) {
int x1 = MathHelper.floor(end.x);
int y1 = MathHelper.floor(end.y);
int z1 = MathHelper.floor(end.z);