[fix] Freecam movement input compatibility (#1651)

Co-authored-by: Dominika <sokolov.dominika@gmail.com>
This commit is contained in:
Xiaro 2020-12-03 18:00:51 -05:00 committed by GitHub
parent 9a8ffbb480
commit 239221805f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 85 additions and 91 deletions

View File

@ -1,42 +0,0 @@
package me.zeroeightsix.kami.mixin.client.player;
import me.zeroeightsix.kami.event.KamiEventBus;
import me.zeroeightsix.kami.event.events.PlayerUpdateMoveEvent;
import me.zeroeightsix.kami.module.modules.player.Freecam;
import net.minecraft.util.MovementInput;
import net.minecraft.util.MovementInputFromOptions;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
/**
* @author ionar2
* Used with explicit permission and MIT license permission
* https://github.com/ionar2/salhack/blob/fa9e383/src/main/java/me/ionar/salhack/mixin/client/MixinMovementInputFromOptions.java
* @see me.zeroeightsix.kami.module.modules.movement.InventoryMove
*/
@Mixin(MovementInputFromOptions.class)
public abstract class MixinMovementInputFromOptions extends MovementInput {
@Inject(method = "updatePlayerMoveState", at = @At("RETURN"))
public void updatePlayerMoveStateReturn(CallbackInfo callback) {
KamiEventBus.INSTANCE.post(new PlayerUpdateMoveEvent());
}
// We have to cancel this so original player doesn't move around, also reset movement input when we enable Freecam
@Inject(method = "updatePlayerMoveState", at = @At("HEAD"), cancellable = true)
public void updatePlayerMoveStateHead(CallbackInfo ci) {
if (Freecam.INSTANCE.isEnabled() && Freecam.INSTANCE.getCameraGuy() != null) ci.cancel();
if (Freecam.INSTANCE.getResetInput()) {
this.moveForward = 0f;
this.moveStrafe = 0f;
this.forwardKeyDown = false;
this.backKeyDown = false;
this.leftKeyDown = false;
this.rightKeyDown = false;
this.jump = false;
this.sneak = false;
Freecam.INSTANCE.setResetInput(false);
}
}
}

View File

@ -12,6 +12,7 @@ import me.zeroeightsix.kami.util.TimerUtils
import me.zeroeightsix.kami.util.event.listener
import me.zeroeightsix.kami.util.math.Direction
import me.zeroeightsix.kami.util.text.MessageSendHelper
import net.minecraft.util.MovementInputFromOptions
import net.minecraftforge.client.event.InputUpdateEvent
import kotlin.math.floor
@ -60,6 +61,8 @@ object AutoWalk : Module() {
}
listener<InputUpdateEvent>(6969) {
if (it.movementInput !is MovementInputFromOptions) return@listener
when (mode.value) {
AutoWalkMode.FORWARD -> {
it.movementInput.moveForward = 1.0f

View File

@ -1,13 +1,14 @@
package me.zeroeightsix.kami.module.modules.movement
import me.zeroeightsix.kami.KamiMod
import me.zeroeightsix.kami.event.events.PlayerUpdateMoveEvent
import me.zeroeightsix.kami.module.Module
import me.zeroeightsix.kami.setting.Settings
import me.zeroeightsix.kami.util.event.listener
import net.minecraft.client.gui.GuiChat
import net.minecraft.client.gui.GuiRepair
import net.minecraft.client.gui.inventory.GuiEditSign
import net.minecraft.util.MovementInputFromOptions
import net.minecraftforge.client.event.InputUpdateEvent
import org.lwjgl.input.Keyboard
@Module.Info(
@ -22,8 +23,8 @@ object InventoryMove : Module() {
private var hasSent = false
init {
listener<PlayerUpdateMoveEvent> {
if (mc.currentScreen == null || mc.currentScreen is GuiChat || mc.currentScreen is GuiEditSign || mc.currentScreen is GuiRepair) return@listener
listener<InputUpdateEvent> {
if (it.movementInput !is MovementInputFromOptions || checkGui()) return@listener
if (Keyboard.isKeyDown(Keyboard.KEY_LEFT)) {
mc.player.rotationYaw = mc.player.rotationYaw - rotateSpeed.value
@ -40,44 +41,44 @@ object InventoryMove : Module() {
mc.player.rotationPitch = (mc.player.rotationPitch + rotateSpeed.value).coerceAtMost(90.0f)
}
mc.player.movementInput.moveStrafe = 0.0f
mc.player.movementInput.moveForward = 0.0f
it.movementInput.moveStrafe = 0.0f
it.movementInput.moveForward = 0.0f
try {
if (Keyboard.isKeyDown(mc.gameSettings.keyBindForward.keyCode)) {
++mc.player.movementInput.moveForward
mc.player.movementInput.forwardKeyDown = true
++it.movementInput.moveForward
it.movementInput.forwardKeyDown = true
} else {
mc.player.movementInput.forwardKeyDown = false
it.movementInput.forwardKeyDown = false
}
if (Keyboard.isKeyDown(mc.gameSettings.keyBindBack.keyCode)) {
--mc.player.movementInput.moveForward
mc.player.movementInput.backKeyDown = true
--it.movementInput.moveForward
it.movementInput.backKeyDown = true
} else {
mc.player.movementInput.backKeyDown = false
it.movementInput.backKeyDown = false
}
if (Keyboard.isKeyDown(mc.gameSettings.keyBindLeft.keyCode)) {
++mc.player.movementInput.moveStrafe
mc.player.movementInput.leftKeyDown = true
++it.movementInput.moveStrafe
it.movementInput.leftKeyDown = true
} else {
mc.player.movementInput.leftKeyDown = false
it.movementInput.leftKeyDown = false
}
if (Keyboard.isKeyDown(mc.gameSettings.keyBindRight.keyCode)) {
--mc.player.movementInput.moveStrafe
mc.player.movementInput.rightKeyDown = true
--it.movementInput.moveStrafe
it.movementInput.rightKeyDown = true
} else {
mc.player.movementInput.rightKeyDown = false
it.movementInput.rightKeyDown = false
}
if (Keyboard.isKeyDown(mc.gameSettings.keyBindJump.keyCode)) {
mc.player.movementInput.jump = true
it.movementInput.jump = true
}
if (Keyboard.isKeyDown(mc.gameSettings.keyBindSneak.keyCode) && sneak.value) {
mc.player.movementInput.sneak = true
it.movementInput.sneak = true
}
} catch (e: IndexOutOfBoundsException) {
if (!hasSent) {
@ -88,4 +89,9 @@ object InventoryMove : Module() {
}
}
}
private fun checkGui() = mc.currentScreen == null
|| mc.currentScreen is GuiChat
|| mc.currentScreen is GuiEditSign
|| mc.currentScreen is GuiRepair
}

View File

@ -16,7 +16,11 @@ import net.minecraft.client.entity.EntityPlayerSP
import net.minecraft.entity.MoverType
import net.minecraft.entity.player.EntityPlayer
import net.minecraft.network.play.client.CPacketUseEntity
import net.minecraft.util.MovementInput
import net.minecraft.util.MovementInputFromOptions
import net.minecraft.util.math.RayTraceResult
import net.minecraft.util.math.Vec3d
import net.minecraftforge.client.event.InputUpdateEvent
import net.minecraftforge.fml.common.gameevent.InputEvent
import net.minecraftforge.fml.common.gameevent.TickEvent
import org.lwjgl.input.Keyboard
@ -39,13 +43,13 @@ object Freecam : Module() {
private var prevThirdPersonViewSetting = -1
var cameraGuy: EntityPlayer? = null; private set
var resetInput = false
private const val ENTITY_ID = -6969420
override fun onDisable() {
mc.renderChunksMany = true
resetCameraGuy()
resetMovementInput(mc.player?.movementInput)
}
override fun onEnable() {
@ -65,6 +69,10 @@ object Freecam : Module() {
if (it.packet.getEntityFromWorld(mc.world) == mc.player) it.cancel()
}
listener<ClientPlayerAttackEvent> {
if (it.entity == mc.player) it.cancel()
}
listener<InputEvent.KeyInputEvent> {
if (mc.world == null || mc.player == null) return@listener
// Force it to stay in first person lol
@ -80,16 +88,28 @@ object Freecam : Module() {
}
if (cameraGuy == null && mc.player.ticksExisted > 20) spawnCameraGuy()
if (!BaritoneUtils.isPathing && !BaritoneUtils.isActive) {
if (autoRotate.value) updatePlayerRotation()
if (arrowKeyMove.value) updatePlayerMovement()
}
}
listener<ClientPlayerAttackEvent> {
if (it.entity == mc.player) it.cancel()
listener<InputUpdateEvent>(9999) {
if (it.movementInput !is MovementInputFromOptions || BaritoneUtils.isPathing || BaritoneUtils.isActive) return@listener
resetMovementInput(it.movementInput)
if (autoRotate.value) updatePlayerRotation()
if (arrowKeyMove.value) updatePlayerMovement()
}
}
private fun resetMovementInput(movementInput: MovementInput?) {
if (movementInput !is MovementInputFromOptions) return
movementInput.apply {
moveForward = 0f
moveStrafe = 0f
forwardKeyDown = false
backKeyDown = false
leftKeyDown = false
rightKeyDown = false
jump = false
sneak = false
}
}
@ -97,13 +117,13 @@ object Freecam : Module() {
// Create a cloned player
cameraGuy = FakeCamera(mc.player).also {
// Add it to the world
mc.world.addEntityToWorld(ENTITY_ID, it)
mc.world?.addEntityToWorld(ENTITY_ID, it)
// Set the render view entity to our camera guy
mc.renderViewEntity = it
// Reset player movement input
resetInput = true
resetMovementInput(mc.player?.movementInput)
// Stores prev third person view setting
prevThirdPersonViewSetting = mc.gameSettings.thirdPersonView
@ -112,32 +132,40 @@ object Freecam : Module() {
}
private fun updatePlayerRotation() {
mc.objectMouseOver?.hitVec?.let {
val rotation = Vec2f(RotationUtils.getRotationTo(it, true))
mc.player.rotationYaw = rotation.x
mc.player.rotationPitch = rotation.y
mc.objectMouseOver?.let {
val hitVec = it.hitVec
if (it.typeOfHit == RayTraceResult.Type.MISS || hitVec == null) return
val rotation = Vec2f(RotationUtils.getRotationTo(hitVec, true))
mc.player?.apply {
rotationYaw = rotation.x
rotationPitch = rotation.y
}
}
}
private fun updatePlayerMovement() {
cameraGuy?.let {
val forward = Keyboard.isKeyDown(Keyboard.KEY_UP) to Keyboard.isKeyDown(Keyboard.KEY_DOWN)
val strafe = Keyboard.isKeyDown(Keyboard.KEY_LEFT) to Keyboard.isKeyDown(Keyboard.KEY_RIGHT)
val movementInput = calcMovementInput(forward, strafe, false to false)
mc.player?.let { player ->
cameraGuy?.let {
val forward = Keyboard.isKeyDown(Keyboard.KEY_UP) to Keyboard.isKeyDown(Keyboard.KEY_DOWN)
val strafe = Keyboard.isKeyDown(Keyboard.KEY_LEFT) to Keyboard.isKeyDown(Keyboard.KEY_RIGHT)
val movementInput = calcMovementInput(forward, strafe, false to false)
val yawDiff = mc.player.rotationYaw - it.rotationYaw
val yawRad = MovementUtils.calcMoveYaw(yawDiff, movementInput.first, movementInput.second).toFloat()
val inputTotal = min(abs(movementInput.first) + abs(movementInput.second), 1f)
val yawDiff = player.rotationYaw - it.rotationYaw
val yawRad = MovementUtils.calcMoveYaw(yawDiff, movementInput.first, movementInput.second).toFloat()
val inputTotal = min(abs(movementInput.first) + abs(movementInput.second), 1f)
mc.player.movementInput.moveForward = cos(yawRad) * inputTotal
mc.player.movementInput.moveStrafe = sin(yawRad) * inputTotal
player.movementInput?.apply {
moveForward = cos(yawRad) * inputTotal
moveStrafe = sin(yawRad) * inputTotal
mc.player.movementInput.forwardKeyDown = mc.player.movementInput.moveForward > 0f
mc.player.movementInput.backKeyDown = mc.player.movementInput.moveForward < 0f
mc.player.movementInput.leftKeyDown = mc.player.movementInput.moveStrafe < 0f
mc.player.movementInput.rightKeyDown = mc.player.movementInput.moveStrafe > 0f
forwardKeyDown = moveForward > 0f
backKeyDown = moveForward < 0f
leftKeyDown = moveStrafe < 0f
rightKeyDown = moveStrafe > 0f
mc.player.movementInput.jump = Keyboard.isKeyDown(Keyboard.KEY_RCONTROL)
jump = Keyboard.isKeyDown(Keyboard.KEY_RCONTROL)
}
}
}
}

View File

@ -45,7 +45,6 @@
"optifine.MixinConfig",
"player.MixinEntityPlayer",
"player.MixinEntityPlayerSP",
"player.MixinMovementInputFromOptions",
"player.MixinPlayerControllerMP",
"render.MixinDebugRendererChunkBorder",
"render.MixinEntityRenderer",