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 3118f91be..f1ee2e406 100644 --- a/src/main/kotlin/com/lambda/graphics/mc/renderer/ChunkedRenderer.kt +++ b/src/main/kotlin/com/lambda/graphics/mc/renderer/ChunkedRenderer.kt @@ -29,8 +29,8 @@ import com.lambda.graphics.mc.RegionRenderer import com.lambda.graphics.mc.RenderBuilder 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.util.math.ChunkPos 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 9e0fb1a3b..d840c24c1 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,8 @@ 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.math.toFastVec +import com.lambda.util.math.vec3d import net.minecraft.block.Blocks import net.minecraft.entity.Entity import net.minecraft.entity.LivingEntity @@ -356,7 +358,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.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() } 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 6e88b541a..5c20615ca 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 e944ef11a..f877b10d9 100644 --- a/src/main/kotlin/com/lambda/module/modules/render/Search.kt +++ b/src/main/kotlin/com/lambda/module/modules/render/Search.kt @@ -41,7 +41,7 @@ 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 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 7099e6d7a..04e39011c 100644 --- a/src/main/kotlin/com/lambda/util/math/Vectors.kt +++ b/src/main/kotlin/com/lambda/util/math/Vectors.kt @@ -23,6 +23,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 @@ -111,6 +112,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) diff --git a/src/main/kotlin/com/lambda/util/world/WorldDsl.kt b/src/main/kotlin/com/lambda/util/world/WorldDsl.kt index e1cd46844..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,10 +149,10 @@ inline fun SafeContext.entitySearch( */ @EntityMarker inline fun SafeContext.fastEntitySearch( - range: Double, - pos: BlockPos = player.blockPos, - noinline filter: (T) -> Boolean = { true }, -) = internalGetFastEntities(pos.toFastVec(), range, filter = filter) + range: Double, + pos: Vec3d = player.pos, + noinline filter: (T) -> Boolean = { true }, +) = 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..5bff6762b 100644 --- a/src/main/kotlin/com/lambda/util/world/WorldUtils.kt +++ b/src/main/kotlin/com/lambda/util/world/WorldUtils.kt @@ -20,6 +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 @@ -29,9 +39,8 @@ 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 net.minecraft.util.math.Vec3d import kotlin.math.ceil -import kotlin.sequences.filter object WorldUtils { fun SafeContext.isLoaded(pos: BlockPos) = @@ -48,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) { @@ -68,9 +77,9 @@ object WorldUtils { ?.asSequence() ?.filterIsInstance() ?.filter { - it != player && - pos distSq it.pos <= distance * distance && - filter(it) + it != player + && pos.distanceToSideSq(it.boundingBox) <= distance * distance + && filter(it) } ?: emptySequence() ) } @@ -86,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) } @@ -103,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 @@ -136,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) } @@ -153,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) @@ -169,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