@@ -23,7 +23,9 @@ import com.lambda.event.events.RenderEvent
2323import com.lambda.event.events.RotationEvent
2424import com.lambda.event.events.TickEvent
2525import com.lambda.event.listener.SafeListener.Companion.listen
26+ import com.lambda.graphics.renderer.esp.builders.buildFilled
2627import com.lambda.graphics.renderer.esp.builders.buildLine
28+ import com.lambda.graphics.renderer.esp.global.StaticESP
2729import com.lambda.interaction.request.rotation.Rotation
2830import com.lambda.interaction.request.rotation.Rotation.Companion.rotationTo
2931import com.lambda.interaction.request.rotation.RotationManager.onRotate
@@ -32,16 +34,19 @@ import com.lambda.module.Module
3234import com.lambda.module.tag.ModuleTag
3335import com.lambda.pathing.Path
3436import com.lambda.pathing.Pathing.findPathAStar
37+ import com.lambda.pathing.Pathing.thetaStarClearance
3538import com.lambda.pathing.PathingSettings
3639import com.lambda.pathing.goal.SimpleGoal
3740import com.lambda.threading.runConcurrent
3841import com.lambda.util.Communication.info
42+ import com.lambda.util.Formatting.string
3943import com.lambda.util.math.setAlpha
4044import com.lambda.util.player.MovementUtils.buildMovementInput
4145import com.lambda.util.player.MovementUtils.mergeFrom
4246import com.lambda.util.world.fastVectorOf
4347import com.lambda.util.world.toBlockPos
4448import com.lambda.util.world.toFastVec
49+ import net.minecraft.util.math.Box
4550import net.minecraft.util.math.Vec3d
4651import java.awt.Color
4752import kotlin.math.cos
@@ -56,7 +61,9 @@ object Pathfinder : Module(
5661 private val pathing = PathingSettings (this )
5762 private val rotation = RotationSettings (this )
5863
59- var path: Path ? = null
64+ private val target = fastVectorOf(0 , 78 , 0 )
65+ private var longPath = Path ()
66+ private var shortPath = Path ()
6067 private var currentTarget: Vec3d ? = null
6168 private var integralError = Vec3d .ZERO
6269 private var lastError = Vec3d .ZERO
@@ -66,73 +73,89 @@ object Pathfinder : Module(
6673 onEnable {
6774 integralError = Vec3d .ZERO
6875 lastError = Vec3d .ZERO
76+ calculating = false
6977 }
7078
7179 listen<TickEvent .Pre > {
80+ updateTargetNode()
81+
7282 if (calculating) return @listen
7383 calculating = true
7484
7585 runConcurrent {
76- val took = measureTimeMillis {
77- path = findPathAStar(
86+ val long: Path
87+ val aStar = measureTimeMillis {
88+ long = findPathAStar(
7889 player.blockPos.toFastVec(),
79- // SimpleGoal(fastVectorOf(0, 78, 0)),
80- SimpleGoal (fastVectorOf(0 , 120 , 0 )),
81- pathing.cutoffTimeout
90+ SimpleGoal (target),
91+ pathing
8292 )
8393 }
84- info(" Found path of length ${path?.moves?.size} in $took ms" )
85- println (" Path: ${path?.toString()} " )
86- calculating = false
94+ val short: Path
95+ val thetaStar = measureTimeMillis {
96+ short = thetaStarClearance(long, pathing)
97+ }
98+ info(" A* (Length: ${long.length.string} Nodes: ${long.moves.size} T: $aStar ms) and Theta* (Length: ${short.length.string} Nodes: ${short.moves.size} T: $thetaStar ms)" )
99+ println (" Long: $long | Short: $short " )
100+ longPath = long
101+ shortPath = short
102+ // calculating = false
87103 }
88104 }
89105
90- // listen<RotationEvent.StrafeInput> { event ->
91- // updateTargetNode()
92- // currentTarget?.let { target ->
93- // event.strafeYaw = player.eyePos.rotationTo(target).yaw
94- // val adjustment = calculatePID(target)
95- // val yawRad = Math.toRadians(event.strafeYaw)
96- // val forward = -sin(yawRad)
97- // val strafe = cos(yawRad)
98- //
99- // val forwardComponent = adjustment.x * forward + adjustment.z * strafe
106+ listen<RotationEvent .StrafeInput > { event ->
107+ currentTarget?.let { target ->
108+ event.strafeYaw = player.eyePos.rotationTo(target).yaw
109+ val adjustment = calculatePID(target)
110+ val yawRad = Math .toRadians(event.strafeYaw)
111+ val forward = - sin(yawRad)
112+ val strafe = cos(yawRad)
113+
114+ val forwardComponent = adjustment.x * forward + adjustment.z * strafe
100115// val strafeComponent = adjustment.x * strafe - adjustment.z * forward
101- //
102- // val moveInput = buildMovementInput(
103- // forward = forwardComponent,
104- // strafe = strafeComponent,
105- // jump = player.isOnGround && adjustment.y > 0.5
106- // )
107- // event.input.mergeFrom(moveInput)
108- // }
109- // }
110- //
111- // onRotate {
112- // val nextTarget = path? .moves? .getOrNull(2)?.pos?.toBlockPos() ?: return@onRotate
116+
117+ val moveInput = buildMovementInput(
118+ forward = forwardComponent,
119+ strafe = 0.0 /* strafeComponent*/ ,
120+ jump = player.isOnGround && adjustment.y > 0.5
121+ )
122+ event.input.mergeFrom(moveInput)
123+ }
124+ }
125+
126+ onRotate {
127+ // val nextTarget = shortPath .moves.getOrNull(2)?.pos?.toBlockPos() ?: return@onRotate
113128// val part = player.eyePos.rotationTo(Vec3d.ofBottomCenter(nextTarget))
114- // val targetRotation = Rotation(part.yaw, player.pitch.toDouble())
115- //
116- // lookAt(targetRotation).requestBy(rotation)
117- // }
129+ val currentTarget = currentTarget ? : return @onRotate
130+ val part = player.eyePos.rotationTo(currentTarget)
131+ val targetRotation = Rotation (part.yaw, player.pitch.toDouble())
132+
133+ lookAt(targetRotation).requestBy(rotation)
134+ }
118135
119136 listen<RenderEvent .StaticESP > { event ->
120- path?.moves?.zipWithNext { current, next ->
121- val currentPos = current.pos.toBlockPos().toCenterPos()
122- val nextPos = next.pos.toBlockPos().toCenterPos()
123- event.renderer.buildLine(currentPos, nextPos, Color .GREEN )
124- }
137+ longPath.render(event.renderer, Color .YELLOW )
138+ shortPath.render(event.renderer, Color .GREEN )
139+ event.renderer.buildFilled(Box (target.toBlockPos()), Color .PINK .setAlpha(0.25 ))
140+ }
141+ }
142+
143+ private fun Path.render (renderer : StaticESP , color : Color ) {
144+ moves.zipWithNext { current, next ->
145+ val currentPos = current.pos.toBlockPos().toCenterPos()
146+ val nextPos = next.pos.toBlockPos().toCenterPos()
147+ renderer.buildLine(currentPos, nextPos, color)
125148 }
126149 }
127150
128151 private fun SafeContext.updateTargetNode () {
129- path? .moves? .firstOrNull()?.let { firstNode ->
152+ shortPath .moves.firstOrNull()?.let { firstNode ->
130153 val nodeVec = Vec3d .ofBottomCenter(firstNode.pos.toBlockPos())
131154 if (player.pos.distanceTo(nodeVec) < pathing.tolerance) {
132- path? .moves? .removeFirst()
155+ shortPath .moves.removeFirst()
133156 integralError = Vec3d .ZERO
134157 }
135- val next = path? .moves? .firstOrNull()?.pos?.toBlockPos() ? : return
158+ val next = shortPath .moves.firstOrNull()?.pos?.toBlockPos() ? : return
136159 currentTarget = Vec3d .ofBottomCenter(next)
137160 } ? : run {
138161 currentTarget = null
0 commit comments