1+ /*
2+ * Copyright 2025 Lambda
3+ *
4+ * This program is free software: you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation, either version 3 of the License, or
7+ * (at your option) any later version.
8+ *
9+ * This program is distributed in the hope that it will be useful,
10+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
11+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+ * GNU General Public License for more details.
13+ *
14+ * You should have received a copy of the GNU General Public License
15+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
16+ */
17+
18+ package com.lambda.module.modules.player
19+
20+ import com.lambda.config.groups.RotationSettings
21+ import com.lambda.event.events.TickEvent
22+ import com.lambda.event.listener.SafeListener.Companion.listen
23+ import com.lambda.interaction.request.rotating.Rotation
24+ import com.lambda.interaction.request.rotating.RotationRequest
25+ import com.lambda.interaction.request.rotating.visibilty.lookAt
26+ import com.lambda.module.Module
27+ import com.lambda.module.tag.ModuleTag
28+ import com.lambda.util.NamedEnum
29+ import kotlin.math.roundToInt
30+
31+ object RotationLock : Module(
32+ " RotationLock" ,
33+ " Locks the player rotation to the given configuration" ,
34+ ModuleTag .PLAYER
35+ ) {
36+ private enum class Group (override val displayName : String ) : NamedEnum {
37+ General (" General" ),
38+ Rotation (" Rotation" )
39+ }
40+
41+ @JvmStatic val yawMode by setting(" Yaw Mode" , RotationMode .Snap ).group(Group .General )
42+ private val yawStep by setting(" Yaw Step" , 45.0 , 1.0 .. 180.0 , 1.0 ) { yawMode == RotationMode .Snap }.group(Group .General )
43+ private val customYaw by setting(" Custom Yaw" , 0.0 , - 179.0 .. 180.0 , 1.0 ) { yawMode == RotationMode .Custom }.group(Group .General )
44+ @JvmStatic val pitchMode by setting(" Pitch Mode" , RotationMode .Custom ).group(Group .General )
45+ private val pitchStep by setting(" Pitch Step" , 45.0 , 1.0 .. 90.0 , 1.0 ) { pitchMode == RotationMode .Snap }.group(Group .General )
46+ private val customPitch by setting(" Custom Pitch" , 0.0 , - 90.0 .. 90.0 , 1.0 ) { pitchMode == RotationMode .Custom }.group(Group .General )
47+
48+ @JvmStatic val rotationSettings = RotationSettings (this , Group .Rotation )
49+ private var rotationRequest: RotationRequest ? = null
50+
51+ init {
52+ listen<TickEvent .Pre > {
53+ val yaw = when (yawMode) {
54+ RotationMode .Custom -> customYaw
55+ RotationMode .Snap -> {
56+ val normalizedYaw = (player.yaw % 360.0 + 360.0 ) % 360.0
57+ (normalizedYaw / yawStep).roundToInt() * yawStep
58+ }
59+ RotationMode .None -> player.yaw.toDouble()
60+ }
61+ val pitch = when (pitchMode) {
62+ RotationMode .Custom -> customPitch
63+ RotationMode .Snap -> {
64+ val clampedPitch = player.pitch.coerceIn(- 90f , 90f )
65+ (clampedPitch / pitchStep).roundToInt() * pitchStep
66+ }
67+ RotationMode .None -> player.pitch.toDouble()
68+ }
69+
70+ rotationRequest = RotationRequest (lookAt(Rotation (yaw, pitch), 0.001 ), rotationSettings).submit()
71+ }
72+ }
73+
74+ enum class RotationMode {
75+ Snap ,
76+ Custom ,
77+ None
78+ }
79+ }
0 commit comments