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/9] 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/9] 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/9] 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/9] 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/9] 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 From 738b95859083d7643b1926e68d4c6c49c6e1229a Mon Sep 17 00:00:00 2001 From: TwinkNet <248537975+TwinkNet@users.noreply.github.com> Date: Thu, 19 Mar 2026 01:41:47 -0600 Subject: [PATCH 6/9] rename distanceToSideSq --- src/main/kotlin/com/lambda/util/math/Vectors.kt | 2 +- src/main/kotlin/com/lambda/util/world/WorldUtils.kt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/com/lambda/util/math/Vectors.kt b/src/main/kotlin/com/lambda/util/math/Vectors.kt index 9fdda6b46..1cec64063 100644 --- a/src/main/kotlin/com/lambda/util/math/Vectors.kt +++ b/src/main/kotlin/com/lambda/util/math/Vectors.kt @@ -206,7 +206,7 @@ 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, epsilon: Double = 1e-7): Double { +fun Vec3d.distanceToSideSq(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) diff --git a/src/main/kotlin/com/lambda/util/world/WorldUtils.kt b/src/main/kotlin/com/lambda/util/world/WorldUtils.kt index bc9e3ff44..ada891168 100644 --- a/src/main/kotlin/com/lambda/util/world/WorldUtils.kt +++ b/src/main/kotlin/com/lambda/util/world/WorldUtils.kt @@ -20,7 +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.math.distanceToSideSq import com.lambda.util.world.WorldUtils.internalGetEntities import com.lambda.util.world.WorldUtils.internalGetFastEntities import net.minecraft.block.BlockState @@ -68,7 +68,7 @@ object WorldUtils { ?.filterIsInstance() ?.filter { it != player && - pos.toVec3d().distanceToSide(it.boundingBox) <= distance * distance && + pos.toVec3d().distanceToSideSq(it.boundingBox) <= distance * distance && filter(it) } ?: emptySequence() ) From 876bf3ed45edf50085a98340fd563099692ba788 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emy=20=F0=9F=92=9C?= Date: Tue, 2 Jun 2026 21:07:50 -0400 Subject: [PATCH 7/9] make entity searching check for the distance to the closest box side --- .../graphics/mc/renderer/ChunkedRenderer.kt | 4 +- .../com/lambda/graphics/util/DirectionMask.kt | 8 +-- .../construction/simulation/BuildGoal.kt | 4 +- .../construction/simulation/Simulation.kt | 7 +- .../module/modules/combat/CrystalAura.kt | 2 +- .../modules/debug/RendererTestModule.kt | 7 +- .../lambda/module/modules/render/Search.kt | 4 +- .../com/lambda/util/extension/Structures.kt | 10 +-- .../kotlin/com/lambda/util/extension/World.kt | 11 ++- .../{world/Position.kt => math/FastVector.kt} | 4 +- .../kotlin/com/lambda/util/math/Vectors.kt | 26 +++---- .../kotlin/com/lambda/util/world/WorldDsl.kt | 15 ++-- .../com/lambda/util/world/WorldUtils.kt | 68 +++++++++++-------- src/test/kotlin/FastVectorTest.kt | 34 +++++----- 14 files changed, 105 insertions(+), 99 deletions(-) rename src/main/kotlin/com/lambda/util/{world/Position.kt => math/FastVector.kt} (97%) diff --git a/src/main/kotlin/com/lambda/graphics/mc/renderer/ChunkedRenderer.kt b/src/main/kotlin/com/lambda/graphics/mc/renderer/ChunkedRenderer.kt index 555219ad7..d95e109a3 100644 --- a/src/main/kotlin/com/lambda/graphics/mc/renderer/ChunkedRenderer.kt +++ b/src/main/kotlin/com/lambda/graphics/mc/renderer/ChunkedRenderer.kt @@ -31,8 +31,8 @@ import com.lambda.graphics.text.FontHandler import com.lambda.graphics.text.SDFFontAtlas import com.lambda.module.Module import com.lambda.module.modules.client.StyleEditor -import com.lambda.util.world.FastVector -import com.lambda.util.world.fastVectorOf +import com.lambda.util.math.FastVector +import com.lambda.util.math.fastVectorOf import com.mojang.blaze3d.buffers.GpuBufferSlice import com.mojang.blaze3d.systems.RenderSystem import net.minecraft.client.world.ClientWorld diff --git a/src/main/kotlin/com/lambda/graphics/util/DirectionMask.kt b/src/main/kotlin/com/lambda/graphics/util/DirectionMask.kt index 2966954c1..32cba8c97 100644 --- a/src/main/kotlin/com/lambda/graphics/util/DirectionMask.kt +++ b/src/main/kotlin/com/lambda/graphics/util/DirectionMask.kt @@ -17,10 +17,10 @@ package com.lambda.graphics.util -import com.lambda.util.world.FastVector -import com.lambda.util.world.offset -import com.lambda.util.world.toBlockPos -import com.lambda.util.world.toFastVec +import com.lambda.util.math.FastVector +import com.lambda.util.math.offset +import com.lambda.util.math.toBlockPos +import com.lambda.util.math.toFastVec import net.minecraft.util.math.BlockPos import net.minecraft.util.math.Direction diff --git a/src/main/kotlin/com/lambda/interaction/construction/simulation/BuildGoal.kt b/src/main/kotlin/com/lambda/interaction/construction/simulation/BuildGoal.kt index f3105b576..d88ef2572 100644 --- a/src/main/kotlin/com/lambda/interaction/construction/simulation/BuildGoal.kt +++ b/src/main/kotlin/com/lambda/interaction/construction/simulation/BuildGoal.kt @@ -18,8 +18,8 @@ package com.lambda.interaction.construction.simulation import baritone.api.pathing.goals.Goal -import com.lambda.util.world.fastVectorOf -import com.lambda.util.world.toFastVec +import com.lambda.util.math.fastVectorOf +import com.lambda.util.math.toFastVec import net.minecraft.util.math.BlockPos class BuildGoal( diff --git a/src/main/kotlin/com/lambda/interaction/construction/simulation/Simulation.kt b/src/main/kotlin/com/lambda/interaction/construction/simulation/Simulation.kt index 20cf9fdd8..8a94cdeeb 100644 --- a/src/main/kotlin/com/lambda/interaction/construction/simulation/Simulation.kt +++ b/src/main/kotlin/com/lambda/interaction/construction/simulation/Simulation.kt @@ -20,16 +20,15 @@ package com.lambda.interaction.construction.simulation import com.lambda.context.Automated import com.lambda.context.SafeContext import com.lambda.graphics.mc.RenderBuilder -import com.lambda.graphics.mc.renderer.TickedRenderer import com.lambda.interaction.construction.blueprint.Blueprint import com.lambda.interaction.construction.simulation.BuildSimulator.simulate import com.lambda.interaction.construction.simulation.result.BuildResult import com.lambda.interaction.construction.simulation.result.Drawable import com.lambda.threading.runSafeAutomated import com.lambda.util.BlockUtils.blockState -import com.lambda.util.world.FastVector -import com.lambda.util.world.toBlockPos -import com.lambda.util.world.toVec3d +import com.lambda.util.math.FastVector +import com.lambda.util.math.toBlockPos +import com.lambda.util.math.toVec3d import net.minecraft.client.network.ClientPlayerEntity import net.minecraft.util.math.BlockPos import net.minecraft.util.math.Box 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 075acfdd6..960e0cf47 100644 --- a/src/main/kotlin/com/lambda/module/modules/combat/CrystalAura.kt +++ b/src/main/kotlin/com/lambda/module/modules/combat/CrystalAura.kt @@ -55,7 +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 com.lambda.util.math.toFastVec import net.minecraft.block.Blocks import net.minecraft.entity.Entity import net.minecraft.entity.LivingEntity diff --git a/src/main/kotlin/com/lambda/module/modules/debug/RendererTestModule.kt b/src/main/kotlin/com/lambda/module/modules/debug/RendererTestModule.kt index 15523b179..c40b4fafd 100644 --- a/src/main/kotlin/com/lambda/module/modules/debug/RendererTestModule.kt +++ b/src/main/kotlin/com/lambda/module/modules/debug/RendererTestModule.kt @@ -30,19 +30,14 @@ import com.lambda.graphics.mc.RenderBuilder.SDFStyle import com.lambda.graphics.mc.renderer.ChunkedRenderer.Companion.chunkedRenderer import com.lambda.graphics.mc.renderer.ImmediateRenderer.Companion.immediateRenderer import com.lambda.graphics.mc.renderer.TickedRenderer.Companion.tickedRenderer -import com.lambda.graphics.outline.OutlineManager import com.lambda.graphics.outline.OutlineStyle -import com.lambda.graphics.outline.VertexCapture import com.lambda.module.Module import com.lambda.module.tag.ModuleTag import com.lambda.threading.runSafe import com.lambda.util.extension.prevPos import com.lambda.util.extension.tickDelta import com.lambda.util.math.lerp -import com.lambda.util.world.toBlockPos -import net.minecraft.entity.mob.HostileEntity -import net.minecraft.entity.passive.PassiveEntity -import net.minecraft.entity.player.PlayerEntity +import com.lambda.util.math.toBlockPos import net.minecraft.item.ItemStack import net.minecraft.item.Items import net.minecraft.util.Identifier diff --git a/src/main/kotlin/com/lambda/module/modules/render/Search.kt b/src/main/kotlin/com/lambda/module/modules/render/Search.kt index 47f01fa08..7e16944c3 100644 --- a/src/main/kotlin/com/lambda/module/modules/render/Search.kt +++ b/src/main/kotlin/com/lambda/module/modules/render/Search.kt @@ -25,7 +25,6 @@ import com.lambda.config.settings.collections.CollectionSetting.Companion.onSele import com.lambda.context.SafeContext import com.lambda.event.events.WorldEvent import com.lambda.event.listener.SafeListener.Companion.listen -import com.lambda.graphics.RenderMain import com.lambda.graphics.mc.RenderBuilder import com.lambda.graphics.mc.renderer.ChunkedRenderer.Companion.chunkedRenderer import com.lambda.graphics.mc.renderer.ImmediateRenderer.Companion.immediateRenderer @@ -42,9 +41,8 @@ import com.lambda.util.extension.blockColor import com.lambda.util.extension.entityColor import com.lambda.util.extension.getBlockState import com.lambda.util.math.setAlpha -import com.lambda.util.world.toBlockPos +import com.lambda.util.math.toBlockPos import io.ktor.util.collections.ConcurrentMap -import net.fabricmc.fabric.mixin.block.BlockStateMixin import net.minecraft.block.BlockState import net.minecraft.block.Blocks import net.minecraft.entity.Entity diff --git a/src/main/kotlin/com/lambda/util/extension/Structures.kt b/src/main/kotlin/com/lambda/util/extension/Structures.kt index 7edaa05df..71b51ea80 100644 --- a/src/main/kotlin/com/lambda/util/extension/Structures.kt +++ b/src/main/kotlin/com/lambda/util/extension/Structures.kt @@ -20,11 +20,11 @@ package com.lambda.util.extension import com.lambda.Lambda.mc import com.lambda.util.math.MathUtils.logCap import com.lambda.util.varIterator -import com.lambda.util.world.FastVector -import com.lambda.util.world.fastVectorOf -import com.lambda.util.world.x -import com.lambda.util.world.y -import com.lambda.util.world.z +import com.lambda.util.math.FastVector +import com.lambda.util.math.fastVectorOf +import com.lambda.util.math.x +import com.lambda.util.math.y +import com.lambda.util.math.z import net.minecraft.block.Block import net.minecraft.datafixer.DataFixTypes import net.minecraft.nbt.NbtCompound diff --git a/src/main/kotlin/com/lambda/util/extension/World.kt b/src/main/kotlin/com/lambda/util/extension/World.kt index eeead30f2..6013ee31c 100644 --- a/src/main/kotlin/com/lambda/util/extension/World.kt +++ b/src/main/kotlin/com/lambda/util/extension/World.kt @@ -19,12 +19,11 @@ package com.lambda.util.extension import com.lambda.Lambda.mc import com.lambda.context.SafeContext -import com.lambda.util.extension.paintingColorCache -import com.lambda.util.world.FastVector -import com.lambda.util.world.toBlockPos -import com.lambda.util.world.x -import com.lambda.util.world.y -import com.lambda.util.world.z +import com.lambda.util.math.FastVector +import com.lambda.util.math.toBlockPos +import com.lambda.util.math.x +import com.lambda.util.math.y +import com.lambda.util.math.z import net.minecraft.block.Block import net.minecraft.block.BlockState import net.minecraft.block.Blocks diff --git a/src/main/kotlin/com/lambda/util/world/Position.kt b/src/main/kotlin/com/lambda/util/math/FastVector.kt similarity index 97% rename from src/main/kotlin/com/lambda/util/world/Position.kt rename to src/main/kotlin/com/lambda/util/math/FastVector.kt index e6a3ee284..85f4bf0de 100644 --- a/src/main/kotlin/com/lambda/util/world/Position.kt +++ b/src/main/kotlin/com/lambda/util/math/FastVector.kt @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package com.lambda.util.world +package com.lambda.util.math import net.minecraft.util.math.BlockPos import net.minecraft.util.math.Direction @@ -31,6 +31,8 @@ import net.minecraft.util.math.Vec3i * and the Y coordinate is stored in the 12 least significant bits. * This encoding allows for a maximum world size of ±33,554,432 blocks * in the X and Z directions and ±2,048 blocks in the Y direction, which is more than needed. + * + * Note for those who haven't figured it out yet: This does NOT have any floating point capability. */ typealias FastVector = Long diff --git a/src/main/kotlin/com/lambda/util/math/Vectors.kt b/src/main/kotlin/com/lambda/util/math/Vectors.kt index 1cec64063..bddb775bb 100644 --- a/src/main/kotlin/com/lambda/util/math/Vectors.kt +++ b/src/main/kotlin/com/lambda/util/math/Vectors.kt @@ -110,6 +110,19 @@ val Vec3d.flooredBlockPos: BlockPos val Entity.netherCoord: Vec3d get() = pos.multiply(0.125, 1.0, 0.125) val Entity.overworldCoord: Vec3d get() = pos.multiply(8.0, 1.0, 8.0) +/** + * Returns the distance squared to the closest side of a [Box] + */ +fun Vec3d.distanceToSideSq(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 + return dx * dx + dy * dy + dz * dz +} + fun Vec3d.interpolate(value: Double, max: Vec3d) = lerp(value, this, max) fun Vec3d.interpolate(value: Float, max: Vec3d) = lerp(value.toDouble(), this, max) @@ -203,19 +216,6 @@ 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.distanceToSideSq(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 - 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/WorldDsl.kt b/src/main/kotlin/com/lambda/util/world/WorldDsl.kt index 6d75451af..543d59801 100644 --- a/src/main/kotlin/com/lambda/util/world/WorldDsl.kt +++ b/src/main/kotlin/com/lambda/util/world/WorldDsl.kt @@ -19,6 +19,8 @@ package com.lambda.util.world import com.lambda.context.SafeContext import com.lambda.util.math.distSq +import com.lambda.util.math.toBlockPos +import com.lambda.util.math.toFastVec import com.lambda.util.world.WorldUtils.internalGetBlockEntities import com.lambda.util.world.WorldUtils.internalGetEntities import com.lambda.util.world.WorldUtils.internalGetFastEntities @@ -30,6 +32,7 @@ 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.Vec3d import net.minecraft.util.math.Vec3i @DslMarker @@ -114,7 +117,7 @@ annotation class EntityMarker @EntityMarker inline fun SafeContext.closestEntity( range: Double = 64.0, - pos: BlockPos = player.blockPos, + pos: Vec3d = player.pos, noinline filter: (T) -> Boolean = { true }, ): T? = entitySearch(range, pos, filter) @@ -131,9 +134,9 @@ inline fun SafeContext.closestEntity( @EntityMarker inline fun SafeContext.entitySearch( range: Double, - pos: BlockPos = player.blockPos, + pos: Vec3d = player.pos, noinline filter: (T) -> Boolean = { true }, -) = internalGetEntities(pos.toFastVec(), range, filter = filter) +) = internalGetEntities(pos, range, filter = filter) /** * Example: @@ -146,9 +149,9 @@ inline fun SafeContext.entitySearch( */ @EntityMarker inline fun SafeContext.fastEntitySearch( - range: Double, - pos: FastVector = player.pos.toFastVec(), - noinline filter: (T) -> Boolean = { true }, + range: Double, + pos: Vec3d = player.pos, + noinline filter: (T) -> Boolean = { true }, ) = internalGetFastEntities(pos, range, filter = filter) @DslMarker diff --git a/src/main/kotlin/com/lambda/util/world/WorldUtils.kt b/src/main/kotlin/com/lambda/util/world/WorldUtils.kt index ada891168..5bff6762b 100644 --- a/src/main/kotlin/com/lambda/util/world/WorldUtils.kt +++ b/src/main/kotlin/com/lambda/util/world/WorldUtils.kt @@ -20,7 +20,16 @@ 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.F_ONE +import com.lambda.util.math.FastVector +import com.lambda.util.math.distSq import com.lambda.util.math.distanceToSideSq +import com.lambda.util.math.fastVectorOf +import com.lambda.util.math.plus +import com.lambda.util.math.times +import com.lambda.util.math.x +import com.lambda.util.math.y +import com.lambda.util.math.z import com.lambda.util.world.WorldUtils.internalGetEntities import com.lambda.util.world.WorldUtils.internalGetFastEntities import net.minecraft.block.BlockState @@ -30,6 +39,7 @@ import net.minecraft.fluid.Fluid import net.minecraft.fluid.FluidState import net.minecraft.util.math.BlockPos import net.minecraft.util.math.ChunkSectionPos +import net.minecraft.util.math.Vec3d import kotlin.math.ceil object WorldUtils { @@ -47,14 +57,14 @@ object WorldUtils { * @see [fastEntitySearch] */ inline fun SafeContext.internalGetFastEntities( - pos: FastVector, - distance: Double, - crossinline filter: (T) -> Boolean = { true }, + pos: Vec3d, + distance: Double, + crossinline filter: (T) -> Boolean = { true }, ): Sequence { val chunks = ceil(distance / 16).toInt() - val sectionX = pos.x shr 4 - val sectionY = pos.y shr 4 - val sectionZ = pos.z shr 4 + val sectionX = (pos.x / 4).toInt() + val sectionY = (pos.y / 4).toInt() + val sectionZ = (pos.z / 4).toInt() return sequence { for (x in sectionX - chunks..sectionX + chunks) { @@ -67,9 +77,9 @@ object WorldUtils { ?.asSequence() ?.filterIsInstance() ?.filter { - it != player && - pos.toVec3d().distanceToSideSq(it.boundingBox) <= distance * distance && - filter(it) + it != player + && pos.distanceToSideSq(it.boundingBox) <= distance * distance + && filter(it) } ?: emptySequence() ) } @@ -85,15 +95,15 @@ object WorldUtils { * @see [entitySearch] */ inline fun SafeContext.internalGetEntities( - pos: FastVector, - distance: Double, - crossinline filter: (T) -> Boolean = { true }, + pos: Vec3d, + distance: Double, + crossinline filter: (T) -> Boolean = { true }, ) = world.entities .asSequence() .filterIsInstance() .filter { it != player && - pos distSq it.pos <= distance * distance && + pos.distanceToSideSq(it.boundingBox) <= distance * distance && filter(it) } @@ -102,9 +112,9 @@ object WorldUtils { * @see [blockEntitySearch] */ inline fun SafeContext.internalGetBlockEntities( - pos: FastVector, - distance: Double, - crossinline predicate: (T) -> Boolean = { true }, + pos: FastVector, + distance: Double, + crossinline predicate: (T) -> Boolean = { true }, ): Sequence { val chunks = ceil(distance / 16).toInt() val chunkX = pos.x shr 4 @@ -135,14 +145,14 @@ object WorldUtils { * @see [blockSearch] */ inline fun SafeContext.internalSearchBlocks( - pos: FastVector, - range: FastVector = F_ONE times 7, - step: FastVector = F_ONE, - crossinline filter: (FastVector, BlockState) -> Boolean = { _, _ -> true }, + pos: FastVector, + range: FastVector = F_ONE times 7, + step: FastVector = F_ONE, + crossinline filter: (FastVector, BlockState) -> Boolean = { _, _ -> true }, ) = fastSequence(pos, range, step) .filter { - val state = world.getBlockState(it) - filter(it, state) + filter(it, + world.getBlockState(it)) } .associateWith { world.getBlockState(it) } @@ -152,10 +162,10 @@ object WorldUtils { * @see [fluidSearch] */ inline fun SafeContext.internalSearchFluids( - pos: FastVector, - range: FastVector = F_ONE times 7, - step: FastVector = F_ONE, - crossinline filter: (FastVector, FluidState) -> Boolean = { _, _ -> true }, + pos: FastVector, + range: FastVector = F_ONE times 7, + step: FastVector = F_ONE, + crossinline filter: (FastVector, FluidState) -> Boolean = { _, _ -> true }, ) = fastSequence(pos, range, step) .filter { val state = world.getFluidState(it.x, it.y, it.z) @@ -168,9 +178,9 @@ object WorldUtils { * Returns a sequence of [FastVector]s */ fun fastSequence( - pos: FastVector, - range: FastVector, - step: FastVector, + pos: FastVector, + range: FastVector, + step: FastVector, ) = sequence { for (x in -range.x..range.x step step.x) { for (y in -range.y..range.y step step.y) { diff --git a/src/test/kotlin/FastVectorTest.kt b/src/test/kotlin/FastVectorTest.kt index ca09e4363..d02fedb23 100644 --- a/src/test/kotlin/FastVectorTest.kt +++ b/src/test/kotlin/FastVectorTest.kt @@ -15,23 +15,23 @@ * along with this program. If not, see . */ -import com.lambda.util.world.X_BITS -import com.lambda.util.world.Z_BITS -import com.lambda.util.world.addX -import com.lambda.util.world.addY -import com.lambda.util.world.addZ -import com.lambda.util.world.distSq -import com.lambda.util.world.fastVectorOf -import com.lambda.util.world.offset -import com.lambda.util.world.remainder -import com.lambda.util.world.setX -import com.lambda.util.world.setY -import com.lambda.util.world.setZ -import com.lambda.util.world.toBlockPos -import com.lambda.util.world.toVec3d -import com.lambda.util.world.x -import com.lambda.util.world.y -import com.lambda.util.world.z +import com.lambda.util.math.X_BITS +import com.lambda.util.math.Z_BITS +import com.lambda.util.math.addX +import com.lambda.util.math.addY +import com.lambda.util.math.addZ +import com.lambda.util.math.distSq +import com.lambda.util.math.fastVectorOf +import com.lambda.util.math.offset +import com.lambda.util.math.remainder +import com.lambda.util.math.setX +import com.lambda.util.math.setY +import com.lambda.util.math.setZ +import com.lambda.util.math.toBlockPos +import com.lambda.util.math.toVec3d +import com.lambda.util.math.x +import com.lambda.util.math.y +import com.lambda.util.math.z import net.minecraft.util.math.Direction import kotlin.test.Test import kotlin.test.assertEquals From 9393f814154a046a8128c47cd45426eb3fa79917 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emy=20=F0=9F=92=9C?= Date: Tue, 2 Jun 2026 21:10:13 -0400 Subject: [PATCH 8/9] fixed argument types --- .../com/lambda/module/modules/combat/CrystalAura.kt | 3 ++- .../com/lambda/module/modules/combat/PlayerTrap.kt | 9 +++++---- 2 files changed, 7 insertions(+), 5 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 960e0cf47..2e855ada1 100644 --- a/src/main/kotlin/com/lambda/module/modules/combat/CrystalAura.kt +++ b/src/main/kotlin/com/lambda/module/modules/combat/CrystalAura.kt @@ -56,6 +56,7 @@ import com.lambda.util.math.plus import com.lambda.util.player.SlotUtils.hotbarStacks import com.lambda.util.world.fastEntitySearch import com.lambda.util.math.toFastVec +import com.lambda.util.math.vec3d import net.minecraft.block.Blocks import net.minecraft.entity.Entity import net.minecraft.entity.LivingEntity @@ -357,7 +358,7 @@ object CrystalAura : Module( // Exclude blocks blocked by entities val crystalBox = pos.crystalBox - val entitiesNearby = fastEntitySearch(3.5, pos.toFastVec()) + val entitiesNearby = fastEntitySearch(3.5, pos.vec3d) val crystals = entitiesNearby.filterIsInstance() val otherEntities = entitiesNearby - crystals + player diff --git a/src/main/kotlin/com/lambda/module/modules/combat/PlayerTrap.kt b/src/main/kotlin/com/lambda/module/modules/combat/PlayerTrap.kt index 67339b858..86a74b562 100644 --- a/src/main/kotlin/com/lambda/module/modules/combat/PlayerTrap.kt +++ b/src/main/kotlin/com/lambda/module/modules/combat/PlayerTrap.kt @@ -73,11 +73,12 @@ object PlayerTrap : Module( val block = player.hotbarAndInventoryStacks.firstOrNull { it.item is BlockItem && blocks.contains(it.item.block) }?.item?.block ?: return@tickingBlueprint emptyMap() + val targetPlayer = if (self) player - else entitySearch( - buildConfig.blockReach, - player.eyePos.flooredBlockPos - ).firstOrNull { friends || !isFriend(it.gameProfile) } ?: return@tickingBlueprint emptyMap() + else entitySearch(buildConfig.blockReach, player.eyePos) + .firstOrNull { friends || !isFriend(it.gameProfile) } + ?: return@tickingBlueprint emptyMap() + getTrapPositions(targetPlayer).associateWith { TargetState.Block(block) } }.build(finishOnDone = false).run() } From af2048bdb90b6c6755c6147a05ab3f6f17a65117 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emy=20=F0=9F=92=9C?= Date: Tue, 2 Jun 2026 21:13:58 -0400 Subject: [PATCH 9/9] fixed merge import --- src/main/kotlin/com/lambda/module/modules/render/Search.kt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/kotlin/com/lambda/module/modules/render/Search.kt b/src/main/kotlin/com/lambda/module/modules/render/Search.kt index 907a14d8f..f877b10d9 100644 --- a/src/main/kotlin/com/lambda/module/modules/render/Search.kt +++ b/src/main/kotlin/com/lambda/module/modules/render/Search.kt @@ -23,8 +23,6 @@ import com.lambda.config.groups.WorldLineSettings import com.lambda.config.settings.collections.CollectionSetting.Companion.onDeselect import com.lambda.config.settings.collections.CollectionSetting.Companion.onSelect import com.lambda.context.SafeContext -import com.lambda.event.events.WorldEvent -import com.lambda.event.listener.SafeListener.Companion.listen import com.lambda.graphics.mc.RenderBuilder import com.lambda.graphics.mc.renderer.ChunkedRenderer.Companion.chunkedRenderer import com.lambda.graphics.mc.renderer.ImmediateRenderer.Companion.immediateRenderer @@ -44,8 +42,6 @@ import com.lambda.util.extension.entityColor import com.lambda.util.extension.getBlockState import com.lambda.util.math.setAlpha import com.lambda.util.math.toBlockPos -import io.ktor.util.collections.ConcurrentMap -import com.lambda.util.world.toBlockPos import net.minecraft.block.BlockState import net.minecraft.block.Blocks import net.minecraft.entity.Entity