From 812be14375df960cc0495fcd62acc30698db0fa6 Mon Sep 17 00:00:00 2001 From: Leijurv Date: Sun, 18 Jun 2023 18:06:32 -0700 Subject: [PATCH] debug --- .../baritone/behavior/ElytraBehavior.java | 129 +++++++++++++++++- .../java/baritone/utils/PathRenderer.java | 14 +- 2 files changed, 134 insertions(+), 9 deletions(-) diff --git a/src/main/java/baritone/behavior/ElytraBehavior.java b/src/main/java/baritone/behavior/ElytraBehavior.java index c2ef38425..d0fd210eb 100644 --- a/src/main/java/baritone/behavior/ElytraBehavior.java +++ b/src/main/java/baritone/behavior/ElytraBehavior.java @@ -28,8 +28,12 @@ import baritone.utils.BlockStateInterface; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.item.EntityFireworkRocket; +import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; -import net.minecraft.util.math.*; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3d; import net.minecraft.world.chunk.Chunk; import java.util.*; @@ -44,7 +48,8 @@ public final class ElytraBehavior extends Behavior implements Helper { private static final long NETHER_SEED = 146008555100680L; // Used exclusively for PathRenderer - public List> lines; + public List> clearLines; + public List> blockedLines; public BlockPos aimPos; public List visiblePath; @@ -56,7 +61,8 @@ public final class ElytraBehavior extends Behavior implements Helper { public ElytraBehavior(Baritone baritone) { super(baritone); this.context = new NetherPathfinderContext(NETHER_SEED); - this.lines = new ArrayList<>(); + this.clearLines = new ArrayList<>(); + this.blockedLines = new ArrayList<>(); this.visiblePath = Collections.emptyList(); this.pathManager = new PathManager(); } @@ -300,7 +306,8 @@ public final class ElytraBehavior extends Behavior implements Helper { if (event.getType() == TickEvent.Type.OUT) { return; } - this.lines.clear(); + this.clearLines.clear(); + this.blockedLines.clear(); final List path = this.pathManager.getPath(); if (path.isEmpty()) { @@ -376,8 +383,12 @@ public final class ElytraBehavior extends Behavior implements Helper { continue; } forceUseFirework = pitch.second(); + logDirect("final dy " + dy); + logDirect("i " + i); + logDirect("playerNear " + playerNear); + logDirect("relaxation " + relaxation); goingTo = pos; - this.aimPos = goingTo.add(0, dy, 0); + this.aimPos = path.get(i).add(0, dy, 0); baritone.getLookBehavior().updateTarget(new Rotation(yaw, pitch.first()), false); break outermost; } @@ -444,8 +455,18 @@ public final class ElytraBehavior extends Behavior implements Helper { } private boolean clearView(Vec3d start, Vec3d dest) { - lines.add(new Pair<>(start, dest)); - return !rayTraceBlocks(start.x, start.y, start.z, dest.x, dest.y, dest.z); + boolean oxy = !rayTraceBlocks(start.x, start.y, start.z, dest.x, dest.y, dest.z); + boolean meow = !rayTraceBlocks(start, dest); + if (oxy != meow) { + logDirect(start + " " + dest + " " + oxy + " " + meow); + } + if (oxy) { + clearLines.add(new Pair<>(start, dest)); + return true; + } else { + blockedLines.add(new Pair<>(start, dest)); + return false; + } } private Pair solvePitch(Vec3d goalDirection, int steps, int relaxation, boolean currentlyBoosted) { @@ -663,4 +684,98 @@ public final class ElytraBehavior extends Behavior implements Helper { private static int fastFloor(final double v) { return ((int) (v + FLOOR_DOUBLE_D)) - FLOOR_DOUBLE_I; } + + private boolean rayTraceBlocks(Vec3d start, Vec3d end) { + int x1 = MathHelper.floor(end.x); + int y1 = MathHelper.floor(end.y); + int z1 = MathHelper.floor(end.z); + int x2 = MathHelper.floor(start.x); + int y2 = MathHelper.floor(start.y); + int z2 = MathHelper.floor(start.z); + BlockPos blockpos = new BlockPos(x2, y2, z2); + IBlockState iblockstate = ctx.world().getBlockState(blockpos); + if (!passable(iblockstate)) { + return true; + } + int steps = 200; + while (steps-- >= 0) { + if (Double.isNaN(start.x) || Double.isNaN(start.y) || Double.isNaN(start.z)) { + return false; + } + if (x2 == x1 && y2 == y1 && z2 == z1) { + return false; + } + boolean hitX = true; + boolean hitY = true; + boolean hitZ = true; + double nextX = 999.0D; + double nextY = 999.0D; + double nextZ = 999.0D; + if (x1 > x2) { + nextX = (double) x2 + 1.0D; + } else if (x1 < x2) { + nextX = (double) x2 + 0.0D; + } else { + hitX = false; + } + if (y1 > y2) { + nextY = (double) y2 + 1.0D; + } else if (y1 < y2) { + nextY = (double) y2 + 0.0D; + } else { + hitY = false; + } + if (z1 > z2) { + nextZ = (double) z2 + 1.0D; + } else if (z1 < z2) { + nextZ = (double) z2 + 0.0D; + } else { + hitZ = false; + } + double stepX = 999.0D; + double stepY = 999.0D; + double stepZ = 999.0D; + double dirX = end.x - start.x; + double dirY = end.y - start.y; + double dirZ = end.z - start.z; + if (hitX) { + stepX = (nextX - start.x) / dirX; + } + if (hitY) { + stepY = (nextY - start.y) / dirY; + } + if (hitZ) { + stepZ = (nextZ - start.z) / dirZ; + } + if (stepX == -0.0D) { + stepX = -1.0E-4D; + } + if (stepY == -0.0D) { + stepY = -1.0E-4D; + } + if (stepZ == -0.0D) { + stepZ = -1.0E-4D; + } + EnumFacing dir; + if (stepX < stepY && stepX < stepZ) { + dir = x1 > x2 ? EnumFacing.WEST : EnumFacing.EAST; + start = new Vec3d(nextX, start.y + dirY * stepX, start.z + dirZ * stepX); + } else if (stepY < stepZ) { + dir = y1 > y2 ? EnumFacing.DOWN : EnumFacing.UP; + start = new Vec3d(start.x + dirX * stepY, nextY, start.z + dirZ * stepY); + } else { + dir = z1 > z2 ? EnumFacing.NORTH : EnumFacing.SOUTH; + start = new Vec3d(start.x + dirX * stepZ, start.y + dirY * stepZ, nextZ); + } + x2 = MathHelper.floor(start.x) - (dir == EnumFacing.EAST ? 1 : 0); + y2 = MathHelper.floor(start.y) - (dir == EnumFacing.UP ? 1 : 0); + z2 = MathHelper.floor(start.z) - (dir == EnumFacing.SOUTH ? 1 : 0); + blockpos = new BlockPos(x2, y2, z2); + IBlockState iblockstate1 = ctx.world().getBlockState(blockpos); + if (!passable(iblockstate1)) { + return true; + } + } + return false; + } } \ No newline at end of file diff --git a/src/main/java/baritone/utils/PathRenderer.java b/src/main/java/baritone/utils/PathRenderer.java index 7274f5dbc..d608d4a2b 100644 --- a/src/main/java/baritone/utils/PathRenderer.java +++ b/src/main/java/baritone/utils/PathRenderer.java @@ -108,11 +108,21 @@ public final class PathRenderer implements IRenderer { if (elytra.aimPos != null) { drawGoal(ctx.player(), new GoalBlock(elytra.aimPos), partialTicks, Color.GREEN); } - if (!elytra.lines.isEmpty() && Baritone.settings().renderRaytraces.value) { + if (!elytra.clearLines.isEmpty() && Baritone.settings().renderRaytraces.value) { + IRenderer.startLines(Color.GREEN, settings.pathRenderLineWidthPixels.value, settings.renderPathIgnoreDepth.value); + boolean orig = settings.renderPathAsLine.value; + settings.renderPathAsLine.value = true; + for (Pair line : elytra.clearLines) { + emitLine(line.first().x, line.first().y, line.first().z, line.second().x, line.second().y, line.second().z); + } + settings.renderPathAsLine.value = orig; + IRenderer.endLines(settings.renderPathIgnoreDepth.value); + } + if (!elytra.blockedLines.isEmpty() && Baritone.settings().renderRaytraces.value) { IRenderer.startLines(Color.BLUE, settings.pathRenderLineWidthPixels.value, settings.renderPathIgnoreDepth.value); boolean orig = settings.renderPathAsLine.value; settings.renderPathAsLine.value = true; - for (Pair line : elytra.lines) { + for (Pair line : elytra.blockedLines) { emitLine(line.first().x, line.first().y, line.first().z, line.second().x, line.second().y, line.second().z); } settings.renderPathAsLine.value = orig;