From 501754de68e8da67488c93bbacd69d50753722a1 Mon Sep 17 00:00:00 2001 From: TwinkNet <248537975+TwinkNet@users.noreply.github.com> Date: Thu, 12 Mar 2026 15:00:28 -0600 Subject: [PATCH 1/5] use dist from boundbox edge for killaura --- .../lambda/module/modules/combat/CrystalAura.kt | 3 ++- .../kotlin/com/lambda/util/world/WorldDsl.kt | 4 ++-- .../kotlin/com/lambda/util/world/WorldUtils.kt | 17 ++++++++++++++++- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/main/kotlin/com/lambda/module/modules/combat/CrystalAura.kt b/src/main/kotlin/com/lambda/module/modules/combat/CrystalAura.kt index c43c70eb1..075acfdd6 100644 --- a/src/main/kotlin/com/lambda/module/modules/combat/CrystalAura.kt +++ b/src/main/kotlin/com/lambda/module/modules/combat/CrystalAura.kt @@ -55,6 +55,7 @@ import com.lambda.util.math.minus import com.lambda.util.math.plus import com.lambda.util.player.SlotUtils.hotbarStacks import com.lambda.util.world.fastEntitySearch +import com.lambda.util.world.toFastVec import net.minecraft.block.Blocks import net.minecraft.entity.Entity import net.minecraft.entity.LivingEntity @@ -356,7 +357,7 @@ object CrystalAura : Module( // Exclude blocks blocked by entities val crystalBox = pos.crystalBox - val entitiesNearby = fastEntitySearch(3.5, pos) + val entitiesNearby = fastEntitySearch(3.5, pos.toFastVec()) val crystals = entitiesNearby.filterIsInstance() val otherEntities = entitiesNearby - crystals + player diff --git a/src/main/kotlin/com/lambda/util/world/WorldDsl.kt b/src/main/kotlin/com/lambda/util/world/WorldDsl.kt index e1cd46844..6d75451af 100644 --- a/src/main/kotlin/com/lambda/util/world/WorldDsl.kt +++ b/src/main/kotlin/com/lambda/util/world/WorldDsl.kt @@ -147,9 +147,9 @@ inline fun SafeContext.entitySearch( @EntityMarker inline fun SafeContext.fastEntitySearch( range: Double, - pos: BlockPos = player.blockPos, + pos: FastVector = player.pos.toFastVec(), noinline filter: (T) -> Boolean = { true }, -) = internalGetFastEntities(pos.toFastVec(), range, filter = filter) +) = internalGetFastEntities(pos, range, filter = filter) @DslMarker annotation class FluidMarker diff --git a/src/main/kotlin/com/lambda/util/world/WorldUtils.kt b/src/main/kotlin/com/lambda/util/world/WorldUtils.kt index fb9bed16c..01ffe07d6 100644 --- a/src/main/kotlin/com/lambda/util/world/WorldUtils.kt +++ b/src/main/kotlin/com/lambda/util/world/WorldUtils.kt @@ -28,7 +28,9 @@ import net.minecraft.entity.Entity import net.minecraft.fluid.Fluid import net.minecraft.fluid.FluidState import net.minecraft.util.math.BlockPos +import net.minecraft.util.math.Box import net.minecraft.util.math.ChunkSectionPos +import net.minecraft.util.math.Vec3d import kotlin.collections.asSequence import kotlin.math.ceil import kotlin.sequences.filter @@ -69,7 +71,7 @@ object WorldUtils { ?.filterIsInstance() ?.filter { it != player && - pos distSq it.pos <= distance * distance && + getDistSqToClosestSideOfBoundBox(pos.toVec3d(), it.boundingBox) <= distance * distance && filter(it) } ?: emptySequence() ) @@ -79,6 +81,19 @@ object WorldUtils { } } + /** + * Returns the distance squared to the closest side of a [Box] to the specified [point] + */ + fun getDistSqToClosestSideOfBoundBox(point: Vec3d, box: Box): Double { + val closestX = point.x.coerceIn(box.minX, box.maxX) + val closestY = point.y.coerceIn(box.minY, box.maxY) + val closestZ = point.z.coerceIn(box.minZ, box.maxZ) + val dx = point.x - closestX + val dy = point.y - closestY + val dz = point.z - closestZ + return dx * dx + dy * dy + dz * dz + } + /** * Returns a sequence of entities. * Unlike [internalGetFastEntities], it traverses all entities in the world to find matches. From 07b8195a2067532ad63b4fb1df839f8172915186 Mon Sep 17 00:00:00 2001 From: TwinkNet <248537975+TwinkNet@users.noreply.github.com> Date: Thu, 12 Mar 2026 21:42:08 -0600 Subject: [PATCH 2/5] move helper fun to Vectors.kt and make ext of Vec3d, simplify naming --- src/main/kotlin/com/lambda/util/math/Vectors.kt | 14 ++++++++++++++ .../kotlin/com/lambda/util/world/WorldUtils.kt | 16 ++-------------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/main/kotlin/com/lambda/util/math/Vectors.kt b/src/main/kotlin/com/lambda/util/math/Vectors.kt index 3bdcf1125..7409d1596 100644 --- a/src/main/kotlin/com/lambda/util/math/Vectors.kt +++ b/src/main/kotlin/com/lambda/util/math/Vectors.kt @@ -21,6 +21,7 @@ import com.lambda.util.math.MathUtils.floorToInt import com.lambda.util.math.MathUtils.sq import net.minecraft.entity.Entity import net.minecraft.util.math.BlockPos +import net.minecraft.util.math.Box import net.minecraft.util.math.ChunkPos import net.minecraft.util.math.Direction import net.minecraft.util.math.EightWayDirection @@ -202,6 +203,19 @@ infix fun Entity.distSq(other: Vec3d): Double = pos distSq other infix fun Entity.distSq(other: Vec3i): Int = blockPos distSq other infix fun Entity.distSq(other: Entity): Double = squaredDistanceTo(other) +/** + * Returns the distance squared to the closest side of a [Box] + */ +fun Vec3d.distanceToSide(box: Box): Double { + val closestX = x.coerceIn(box.minX, box.maxX) + val closestY = y.coerceIn(box.minY, box.maxY) + val closestZ = z.coerceIn(box.minZ, box.maxZ) + val dx = x - closestX + val dy = y - closestY + val dz = z - closestZ + return dx * dx + dy * dy + dz * dz +} + val UP = Vec3d(0.0, 1.0, 0.0) val DOWN = Vec3d(0.0, -1.0, 0.0) val CENTER = Vec3d(0.5, 0.5, 0.5) diff --git a/src/main/kotlin/com/lambda/util/world/WorldUtils.kt b/src/main/kotlin/com/lambda/util/world/WorldUtils.kt index 01ffe07d6..69128cd15 100644 --- a/src/main/kotlin/com/lambda/util/world/WorldUtils.kt +++ b/src/main/kotlin/com/lambda/util/world/WorldUtils.kt @@ -20,6 +20,7 @@ package com.lambda.util.world import com.lambda.context.SafeContext import com.lambda.util.extension.getBlockState import com.lambda.util.extension.getFluidState +import com.lambda.util.math.distanceToSide import com.lambda.util.world.WorldUtils.internalGetEntities import com.lambda.util.world.WorldUtils.internalGetFastEntities import net.minecraft.block.BlockState @@ -71,7 +72,7 @@ object WorldUtils { ?.filterIsInstance() ?.filter { it != player && - getDistSqToClosestSideOfBoundBox(pos.toVec3d(), it.boundingBox) <= distance * distance && + pos.toVec3d().distanceToSide(it.boundingBox) <= distance * distance && filter(it) } ?: emptySequence() ) @@ -81,19 +82,6 @@ object WorldUtils { } } - /** - * Returns the distance squared to the closest side of a [Box] to the specified [point] - */ - fun getDistSqToClosestSideOfBoundBox(point: Vec3d, box: Box): Double { - val closestX = point.x.coerceIn(box.minX, box.maxX) - val closestY = point.y.coerceIn(box.minY, box.maxY) - val closestZ = point.z.coerceIn(box.minZ, box.maxZ) - val dx = point.x - closestX - val dy = point.y - closestY - val dz = point.z - closestZ - return dx * dx + dy * dy + dz * dz - } - /** * Returns a sequence of entities. * Unlike [internalGetFastEntities], it traverses all entities in the world to find matches. From c21cf6cf72fe66426839f5385050bd0bfcc07fdd Mon Sep 17 00:00:00 2001 From: TwinkNet <248537975+TwinkNet@users.noreply.github.com> Date: Thu, 12 Mar 2026 21:44:47 -0600 Subject: [PATCH 3/5] remove imports that we don't need anymore from WorldUtils.kt --- src/main/kotlin/com/lambda/util/world/WorldUtils.kt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/kotlin/com/lambda/util/world/WorldUtils.kt b/src/main/kotlin/com/lambda/util/world/WorldUtils.kt index 69128cd15..bc9e3ff44 100644 --- a/src/main/kotlin/com/lambda/util/world/WorldUtils.kt +++ b/src/main/kotlin/com/lambda/util/world/WorldUtils.kt @@ -29,12 +29,8 @@ import net.minecraft.entity.Entity import net.minecraft.fluid.Fluid import net.minecraft.fluid.FluidState import net.minecraft.util.math.BlockPos -import net.minecraft.util.math.Box import net.minecraft.util.math.ChunkSectionPos -import net.minecraft.util.math.Vec3d -import kotlin.collections.asSequence import kotlin.math.ceil -import kotlin.sequences.filter object WorldUtils { fun SafeContext.isLoaded(pos: BlockPos) = From 6479e4ddd6eeb840a1ef7af5992b772971ccfdb5 Mon Sep 17 00:00:00 2001 From: TwinkNet <248537975+TwinkNet@users.noreply.github.com> Date: Fri, 13 Mar 2026 12:26:10 -0600 Subject: [PATCH 4/5] effectively expand box by epsilon before dist calc: precision concerns. --- src/main/kotlin/com/lambda/util/math/Vectors.kt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/kotlin/com/lambda/util/math/Vectors.kt b/src/main/kotlin/com/lambda/util/math/Vectors.kt index 7409d1596..66d840b51 100644 --- a/src/main/kotlin/com/lambda/util/math/Vectors.kt +++ b/src/main/kotlin/com/lambda/util/math/Vectors.kt @@ -17,6 +17,7 @@ package com.lambda.util.math +import com.lambda.util.extension.shrinkByEpsilon import com.lambda.util.math.MathUtils.floorToInt import com.lambda.util.math.MathUtils.sq import net.minecraft.entity.Entity @@ -206,10 +207,10 @@ infix fun Entity.distSq(other: Entity): Double = squaredDistanceTo(other) /** * Returns the distance squared to the closest side of a [Box] */ -fun Vec3d.distanceToSide(box: Box): Double { - val closestX = x.coerceIn(box.minX, box.maxX) - val closestY = y.coerceIn(box.minY, box.maxY) - val closestZ = z.coerceIn(box.minZ, box.maxZ) +fun Vec3d.distanceToSide(box: Box, epsilon: Double = 1e-7): Double { + val closestX = x.coerceIn(box.minX - epsilon, box.maxX + epsilon) + val closestY = y.coerceIn(box.minY - epsilon, box.maxY + epsilon) + val closestZ = z.coerceIn(box.minZ - epsilon, box.maxZ + epsilon) val dx = x - closestX val dy = y - closestY val dz = z - closestZ From 11dfb5a7d3d836b724c2cf72af1f6aa7a55586b5 Mon Sep 17 00:00:00 2001 From: TwinkNet <248537975+TwinkNet@users.noreply.github.com> Date: Fri, 13 Mar 2026 12:27:49 -0600 Subject: [PATCH 5/5] remove unused import --- src/main/kotlin/com/lambda/util/math/Vectors.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/kotlin/com/lambda/util/math/Vectors.kt b/src/main/kotlin/com/lambda/util/math/Vectors.kt index 66d840b51..9fdda6b46 100644 --- a/src/main/kotlin/com/lambda/util/math/Vectors.kt +++ b/src/main/kotlin/com/lambda/util/math/Vectors.kt @@ -17,7 +17,6 @@ package com.lambda.util.math -import com.lambda.util.extension.shrinkByEpsilon import com.lambda.util.math.MathUtils.floorToInt import com.lambda.util.math.MathUtils.sq import net.minecraft.entity.Entity