1717
1818package com.lambda.module.modules.movement
1919
20+ import com.lambda.config.groups.RotationSettings
2021import com.lambda.context.SafeContext
2122import com.lambda.event.events.RenderEvent
2223import com.lambda.event.events.RotationEvent
24+ import com.lambda.event.events.TickEvent
2325import com.lambda.event.listener.SafeListener.Companion.listen
2426import com.lambda.graphics.renderer.esp.builders.buildLine
27+ import com.lambda.interaction.request.rotation.Rotation
2528import com.lambda.interaction.request.rotation.Rotation.Companion.rotationTo
29+ import com.lambda.interaction.request.rotation.RotationManager.onRotate
30+ import com.lambda.interaction.request.rotation.visibilty.lookAt
2631import com.lambda.module.Module
2732import com.lambda.module.tag.ModuleTag
2833import com.lambda.pathing.Path
2934import com.lambda.pathing.Pathing.findPathAStar
35+ import com.lambda.pathing.PathingSettings
3036import com.lambda.pathing.goal.SimpleGoal
37+ import com.lambda.threading.runConcurrent
38+ import com.lambda.util.Communication.info
3139import com.lambda.util.math.setAlpha
3240import com.lambda.util.player.MovementUtils.buildMovementInput
3341import com.lambda.util.player.MovementUtils.mergeFrom
@@ -38,75 +46,96 @@ import net.minecraft.util.math.Vec3d
3846import java.awt.Color
3947import kotlin.math.cos
4048import kotlin.math.sin
49+ import kotlin.system.measureTimeMillis
4150
4251object Pathfinder : Module(
4352 name = " Pathfinder" ,
4453 description = " Get from A to B" ,
4554 defaultTags = setOf(ModuleTag .MOVEMENT )
4655) {
47- // PID Settings
48- private val kP by setting(" P Gain" , 0.5 , 0.0 .. 2.0 , 0.01 )
49- private val kI by setting(" I Gain" , 0.0 , 0.0 .. 1.0 , 0.01 )
50- private val kD by setting(" D Gain" , 0.2 , 0.0 .. 1.0 , 0.01 )
51- private val tolerance by setting(" Node Tolerance" , 0.1 , 0.01 .. 1.0 , 0.01 )
56+ private val pathing = PathingSettings (this )
57+ private val rotation = RotationSettings (this )
5258
53- var path = Path ()
59+ var path: Path ? = null
5460 private var currentTarget: Vec3d ? = null
5561 private var integralError = Vec3d .ZERO
5662 private var lastError = Vec3d .ZERO
63+ private var calculating = false
5764
5865 init {
5966 onEnable {
60- path = findPathAStar(
61- player.blockPos.toFastVec(),
62- SimpleGoal (fastVectorOf(0 , 120 , 0 ))
63- )
64- // currentTarget = Vec3d(0.5, 120.0, 0.5)
6567 integralError = Vec3d .ZERO
6668 lastError = Vec3d .ZERO
6769 }
6870
69- listen<RotationEvent .StrafeInput > { event ->
70- if (path.nodes.isEmpty()) return @listen
71+ listen<TickEvent .Pre > {
72+ if (calculating) return @listen
73+ calculating = true
7174
72- updateTargetNode()
73- currentTarget?.let { target ->
74- event.strafeYaw = player.eyePos.rotationTo(target).yaw
75- val adjustment = calculatePID(target)
76- val yawRad = Math .toRadians(event.strafeYaw)
77- val forward = - sin(yawRad)
78- val strafe = cos(yawRad)
79-
80- val forwardComponent = adjustment.x * forward + adjustment.z * strafe
81- val strafeComponent = adjustment.x * strafe - adjustment.z * forward
82-
83- val moveInput = buildMovementInput(
84- forward = forwardComponent,
85- strafe = strafeComponent,
86- jump = player.isOnGround && adjustment.y > 0.5
87- )
88- event.input.mergeFrom(moveInput)
75+ runConcurrent {
76+ val took = measureTimeMillis {
77+ path = findPathAStar(
78+ player.blockPos.toFastVec(),
79+ // SimpleGoal(fastVectorOf(0, 78, 0)),
80+ SimpleGoal (fastVectorOf(0 , 120 , 0 )),
81+ pathing.cutoffTimeout
82+ )
83+ }
84+ info(" Found path of length ${path?.moves?.size} in $took ms" )
85+ println (" Path: ${path?.toString()} " )
86+ calculating = false
8987 }
9088 }
9189
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
100+ // 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
113+ // val part = player.eyePos.rotationTo(Vec3d.ofBottomCenter(nextTarget))
114+ // val targetRotation = Rotation(part.yaw, player.pitch.toDouble())
115+ //
116+ // lookAt(targetRotation).requestBy(rotation)
117+ // }
118+
92119 listen<RenderEvent .StaticESP > { event ->
93- path.nodes .zipWithNext { current, next ->
120+ path?.moves? .zipWithNext { current, next ->
94121 val currentPos = current.pos.toBlockPos().toCenterPos()
95122 val nextPos = next.pos.toBlockPos().toCenterPos()
96- event.renderer.buildLine(currentPos, nextPos, Color .BLUE .setAlpha( 0.25 ) )
123+ event.renderer.buildLine(currentPos, nextPos, Color .GREEN )
97124 }
98125 }
99126 }
100127
101128 private fun SafeContext.updateTargetNode () {
102- path.nodes .firstOrNull()?.let { firstNode ->
129+ path?.moves? .firstOrNull()?.let { firstNode ->
103130 val nodeVec = Vec3d .ofBottomCenter(firstNode.pos.toBlockPos())
104- if (player.pos.distanceTo(nodeVec) < tolerance) {
105- path.nodes .removeFirst()
131+ if (player.pos.distanceTo(nodeVec) < pathing. tolerance) {
132+ path?.moves? .removeFirst()
106133 integralError = Vec3d .ZERO
107134 }
108- val next = path.nodes .firstOrNull()?.pos?.toBlockPos() ? : return
135+ val next = path?.moves? .firstOrNull()?.pos?.toBlockPos() ? : return
109136 currentTarget = Vec3d .ofBottomCenter(next)
137+ } ? : run {
138+ currentTarget = null
110139 }
111140 }
112141
@@ -116,8 +145,8 @@ object Pathfinder : Module(
116145 val derivativeError = error.subtract(lastError)
117146 lastError = error
118147
119- return error.multiply(kP)
120- .add(integralError.multiply(kI))
121- .add(derivativeError.multiply(kD))
148+ return error.multiply(pathing. kP)
149+ .add(integralError.multiply(pathing. kI))
150+ .add(derivativeError.multiply(pathing. kD))
122151 }
123152}
0 commit comments