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/math/Vectors.kt b/src/main/kotlin/com/lambda/util/math/Vectors.kt index 3bdcf1125..9fdda6b46 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, 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 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..bc9e3ff44 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 @@ -29,9 +30,7 @@ import net.minecraft.fluid.Fluid import net.minecraft.fluid.FluidState import net.minecraft.util.math.BlockPos import net.minecraft.util.math.ChunkSectionPos -import kotlin.collections.asSequence import kotlin.math.ceil -import kotlin.sequences.filter object WorldUtils { fun SafeContext.isLoaded(pos: BlockPos) = @@ -69,7 +68,7 @@ object WorldUtils { ?.filterIsInstance() ?.filter { it != player && - pos distSq it.pos <= distance * distance && + pos.toVec3d().distanceToSide(it.boundingBox) <= distance * distance && filter(it) } ?: emptySequence() )