|
5 | 5 | import dev.isxander.controlify.Controlify; |
6 | 6 | import dev.isxander.controlify.api.ControlifyApi; |
7 | 7 | import dev.isxander.controlify.fixes.boatfix.AnalogBoatInput; |
| 8 | +import dev.isxander.controlify.utils.CUtil; |
| 9 | +import dev.isxander.controlify.utils.MthExt; |
8 | 10 | import net.minecraft.client.player.LocalPlayer; |
| 11 | +import net.minecraft.util.Mth; |
9 | 12 | import net.minecraft.world.entity.vehicle.Boat; |
10 | 13 | import org.spongepowered.asm.mixin.Mixin; |
11 | 14 | import org.spongepowered.asm.mixin.Shadow; |
@@ -40,9 +43,24 @@ private void useAnalogInput( |
40 | 43 | Operation<Void> original |
41 | 44 | ) { |
42 | 45 | if (ControlifyApi.get().currentInputMode().isController() && !Controlify.instance().config().globalSettings().shouldUseKeyboardMovement()) { |
| 46 | + float forwardImpulse = input.forwardImpulse; |
| 47 | + float rightImpulse = -input.leftImpulse; |
| 48 | + |
| 49 | + // Add a deadzone to the analog input. Right impulse between -0.1 and 0.1 is considered 0. |
| 50 | + // Other values are remapped to remap [0.1, 1] to [0, 1] and [-1, -0.1] to [-1, 0]. |
| 51 | + float deadzone = 0.1f; |
| 52 | + |
| 53 | + float onlyRightImpulseAbs = Math.max(0, rightImpulse); |
| 54 | + float onlyLeftImpulseAbs = -Math.min(0, rightImpulse); |
| 55 | + |
| 56 | + onlyRightImpulseAbs = onlyRightImpulseAbs < deadzone ? 0 : MthExt.remap(onlyRightImpulseAbs, deadzone, 1, 0, 1); |
| 57 | + onlyLeftImpulseAbs = onlyLeftImpulseAbs < deadzone ? 0 : MthExt.remap(onlyLeftImpulseAbs, deadzone, 1, 0, 1); |
| 58 | + |
| 59 | + rightImpulse = onlyRightImpulseAbs - onlyLeftImpulseAbs; |
| 60 | + |
43 | 61 | ((AnalogBoatInput) boat).controlify$setAnalogInput( |
44 | | - input.forwardImpulse, |
45 | | - -input.leftImpulse |
| 62 | + forwardImpulse, |
| 63 | + rightImpulse |
46 | 64 | ); |
47 | 65 |
|
48 | 66 | return; |
|
0 commit comments