Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -356,7 +357,7 @@ object CrystalAura : Module(
// Exclude blocks blocked by entities
val crystalBox = pos.crystalBox

val entitiesNearby = fastEntitySearch<Entity>(3.5, pos)
val entitiesNearby = fastEntitySearch<Entity>(3.5, pos.toFastVec())
val crystals = entitiesNearby.filterIsInstance<EndCrystalEntity>()
val otherEntities = entitiesNearby - crystals + player

Expand Down
14 changes: 14 additions & 0 deletions src/main/kotlin/com/lambda/util/math/Vectors.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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.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)
4 changes: 2 additions & 2 deletions src/main/kotlin/com/lambda/util/world/WorldDsl.kt
Original file line number Diff line number Diff line change
Expand Up @@ -147,9 +147,9 @@ inline fun <reified T : Entity> SafeContext.entitySearch(
@EntityMarker
inline fun <reified T : Entity> SafeContext.fastEntitySearch(
range: Double,
pos: BlockPos = player.blockPos,
pos: FastVector = player.pos.toFastVec(),
noinline filter: (T) -> Boolean = { true },
) = internalGetFastEntities<T>(pos.toFastVec(), range, filter = filter)
) = internalGetFastEntities<T>(pos, range, filter = filter)

@DslMarker
annotation class FluidMarker
Expand Down
5 changes: 2 additions & 3 deletions src/main/kotlin/com/lambda/util/world/WorldUtils.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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.distanceToSideSq
import com.lambda.util.world.WorldUtils.internalGetEntities
import com.lambda.util.world.WorldUtils.internalGetFastEntities
import net.minecraft.block.BlockState
Expand All @@ -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) =
Expand Down Expand Up @@ -69,7 +68,7 @@ object WorldUtils {
?.filterIsInstance<T>()
?.filter {
it != player &&
pos distSq it.pos <= distance * distance &&
pos.toVec3d().distanceToSideSq(it.boundingBox) <= distance * distance &&
filter(it)
} ?: emptySequence()
)
Expand Down