Skip to content

Commit 169308d

Browse files
committed
- Make rotations for looking at target smooth
- Fix LookAtTarget not working due to conflict with RotationManager
1 parent f1c78e1 commit 169308d

File tree

2 files changed

+32
-7
lines changed

2 files changed

+32
-7
lines changed

src/main/kotlin/com/lambda/interaction/request/rotating/visibilty/RotationTargets.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@ import net.minecraft.util.hit.EntityHitResult
3434
import net.minecraft.util.hit.HitResult
3535
import net.minecraft.util.math.BlockPos
3636
import net.minecraft.util.math.Direction
37+
import net.minecraft.util.math.Vec3d
38+
import kotlin.math.atan2
39+
import kotlin.math.hypot
3740

3841
@DslMarker
3942
annotation class RotationDsl
@@ -51,6 +54,15 @@ fun lookAt(angle: Rotation, maxAngleDistance: Double = 0.001) =
5154
RotationManager.activeRotation dist angle < maxAngleDistance
5255
}) { angle }
5356

57+
@RotationDsl
58+
fun lookAt(pos: Vec3d) =
59+
RotationTarget(null) {
60+
val direction = pos.subtract(player.eyePos).normalize()
61+
val yaw = Math.toDegrees(atan2(direction.z, direction.x)) - 90.0
62+
val pitch = -Math.toDegrees(atan2(direction.y, hypot(direction.x, direction.z)))
63+
Rotation(yaw, pitch)
64+
}
65+
5466
@RotationDsl
5567
fun lookInDirection(direction: PlaceDirection) =
5668
RotationTarget(null, {

src/main/kotlin/com/lambda/module/modules/player/Freecam.kt

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ import com.lambda.interaction.request.rotating.visibilty.lookAt
3030
import com.lambda.interaction.request.rotating.visibilty.lookAtHit
3131
import com.lambda.module.Module
3232
import com.lambda.module.tag.ModuleTag
33+
import com.lambda.util.Describable
34+
import com.lambda.util.NamedEnum
3335
import com.lambda.util.extension.rotation
3436
import com.lambda.util.math.interpolate
3537
import com.lambda.util.math.plus
@@ -45,6 +47,10 @@ import com.lambda.util.player.MovementUtils.roundedStrafing
4547
import com.lambda.util.player.MovementUtils.verticalMovement
4648
import com.lambda.util.world.raycast.RayCastUtils.orMiss
4749
import net.minecraft.client.option.Perspective
50+
import net.minecraft.util.hit.BlockHitResult
51+
import net.minecraft.util.hit.HitResult
52+
import net.minecraft.util.math.BlockPos
53+
import net.minecraft.util.math.Direction
4854
import net.minecraft.util.math.Vec3d
4955

5056
object Freecam : Module(
@@ -57,9 +63,9 @@ object Freecam : Module(
5763
private val sprint by setting("Sprint Multiplier", 3.0, 0.1..10.0, 0.1, description = "Set below 1.0 to fly slower on sprint.")
5864
private val reach by setting("Reach", 10.0, 1.0..100.0, 1.0, "Freecam reach distance")
5965
private val rotateMode by setting("Rotate Mode", FreecamRotationMode.None, "Rotation mode")
60-
private val relative by setting("Relative", false, "Moves freecam relative to player position").onValueChange { _, it ->
61-
if (it) lastPlayerPosition = player.pos
62-
}
66+
.onValueChange { _, it -> if (it == FreecamRotationMode.LookAtTarget) mc.crosshairTarget = BlockHitResult.createMissed(Vec3d.ZERO, Direction.UP, BlockPos.ORIGIN) }
67+
private val relative by setting("Relative", false, "Moves freecam relative to player position")
68+
.onValueChange { _, it -> if (it) lastPlayerPosition = player.pos }
6369
private val keepYLevel by setting("Keep Y Level", false, "Don't change the camera y-level on player movement") { relative }
6470

6571
override val rotationConfig = RotationConfig.Instant(RotationMode.Lock)
@@ -107,7 +113,14 @@ object Freecam : Module(
107113
when (rotateMode) {
108114
FreecamRotationMode.None -> return@listen
109115
FreecamRotationMode.KeepRotation -> lookAt(rotation).requestBy(this@Freecam)
110-
FreecamRotationMode.LookAtTarget -> mc.crosshairTarget?.let { lookAtHit(it)?.requestBy(this@Freecam) }
116+
FreecamRotationMode.LookAtTarget ->
117+
mc.crosshairTarget?.let {
118+
when (it) {
119+
is BlockHitResult -> lookAt(it.pos).requestBy(this@Freecam)
120+
else -> lookAtHit(it)?.requestBy(this@Freecam)
121+
122+
}
123+
}
111124
}
112125
}
113126

@@ -150,12 +163,12 @@ object Freecam : Module(
150163
}
151164
}
152165

153-
listen<RenderEvent.UpdateTarget> {
154-
it.cancel()
155-
166+
listen<RenderEvent.UpdateTarget>(priority = 1) { event -> // Higher priority then RotationManager to run before RotationManager modifies mc.crosshairTarget
156167
mc.crosshairTarget = rotation
157168
.rayCast(reach, lerpPos)
158169
.orMiss // Can't be null (otherwise mc will spam "Null returned as 'hitResult', this shouldn't happen!")
170+
171+
mc.crosshairTarget?.let { if (it.type != HitResult.Type.MISS) event.cancel() }
159172
}
160173
}
161174

0 commit comments

Comments
 (0)