From 7f9e50bbe27d6e80da0e7481e854304d0e48e885 Mon Sep 17 00:00:00 2001 From: Babbaj Date: Sat, 22 Jul 2023 19:12:53 -0400 Subject: [PATCH 01/10] initial safe landing impl --- .../command/defaults/ElytraCommand.java | 3 - .../java/baritone/process/ElytraProcess.java | 64 ++++++++++++++++++- 2 files changed, 61 insertions(+), 6 deletions(-) diff --git a/src/main/java/baritone/command/defaults/ElytraCommand.java b/src/main/java/baritone/command/defaults/ElytraCommand.java index eea7f3f33..3232ecb03 100644 --- a/src/main/java/baritone/command/defaults/ElytraCommand.java +++ b/src/main/java/baritone/command/defaults/ElytraCommand.java @@ -23,11 +23,8 @@ import baritone.api.command.argument.IArgConsumer; import baritone.api.command.exception.CommandException; import baritone.api.command.exception.CommandInvalidStateException; import baritone.api.pathing.goals.Goal; -import baritone.api.pathing.goals.GoalBlock; -import baritone.api.pathing.goals.GoalXZ; import baritone.api.process.ICustomGoalProcess; import baritone.api.process.IElytraProcess; -import net.minecraft.util.math.BlockPos; import java.util.Arrays; import java.util.List; diff --git a/src/main/java/baritone/process/ElytraProcess.java b/src/main/java/baritone/process/ElytraProcess.java index c56ab9896..ff082fada 100644 --- a/src/main/java/baritone/process/ElytraProcess.java +++ b/src/main/java/baritone/process/ElytraProcess.java @@ -42,14 +42,21 @@ import baritone.process.elytra.NullElytraProcess; import baritone.utils.BaritoneProcessHelper; import baritone.utils.PathingCommandContext; import net.minecraft.block.state.IBlockState; +import net.minecraft.init.Blocks; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.Queue; +import java.util.Set; + import static baritone.api.pathing.movement.ActionCosts.COST_INF; public class ElytraProcess extends BaritoneProcessHelper implements IBaritoneProcess, IElytraProcess, AbstractGameEventListener { public State state; + private boolean goingToLandingSpot; private Goal goal; private LegacyElytraBehavior behavior; @@ -93,8 +100,8 @@ public class ElytraProcess extends BaritoneProcessHelper implements IBaritonePro return new PathingCommand(null, PathingCommandType.CANCEL_AND_SET_GOAL); } - if (ctx.player().isElytraFlying()) { - final BetterBlockPos last = behavior.pathManager.path.getLast(); + if (ctx.player().isElytraFlying() && this.state != State.LANDING) { + final BetterBlockPos last = this.behavior.pathManager.path.getLast(); if (last != null && ctx.player().getDistanceSqToCenter(last) < (5 * 5)) { if (Baritone.settings().notificationOnPathComplete.value) { logNotification("Pathing complete", false); @@ -105,6 +112,14 @@ public class ElytraProcess extends BaritoneProcessHelper implements IBaritonePro ctx.world().sendQuittingDisconnectingPacket(); return new PathingCommand(null, PathingCommandType.CANCEL_AND_SET_GOAL); } + if (!goingToLandingSpot) { + BlockPos landingSpot = findSafeLandingSpot(); + if (landingSpot != null) { + this.pathTo(landingSpot); + this.goingToLandingSpot = true; + return this.onTick(calcFailed, isSafeToCancel); + } + } this.state = State.LANDING; } } @@ -208,6 +223,7 @@ public class ElytraProcess extends BaritoneProcessHelper implements IBaritonePro @Override public void onLostControl() { this.goal = null; + this.goingToLandingSpot = false; this.state = State.START_FLYING; // TODO: null state? if (this.behavior != null) { this.behavior.destroy(); @@ -234,6 +250,7 @@ public class ElytraProcess extends BaritoneProcessHelper implements IBaritonePro @Override public void pathTo(BlockPos destination) { + this.onLostControl(); this.behavior = new LegacyElytraBehavior(this.baritone, this, destination); if (ctx.world() != null) { this.behavior.repackChunks(); @@ -253,7 +270,6 @@ public class ElytraProcess extends BaritoneProcessHelper implements IBaritonePro public enum State { LOCATE_JUMP("Finding spot to jump off"), - VALIDATE_PATH("Validating path"), PAUSE("Waiting for elytra path"), GET_TO_JUMP("Walking to takeoff"), START_FLYING("Begin flying"), @@ -329,4 +345,46 @@ public class ElytraProcess extends BaritoneProcessHelper implements IBaritonePro return COST_INF; } } + + private static boolean isInBounds(BlockPos pos) { + return pos.getY() >= 0 && pos.getY() < 128; + } + + private boolean isSafeLandingSpot(BlockPos pos) { + BlockPos.MutableBlockPos mut = new BlockPos.MutableBlockPos(pos); + while (mut.getY() >= 0) { + IBlockState state = ctx.world().getBlockState(mut); + if (state.getMaterial().isLiquid()) { // lava + return false; + } + if (state.getMaterial().blocksMovement() && state.getBlock() != Blocks.MAGMA) { + return true; + } + mut.setPos(mut.getX(), mut.getY() - 1, mut.getZ()); + } + return false; // void + } + + private BlockPos findSafeLandingSpot() { + final BlockPos start = new BlockPos(ctx.playerFeet()); + Queue queue = new LinkedList<>(); + Set visited = new HashSet<>(); + queue.add(start); + + while (!queue.isEmpty()) { + BlockPos pos = queue.poll(); + if (ctx.world().isBlockLoaded(pos) && isInBounds(pos) && ctx.world().getBlockState(pos).getBlock() == Blocks.AIR) { + if (isSafeLandingSpot(pos)) { + return pos; + } + if (visited.add(pos.north())) queue.add(pos.north()); + if (visited.add(pos.east())) queue.add(pos.east()); + if (visited.add(pos.south())) queue.add(pos.south()); + if (visited.add(pos.west())) queue.add(pos.west()); + if (visited.add(pos.up())) queue.add(pos.up()); + if (visited.add(pos.down())) queue.add(pos.down()); + } + } + return null; + } } From c9aa1658b2ae7a8fc5f9cb423ec13da7147ff5c6 Mon Sep 17 00:00:00 2001 From: Babbaj Date: Sat, 22 Jul 2023 20:24:36 -0400 Subject: [PATCH 02/10] improvements/fixes --- .../java/baritone/process/ElytraProcess.java | 36 +++++++++++++------ 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/src/main/java/baritone/process/ElytraProcess.java b/src/main/java/baritone/process/ElytraProcess.java index ff082fada..ccab3e2cd 100644 --- a/src/main/java/baritone/process/ElytraProcess.java +++ b/src/main/java/baritone/process/ElytraProcess.java @@ -57,6 +57,7 @@ public class ElytraProcess extends BaritoneProcessHelper implements IBaritonePro public State state; private boolean goingToLandingSpot; + private BetterBlockPos landingSpot; private Goal goal; private LegacyElytraBehavior behavior; @@ -102,7 +103,7 @@ public class ElytraProcess extends BaritoneProcessHelper implements IBaritonePro if (ctx.player().isElytraFlying() && this.state != State.LANDING) { final BetterBlockPos last = this.behavior.pathManager.path.getLast(); - if (last != null && ctx.player().getDistanceSqToCenter(last) < (5 * 5)) { + if (last != null && ctx.player().getDistanceSqToCenter(last) < 1) { if (Baritone.settings().notificationOnPathComplete.value) { logNotification("Pathing complete", false); } @@ -113,22 +114,25 @@ public class ElytraProcess extends BaritoneProcessHelper implements IBaritonePro return new PathingCommand(null, PathingCommandType.CANCEL_AND_SET_GOAL); } if (!goingToLandingSpot) { - BlockPos landingSpot = findSafeLandingSpot(); + BetterBlockPos landingSpot = findSafeLandingSpot(); if (landingSpot != null) { this.pathTo(landingSpot); + this.landingSpot = landingSpot; this.goingToLandingSpot = true; return this.onTick(calcFailed, isSafeToCancel); } + // don't spam call findLandingSpot if it somehow fails (it's slow) + this.goingToLandingSpot = true; } this.state = State.LANDING; } } if (this.state == State.LANDING) { - final BetterBlockPos endPos = behavior.pathManager.path.getLast(); + final BetterBlockPos endPos = this.landingSpot != null ? this.landingSpot : behavior.pathManager.path.getLast(); if (ctx.player().isElytraFlying() && endPos != null) { Vec3d from = ctx.player().getPositionVector(); - Vec3d to = new Vec3d(endPos.x, from.y, endPos.z); + Vec3d to = new Vec3d(((double) endPos.x) + 0.5, from.y, ((double) endPos.z) + 0.5); Rotation rotation = RotationUtils.calcRotationFromVec3d(from, to, ctx.playerRotations()); baritone.getLookBehavior().updateTarget(rotation, false); } else { @@ -350,6 +354,18 @@ public class ElytraProcess extends BaritoneProcessHelper implements IBaritonePro return pos.getY() >= 0 && pos.getY() < 128; } + private boolean isAtEdge(BlockPos pos) { + return ctx.world().isAirBlock(pos.north()) + || ctx.world().isAirBlock(pos.south()) + || ctx.world().isAirBlock(pos.east()) + || ctx.world().isAirBlock(pos.west()) + // corners + || ctx.world().isAirBlock(pos.north().west()) + || ctx.world().isAirBlock(pos.north().east()) + || ctx.world().isAirBlock(pos.south().west()) + || ctx.world().isAirBlock(pos.south().east()); + } + private boolean isSafeLandingSpot(BlockPos pos) { BlockPos.MutableBlockPos mut = new BlockPos.MutableBlockPos(pos); while (mut.getY() >= 0) { @@ -358,21 +374,21 @@ public class ElytraProcess extends BaritoneProcessHelper implements IBaritonePro return false; } if (state.getMaterial().blocksMovement() && state.getBlock() != Blocks.MAGMA) { - return true; + return !isAtEdge(mut); } mut.setPos(mut.getX(), mut.getY() - 1, mut.getZ()); } return false; // void } - private BlockPos findSafeLandingSpot() { - final BlockPos start = new BlockPos(ctx.playerFeet()); - Queue queue = new LinkedList<>(); - Set visited = new HashSet<>(); + private BetterBlockPos findSafeLandingSpot() { + final BetterBlockPos start = ctx.playerFeet(); + Queue queue = new LinkedList<>(); + Set visited = new HashSet<>(); queue.add(start); while (!queue.isEmpty()) { - BlockPos pos = queue.poll(); + BetterBlockPos pos = queue.poll(); if (ctx.world().isBlockLoaded(pos) && isInBounds(pos) && ctx.world().getBlockState(pos).getBlock() == Blocks.AIR) { if (isSafeLandingSpot(pos)) { return pos; From 58723a33cabc5f5a0d0aaa7454441d11f3a743b8 Mon Sep 17 00:00:00 2001 From: Babbaj Date: Sun, 23 Jul 2023 00:05:11 -0400 Subject: [PATCH 03/10] hate cherry pick now --- src/main/java/baritone/command/defaults/ElytraCommand.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/baritone/command/defaults/ElytraCommand.java b/src/main/java/baritone/command/defaults/ElytraCommand.java index 3232ecb03..eea7f3f33 100644 --- a/src/main/java/baritone/command/defaults/ElytraCommand.java +++ b/src/main/java/baritone/command/defaults/ElytraCommand.java @@ -23,8 +23,11 @@ import baritone.api.command.argument.IArgConsumer; import baritone.api.command.exception.CommandException; import baritone.api.command.exception.CommandInvalidStateException; import baritone.api.pathing.goals.Goal; +import baritone.api.pathing.goals.GoalBlock; +import baritone.api.pathing.goals.GoalXZ; import baritone.api.process.ICustomGoalProcess; import baritone.api.process.IElytraProcess; +import net.minecraft.util.math.BlockPos; import java.util.Arrays; import java.util.List; From 9e784435956010f986f1bc337c0be2ec3549881f Mon Sep 17 00:00:00 2001 From: Babbaj Date: Sun, 23 Jul 2023 00:53:26 -0400 Subject: [PATCH 04/10] resolve comment --- src/main/java/baritone/process/ElytraProcess.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/baritone/process/ElytraProcess.java b/src/main/java/baritone/process/ElytraProcess.java index ccab3e2cd..490c7e2e2 100644 --- a/src/main/java/baritone/process/ElytraProcess.java +++ b/src/main/java/baritone/process/ElytraProcess.java @@ -370,10 +370,10 @@ public class ElytraProcess extends BaritoneProcessHelper implements IBaritonePro BlockPos.MutableBlockPos mut = new BlockPos.MutableBlockPos(pos); while (mut.getY() >= 0) { IBlockState state = ctx.world().getBlockState(mut); - if (state.getMaterial().isLiquid()) { // lava + if (state.getMaterial().isLiquid() || state.getBlock() != Blocks.MAGMA) { // lava return false; } - if (state.getMaterial().blocksMovement() && state.getBlock() != Blocks.MAGMA) { + if (state.getMaterial().blocksMovement()) { return !isAtEdge(mut); } mut.setPos(mut.getX(), mut.getY() - 1, mut.getZ()); From 985148b49aa7d58c0fce181e1fb16494c987083b Mon Sep 17 00:00:00 2001 From: Babbaj Date: Sun, 23 Jul 2023 01:00:23 -0400 Subject: [PATCH 05/10] check for specific blocks to land on and anything non air is lava --- src/main/java/baritone/process/ElytraProcess.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/baritone/process/ElytraProcess.java b/src/main/java/baritone/process/ElytraProcess.java index 490c7e2e2..4b089ec49 100644 --- a/src/main/java/baritone/process/ElytraProcess.java +++ b/src/main/java/baritone/process/ElytraProcess.java @@ -41,6 +41,8 @@ import baritone.process.elytra.NetherPathfinderContext; import baritone.process.elytra.NullElytraProcess; import baritone.utils.BaritoneProcessHelper; import baritone.utils.PathingCommandContext; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.init.Blocks; import net.minecraft.util.math.BlockPos; @@ -370,12 +372,13 @@ public class ElytraProcess extends BaritoneProcessHelper implements IBaritonePro BlockPos.MutableBlockPos mut = new BlockPos.MutableBlockPos(pos); while (mut.getY() >= 0) { IBlockState state = ctx.world().getBlockState(mut); - if (state.getMaterial().isLiquid() || state.getBlock() != Blocks.MAGMA) { // lava + Block block = state.getBlock(); + + if (block == Blocks.NETHERRACK || block == Blocks.GRAVEL || state.getMaterial() == Material.ROCK) { + return true; + } else if (block != Blocks.AIR) { return false; } - if (state.getMaterial().blocksMovement()) { - return !isAtEdge(mut); - } mut.setPos(mut.getX(), mut.getY() - 1, mut.getZ()); } return false; // void From bf63ffbc1dd0d9fe1d02d9667494e8de17cc7802 Mon Sep 17 00:00:00 2001 From: Babbaj Date: Sun, 23 Jul 2023 01:01:59 -0400 Subject: [PATCH 06/10] cringe fence hater :sob: --- src/main/java/baritone/process/ElytraProcess.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/baritone/process/ElytraProcess.java b/src/main/java/baritone/process/ElytraProcess.java index 4b089ec49..9fdcdcc75 100644 --- a/src/main/java/baritone/process/ElytraProcess.java +++ b/src/main/java/baritone/process/ElytraProcess.java @@ -374,7 +374,7 @@ public class ElytraProcess extends BaritoneProcessHelper implements IBaritonePro IBlockState state = ctx.world().getBlockState(mut); Block block = state.getBlock(); - if (block == Blocks.NETHERRACK || block == Blocks.GRAVEL || state.getMaterial() == Material.ROCK) { + if (block == Blocks.NETHERRACK || block == Blocks.GRAVEL || block == Blocks.NETHER_BRICK) { return true; } else if (block != Blocks.AIR) { return false; From 9bfa2025d5327aaae0903fedb115ef93fb7e387f Mon Sep 17 00:00:00 2001 From: Babbaj Date: Sun, 23 Jul 2023 01:14:19 -0400 Subject: [PATCH 07/10] memoize isSafeLandingSPot --- src/main/java/baritone/process/ElytraProcess.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main/java/baritone/process/ElytraProcess.java b/src/main/java/baritone/process/ElytraProcess.java index 9fdcdcc75..b4ce3623a 100644 --- a/src/main/java/baritone/process/ElytraProcess.java +++ b/src/main/java/baritone/process/ElytraProcess.java @@ -41,6 +41,7 @@ import baritone.process.elytra.NetherPathfinderContext; import baritone.process.elytra.NullElytraProcess; import baritone.utils.BaritoneProcessHelper; import baritone.utils.PathingCommandContext; +import it.unimi.dsi.fastutil.longs.LongOpenHashSet; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; @@ -368,9 +369,11 @@ public class ElytraProcess extends BaritoneProcessHelper implements IBaritonePro || ctx.world().isAirBlock(pos.south().east()); } - private boolean isSafeLandingSpot(BlockPos pos) { + private boolean isSafeLandingSpot(BlockPos pos, LongOpenHashSet checkedSpots) { BlockPos.MutableBlockPos mut = new BlockPos.MutableBlockPos(pos); + checkedSpots.add(mut.toLong()); while (mut.getY() >= 0) { + IBlockState state = ctx.world().getBlockState(mut); Block block = state.getBlock(); @@ -380,6 +383,9 @@ public class ElytraProcess extends BaritoneProcessHelper implements IBaritonePro return false; } mut.setPos(mut.getX(), mut.getY() - 1, mut.getZ()); + if (checkedSpots.contains(mut.toLong())) { + return false; + } } return false; // void } @@ -388,14 +394,16 @@ public class ElytraProcess extends BaritoneProcessHelper implements IBaritonePro final BetterBlockPos start = ctx.playerFeet(); Queue queue = new LinkedList<>(); Set visited = new HashSet<>(); + LongOpenHashSet checkedPositions = new LongOpenHashSet(); queue.add(start); while (!queue.isEmpty()) { BetterBlockPos pos = queue.poll(); if (ctx.world().isBlockLoaded(pos) && isInBounds(pos) && ctx.world().getBlockState(pos).getBlock() == Blocks.AIR) { - if (isSafeLandingSpot(pos)) { + if (isSafeLandingSpot(pos, checkedPositions)) { return pos; } + checkedPositions.add(pos.toLong()); if (visited.add(pos.north())) queue.add(pos.north()); if (visited.add(pos.east())) queue.add(pos.east()); if (visited.add(pos.south())) queue.add(pos.south()); From c0ead0147a9741b10ae869d9e1173cd2485ee3b1 Mon Sep 17 00:00:00 2001 From: Babbaj Date: Sun, 23 Jul 2023 01:38:07 -0400 Subject: [PATCH 08/10] use priority queue to bias upwards --- src/main/java/baritone/process/ElytraProcess.java | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/main/java/baritone/process/ElytraProcess.java b/src/main/java/baritone/process/ElytraProcess.java index b4ce3623a..135221967 100644 --- a/src/main/java/baritone/process/ElytraProcess.java +++ b/src/main/java/baritone/process/ElytraProcess.java @@ -48,11 +48,9 @@ import net.minecraft.block.state.IBlockState; import net.minecraft.init.Blocks; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; +import net.minecraft.util.math.Vec3i; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.Queue; -import java.util.Set; +import java.util.*; import static baritone.api.pathing.movement.ActionCosts.COST_INF; @@ -373,12 +371,11 @@ public class ElytraProcess extends BaritoneProcessHelper implements IBaritonePro BlockPos.MutableBlockPos mut = new BlockPos.MutableBlockPos(pos); checkedSpots.add(mut.toLong()); while (mut.getY() >= 0) { - IBlockState state = ctx.world().getBlockState(mut); Block block = state.getBlock(); if (block == Blocks.NETHERRACK || block == Blocks.GRAVEL || block == Blocks.NETHER_BRICK) { - return true; + return !isAtEdge(mut); } else if (block != Blocks.AIR) { return false; } @@ -392,7 +389,8 @@ public class ElytraProcess extends BaritoneProcessHelper implements IBaritonePro private BetterBlockPos findSafeLandingSpot() { final BetterBlockPos start = ctx.playerFeet(); - Queue queue = new LinkedList<>(); + Queue queue = new PriorityQueue<>(Comparator.comparingInt(Vec3i::getY).reversed()); + //Queue queue = new LinkedList<>(); Set visited = new HashSet<>(); LongOpenHashSet checkedPositions = new LongOpenHashSet(); queue.add(start); From eec85b20be04b0ccd20d3d75656b4ded11625d2e Mon Sep 17 00:00:00 2001 From: Babbaj Date: Sun, 23 Jul 2023 01:45:39 -0400 Subject: [PATCH 09/10] fix bias in comparator --- src/main/java/baritone/process/ElytraProcess.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/baritone/process/ElytraProcess.java b/src/main/java/baritone/process/ElytraProcess.java index 135221967..d0ec7dd6b 100644 --- a/src/main/java/baritone/process/ElytraProcess.java +++ b/src/main/java/baritone/process/ElytraProcess.java @@ -389,8 +389,7 @@ public class ElytraProcess extends BaritoneProcessHelper implements IBaritonePro private BetterBlockPos findSafeLandingSpot() { final BetterBlockPos start = ctx.playerFeet(); - Queue queue = new PriorityQueue<>(Comparator.comparingInt(Vec3i::getY).reversed()); - //Queue queue = new LinkedList<>(); + Queue queue = new PriorityQueue<>(Comparator.comparingInt(pos -> (pos.x-start.x)*(pos.x-start.x) + (pos.z-start.z)*(pos.z-start.z)).thenComparingInt(pos -> -pos.y)); Set visited = new HashSet<>(); LongOpenHashSet checkedPositions = new LongOpenHashSet(); queue.add(start); From 9707dd7ce83526207d592b1620911896cc93e413 Mon Sep 17 00:00:00 2001 From: Leijurv Date: Sat, 22 Jul 2023 23:02:29 -0700 Subject: [PATCH 10/10] redo checkedpositions given y descending iteration order --- src/main/java/baritone/process/ElytraProcess.java | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/main/java/baritone/process/ElytraProcess.java b/src/main/java/baritone/process/ElytraProcess.java index d0ec7dd6b..873dd5e48 100644 --- a/src/main/java/baritone/process/ElytraProcess.java +++ b/src/main/java/baritone/process/ElytraProcess.java @@ -43,12 +43,10 @@ import baritone.utils.BaritoneProcessHelper; import baritone.utils.PathingCommandContext; import it.unimi.dsi.fastutil.longs.LongOpenHashSet; import net.minecraft.block.Block; -import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.init.Blocks; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; -import net.minecraft.util.math.Vec3i; import java.util.*; @@ -369,8 +367,11 @@ public class ElytraProcess extends BaritoneProcessHelper implements IBaritonePro private boolean isSafeLandingSpot(BlockPos pos, LongOpenHashSet checkedSpots) { BlockPos.MutableBlockPos mut = new BlockPos.MutableBlockPos(pos); - checkedSpots.add(mut.toLong()); while (mut.getY() >= 0) { + if (checkedSpots.contains(mut.toLong())) { + return false; + } + checkedSpots.add(mut.toLong()); IBlockState state = ctx.world().getBlockState(mut); Block block = state.getBlock(); @@ -380,16 +381,13 @@ public class ElytraProcess extends BaritoneProcessHelper implements IBaritonePro return false; } mut.setPos(mut.getX(), mut.getY() - 1, mut.getZ()); - if (checkedSpots.contains(mut.toLong())) { - return false; - } } return false; // void } private BetterBlockPos findSafeLandingSpot() { final BetterBlockPos start = ctx.playerFeet(); - Queue queue = new PriorityQueue<>(Comparator.comparingInt(pos -> (pos.x-start.x)*(pos.x-start.x) + (pos.z-start.z)*(pos.z-start.z)).thenComparingInt(pos -> -pos.y)); + Queue queue = new PriorityQueue<>(Comparator.comparingInt(pos -> (pos.x - start.x) * (pos.x - start.x) + (pos.z - start.z) * (pos.z - start.z)).thenComparingInt(pos -> -pos.y)); Set visited = new HashSet<>(); LongOpenHashSet checkedPositions = new LongOpenHashSet(); queue.add(start); @@ -400,7 +398,6 @@ public class ElytraProcess extends BaritoneProcessHelper implements IBaritonePro if (isSafeLandingSpot(pos, checkedPositions)) { return pos; } - checkedPositions.add(pos.toLong()); if (visited.add(pos.north())) queue.add(pos.north()); if (visited.add(pos.east())) queue.add(pos.east()); if (visited.add(pos.south())) queue.add(pos.south());