From 8fa6fe3629c75c6d03c949761f3cd4c7d20cac37 Mon Sep 17 00:00:00 2001 From: ccetl <109693935+ccetl@users.noreply.github.com> Date: Sun, 16 Feb 2025 00:39:14 +0100 Subject: [PATCH 1/6] fix(LeastDifferencePreference): always choose a spot on or in the box --- .../utils/aiming/RotationFinding.kt | 4 +- .../utils/aiming/RotationPreference.kt | 45 +++++++++++++++---- .../liquidbounce/utils/math/BoxExtensions.kt | 8 ++++ .../utils/math/MinecraftVectorExtensions.kt | 7 +++ .../liquidbounce/utils/math/geometry/Line.kt | 40 +++++++++++++++++ 5 files changed, 93 insertions(+), 11 deletions(-) diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/utils/aiming/RotationFinding.kt b/src/main/kotlin/net/ccbluex/liquidbounce/utils/aiming/RotationFinding.kt index 5923daae680..5baeb80cc9c 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/utils/aiming/RotationFinding.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/utils/aiming/RotationFinding.kt @@ -300,8 +300,8 @@ fun raytraceBox( val rangeSquared = range * range val wallsRangeSquared = wallsRange * wallsRange - val preferredSpot = rotationPreference.getPreferredSpot(eyes, range) - var preferredSpotOnBox = if (box.contains(eyes) && box.contains(preferredSpot)) { + val preferredSpot = rotationPreference.getPreferredSpotOnBox(box, eyes, range) ?: return null + val preferredSpotOnBox = if (box.contains(eyes) && box.contains(preferredSpot)) { preferredSpot } else { box.raycast(eyes, preferredSpot).getOrNull() diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/utils/aiming/RotationPreference.kt b/src/main/kotlin/net/ccbluex/liquidbounce/utils/aiming/RotationPreference.kt index 28d4f0528f0..4a99f384e87 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/utils/aiming/RotationPreference.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/utils/aiming/RotationPreference.kt @@ -20,28 +20,53 @@ package net.ccbluex.liquidbounce.utils.aiming import net.ccbluex.liquidbounce.utils.client.player import net.ccbluex.liquidbounce.utils.entity.rotation +import net.ccbluex.liquidbounce.utils.math.geometry.Line +import net.ccbluex.liquidbounce.utils.math.minus import net.ccbluex.liquidbounce.utils.math.plus +import net.ccbluex.liquidbounce.utils.math.sq import net.ccbluex.liquidbounce.utils.math.times +import net.minecraft.util.math.Box import net.minecraft.util.math.Vec3d - interface RotationPreference : Comparator { - fun getPreferredSpot( - eyesPos: Vec3d, - range: Double, - ): Vec3d + + fun getPreferredSpot(eyesPos: Vec3d, range: Double, ): Vec3d + + fun getPreferredSpotOnBox(box: Box, eyesPos: Vec3d, range: Double): Vec3d? { + return getPreferredSpot(eyesPos, range) + } + } class LeastDifferencePreference( private val baseRotation: Rotation, - private val basePoint: Vec3d? = null, + private val basePoint: Vec3d? = null ) : RotationPreference { + override fun getPreferredSpot(eyesPos: Vec3d, range: Double): Vec3d { - if (this.basePoint != null) { - return this.basePoint + if (basePoint != null) { + return basePoint + } + + return eyesPos + baseRotation.directionVector * range + } + + override fun getPreferredSpotOnBox(box: Box, eyesPos: Vec3d, range: Double): Vec3d? { + if (basePoint != null) { + return basePoint + } + + if (box.contains(eyesPos)) { + return eyesPos } - return eyesPos + this.baseRotation.directionVector * range + val preferredSpot = getPreferredSpot(eyesPos, range) + if (box.contains(preferredSpot)) { + return preferredSpot + } + + val look = Line(eyesPos, preferredSpot - eyesPos) + return look.getPointOnBoxInDirection(box)?.takeIf { it.squaredDistanceTo(eyesPos) <= range.sq() } } override fun compare(o1: Rotation, o2: Rotation): Int { @@ -52,12 +77,14 @@ class LeastDifferencePreference( } companion object { + val LEAST_DISTANCE_TO_CURRENT_ROTATION: LeastDifferencePreference get() = LeastDifferencePreference(RotationManager.currentRotation ?: player.rotation) fun leastDifferenceToLastPoint(eyes: Vec3d, point: Vec3d): LeastDifferencePreference { return LeastDifferencePreference(Rotation.lookingAt(point, from = eyes), point) } + } } diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/utils/math/BoxExtensions.kt b/src/main/kotlin/net/ccbluex/liquidbounce/utils/math/BoxExtensions.kt index 4e9c320a5bc..070cf64233f 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/utils/math/BoxExtensions.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/utils/math/BoxExtensions.kt @@ -66,3 +66,11 @@ fun Box.isHitByLine(start: Vec3d, p: Vec3d): Boolean { val Box.size: Double get() = this.lengthX * this.lengthY * this.lengthZ + +fun Box.getCoordinate(direction: Direction): Double { + return if (direction.direction == Direction.AxisDirection.POSITIVE) { + this.getMax(direction.axis) + } else { + this.getMin(direction.axis) + } +} diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/utils/math/MinecraftVectorExtensions.kt b/src/main/kotlin/net/ccbluex/liquidbounce/utils/math/MinecraftVectorExtensions.kt index cc1a2ef5e71..e1932c062ed 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/utils/math/MinecraftVectorExtensions.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/utils/math/MinecraftVectorExtensions.kt @@ -125,3 +125,10 @@ fun Vec3d.toVec3() = Vec3(this.x, this.y, this.z) fun Vec3d.toVec3i() = Vec3i(this.x.toInt(), this.y.toInt(), this.z.toInt()) fun Vec3d.toBlockPos() = BlockPos.ofFloored(x, y, z)!! + +fun Vec3d.preferOver(other: Vec3d): Vec3d { + val x = if (this.x == 0.0) other.x else this.x + val y = if (this.y == 0.0) other.y else this.y + val z = if (this.z == 0.0) other.z else this.z + return Vec3d(x, y, z) +} diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/utils/math/geometry/Line.kt b/src/main/kotlin/net/ccbluex/liquidbounce/utils/math/geometry/Line.kt index 520071445f8..02c94e46f45 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/utils/math/geometry/Line.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/utils/math/geometry/Line.kt @@ -18,7 +18,11 @@ */ package net.ccbluex.liquidbounce.utils.math.geometry +import net.ccbluex.liquidbounce.utils.math.getCoordinate import net.ccbluex.liquidbounce.utils.math.plus +import net.ccbluex.liquidbounce.utils.math.preferOver +import net.minecraft.util.math.Box +import net.minecraft.util.math.Direction import net.minecraft.util.math.MathHelper import net.minecraft.util.math.Vec3d import kotlin.math.abs @@ -85,6 +89,42 @@ open class Line(val position: Vec3d, val direction: Vec3d) { return doubleArrayOf(phi1, phi2) } + /** + * Finds the closest point on the box's surface to the [position] in positive [direction]. + */ + fun getPointOnBoxInDirection(box: Box): Vec3d? { + var minT = Double.POSITIVE_INFINITY + var intersection: Vec3d? = null + + val candidates = Direction.entries.mapNotNull { dir -> + val positionCoordinate = position.getComponentAlongAxis(dir.axis) + val directionCoordinate = direction.getComponentAlongAxis(dir.axis) + computeIntersection(box.getCoordinate(dir), positionCoordinate, directionCoordinate)?.let { factor -> + val pointOnFace = dir.doubleVector.multiply(factor) + val directionalPointsOnFace = position.add(direction.normalize().multiply(factor)) + pointOnFace.preferOver(directionalPointsOnFace) + } + } + + for (candidate in candidates) { + if (position.squaredDistanceTo(candidate) < minT) { + minT = position.squaredDistanceTo(candidate) + intersection = candidate + } + } + + return intersection + } + + private fun computeIntersection(plane: Double, pos: Double, dir: Double): Double? { + if (dir == 0.0) { + return null + } + + val t = (plane - pos) / dir + return if (t > 0) t else null + } + @Suppress("MaxLineLength") protected open fun calculateNearestPhiTo(other: Line): Double? { val pos1X = other.position.x From bded5be763e0a12abd9d35b9be5b89a485bda731 Mon Sep 17 00:00:00 2001 From: ccetl <109693935+ccetl@users.noreply.github.com> Date: Sun, 16 Feb 2025 00:45:18 +0100 Subject: [PATCH 2/6] ignore detekt --- .../kotlin/net/ccbluex/liquidbounce/utils/math/geometry/Line.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/utils/math/geometry/Line.kt b/src/main/kotlin/net/ccbluex/liquidbounce/utils/math/geometry/Line.kt index 02c94e46f45..df87ecdbfaf 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/utils/math/geometry/Line.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/utils/math/geometry/Line.kt @@ -27,6 +27,7 @@ import net.minecraft.util.math.MathHelper import net.minecraft.util.math.Vec3d import kotlin.math.abs +@Suppress("TooManyFunctions") open class Line(val position: Vec3d, val direction: Vec3d) { companion object { From 7f2fa4e7d9ed023bd95d57cad833210cd6ae8fd3 Mon Sep 17 00:00:00 2001 From: ccetl <109693935+ccetl@users.noreply.github.com> Date: Sun, 16 Feb 2025 00:46:09 +0100 Subject: [PATCH 3/6] style --- .../kotlin/net/ccbluex/liquidbounce/utils/math/geometry/Line.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/utils/math/geometry/Line.kt b/src/main/kotlin/net/ccbluex/liquidbounce/utils/math/geometry/Line.kt index df87ecdbfaf..46e962507d4 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/utils/math/geometry/Line.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/utils/math/geometry/Line.kt @@ -107,7 +107,7 @@ open class Line(val position: Vec3d, val direction: Vec3d) { } } - for (candidate in candidates) { + candidates.forEach { candidate -> if (position.squaredDistanceTo(candidate) < minT) { minT = position.squaredDistanceTo(candidate) intersection = candidate From 23ce4dfd51e246116b0ac1b4d812e08aa5f821e5 Mon Sep 17 00:00:00 2001 From: Izuna Date: Sun, 16 Feb 2025 00:46:46 +0100 Subject: [PATCH 4/6] fix merge --- .../aiming/preference/LeastDifferencePreference.kt | 10 ---------- .../utils/aiming/preference/RotationPreference.kt | 13 ++++++++----- 2 files changed, 8 insertions(+), 15 deletions(-) diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/utils/aiming/preference/LeastDifferencePreference.kt b/src/main/kotlin/net/ccbluex/liquidbounce/utils/aiming/preference/LeastDifferencePreference.kt index 2e3964cbf5c..ab5921948a8 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/utils/aiming/preference/LeastDifferencePreference.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/utils/aiming/preference/LeastDifferencePreference.kt @@ -30,16 +30,6 @@ import net.ccbluex.liquidbounce.utils.math.times import net.minecraft.util.math.Box import net.minecraft.util.math.Vec3d -interface RotationPreference : Comparator { - - fun getPreferredSpot(eyesPos: Vec3d, range: Double, ): Vec3d - - fun getPreferredSpotOnBox(box: Box, eyesPos: Vec3d, range: Double): Vec3d? { - return getPreferredSpot(eyesPos, range) - } - -} - class LeastDifferencePreference( private val baseRotation: Rotation, private val basePoint: Vec3d? = null diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/utils/aiming/preference/RotationPreference.kt b/src/main/kotlin/net/ccbluex/liquidbounce/utils/aiming/preference/RotationPreference.kt index 6db8938e488..144ec162a61 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/utils/aiming/preference/RotationPreference.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/utils/aiming/preference/RotationPreference.kt @@ -19,12 +19,15 @@ package net.ccbluex.liquidbounce.utils.aiming.preference import net.ccbluex.liquidbounce.utils.aiming.data.Rotation +import net.minecraft.util.math.Box import net.minecraft.util.math.Vec3d interface RotationPreference : Comparator { - fun getPreferredSpot( - eyesPos: Vec3d, - range: Double, - ): Vec3d -} + fun getPreferredSpot(eyesPos: Vec3d, range: Double, ): Vec3d + + fun getPreferredSpotOnBox(box: Box, eyesPos: Vec3d, range: Double): Vec3d? { + return getPreferredSpot(eyesPos, range) + } + +} From 1a63578e0007fc19e897ea0b3544e387d4d42e39 Mon Sep 17 00:00:00 2001 From: ccetl <109693935+ccetl@users.noreply.github.com> Date: Sun, 16 Feb 2025 00:47:52 +0100 Subject: [PATCH 5/6] a --- .../net/ccbluex/liquidbounce/utils/math/geometry/Line.kt | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/utils/math/geometry/Line.kt b/src/main/kotlin/net/ccbluex/liquidbounce/utils/math/geometry/Line.kt index 46e962507d4..9f94bbf6b46 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/utils/math/geometry/Line.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/utils/math/geometry/Line.kt @@ -94,9 +94,6 @@ open class Line(val position: Vec3d, val direction: Vec3d) { * Finds the closest point on the box's surface to the [position] in positive [direction]. */ fun getPointOnBoxInDirection(box: Box): Vec3d? { - var minT = Double.POSITIVE_INFINITY - var intersection: Vec3d? = null - val candidates = Direction.entries.mapNotNull { dir -> val positionCoordinate = position.getComponentAlongAxis(dir.axis) val directionCoordinate = direction.getComponentAlongAxis(dir.axis) @@ -107,9 +104,11 @@ open class Line(val position: Vec3d, val direction: Vec3d) { } } + var minDistanceSq = Double.POSITIVE_INFINITY + var intersection: Vec3d? = null candidates.forEach { candidate -> - if (position.squaredDistanceTo(candidate) < minT) { - minT = position.squaredDistanceTo(candidate) + if (position.squaredDistanceTo(candidate) < minDistanceSq) { + minDistanceSq = position.squaredDistanceTo(candidate) intersection = candidate } } From 7eed400b34b5c683fa1b7b98788123bbd3d64ee0 Mon Sep 17 00:00:00 2001 From: Izuna Date: Sun, 16 Feb 2025 00:50:22 +0100 Subject: [PATCH 6/6] fix detekt --- .../features/module/modules/movement/ModuleSprint.kt | 3 ++- .../features/module/modules/render/ModuleFreeCam.kt | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/movement/ModuleSprint.kt b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/movement/ModuleSprint.kt index 0446ca2fa0c..76f1f1e9b8e 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/movement/ModuleSprint.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/movement/ModuleSprint.kt @@ -122,7 +122,8 @@ object ModuleSprint : ClientModule("Sprint", Category.MOVEMENT) { MathHelper.sin(deltaYaw * 0.017453292f) > 1.0E-5 val preventSprint = (if (player.isOnGround) stopOnGround else stopOnAir) && !shouldSprintOmnidirectional - && RotationManager.workingRotationTarget?.movementCorrection == MovementCorrection.OFF && !hasForwardMovement + && RotationManager.workingRotationTarget?.movementCorrection == MovementCorrection.OFF + && !hasForwardMovement return running && preventSprint } diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/render/ModuleFreeCam.kt b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/render/ModuleFreeCam.kt index b287e59ba99..8262facd8b7 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/render/ModuleFreeCam.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/render/ModuleFreeCam.kt @@ -179,7 +179,8 @@ object ModuleFreeCam : ClientModule("FreeCam", Category.RENDER, disableOnQuit = return@handler } - RotationManager.setRotationTarget(rotationsConfigurable.toAimPlan(lookAt), Priority.NOT_IMPORTANT, ModuleFreeCam) + RotationManager.setRotationTarget(rotationsConfigurable.toAimPlan(lookAt), + Priority.NOT_IMPORTANT, ModuleFreeCam) } fun applyCameraPosition(entity: Entity, tickDelta: Float) {