aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.Client/Input.cpp
diff options
context:
space:
mode:
authordaoge_cmd <3523206925@qq.com>2026-03-04 21:19:40 +0800
committerdaoge_cmd <3523206925@qq.com>2026-03-05 01:12:48 +0800
commit1dc8a005ed111463c22c17b487e5ec8a3e2d30f3 (patch)
tree8f1825364bf14178f720ee124b01de78afa16d40 /Minecraft.Client/Input.cpp
parentac03b88a907bb49f5159f08de07398f3fce32991 (diff)
refactor: refactor KBM input code
Diffstat (limited to 'Minecraft.Client/Input.cpp')
-rw-r--r--Minecraft.Client/Input.cpp147
1 files changed, 92 insertions, 55 deletions
diff --git a/Minecraft.Client/Input.cpp b/Minecraft.Client/Input.cpp
index 1639d09b..5e41da29 100644
--- a/Minecraft.Client/Input.cpp
+++ b/Minecraft.Client/Input.cpp
@@ -7,20 +7,21 @@
#include "Input.h"
#include "..\Minecraft.Client\LocalPlayer.h"
#include "Options.h"
+#ifdef _WINDOWS64
+#include "Windows64\KeyboardMouseInput.h"
+#endif
Input::Input()
{
xa = 0;
ya = 0;
- sprintForward = 0;
wasJumping = false;
jumping = false;
sneaking = false;
- usingKeyboardMovement = false;
+ sprinting = false;
lReset = false;
rReset = false;
- m_gamepadSneaking = false;
}
void Input::tick(LocalPlayer *player)
@@ -32,43 +33,43 @@ void Input::tick(LocalPlayer *player)
Minecraft *pMinecraft=Minecraft::GetInstance();
int iPad=player->GetXboxPad();
+ float controllerXA = 0.0f;
+ float controllerYA = 0.0f;
+
// 4J-PB minecraft movement seems to be the wrong way round, so invert x!
if( pMinecraft->localgameModes[iPad]->isInputAllowed(MINECRAFT_ACTION_LEFT) || pMinecraft->localgameModes[iPad]->isInputAllowed(MINECRAFT_ACTION_RIGHT) )
- xa = -InputManager.GetJoypadStick_LX(iPad);
- else
- xa = 0.0f;
+ controllerXA = -InputManager.GetJoypadStick_LX(iPad);
if( pMinecraft->localgameModes[iPad]->isInputAllowed(MINECRAFT_ACTION_FORWARD) || pMinecraft->localgameModes[iPad]->isInputAllowed(MINECRAFT_ACTION_BACKWARD) )
- ya = InputManager.GetJoypadStick_LY(iPad);
- else
- ya = 0.0f;
- sprintForward = ya;
- usingKeyboardMovement = false;
+ controllerYA = InputManager.GetJoypadStick_LY(iPad);
+ float kbXA = 0.0f;
+ float kbYA = 0.0f;
#ifdef _WINDOWS64
- // WASD movement (combine with gamepad)
- if (iPad == 0 && KMInput.IsCaptured())
+ if (iPad == 0 && g_KBMInput.IsMouseGrabbed() && g_KBMInput.IsKBMActive())
{
- float kbX = 0.0f, kbY = 0.0f;
- if (KMInput.IsKeyDown('W')) { kbY += 1.0f; sprintForward += 1.0f; usingKeyboardMovement = true; }
- if (KMInput.IsKeyDown('S')) { kbY -= 1.0f; sprintForward -= 1.0f; usingKeyboardMovement = true; }
- if (KMInput.IsKeyDown('A')) { kbX += 1.0f; usingKeyboardMovement = true; } // inverted like gamepad
- if (KMInput.IsKeyDown('D')) { kbX -= 1.0f; usingKeyboardMovement = true; }
- // Normalize diagonal
- if (kbX != 0.0f && kbY != 0.0f) { kbX *= 0.707f; kbY *= 0.707f; }
- if (pMinecraft->localgameModes[iPad]->isInputAllowed(MINECRAFT_ACTION_LEFT) || pMinecraft->localgameModes[iPad]->isInputAllowed(MINECRAFT_ACTION_RIGHT))
- xa = max(min(xa + kbX, 1.0f), -1.0f);
- if (pMinecraft->localgameModes[iPad]->isInputAllowed(MINECRAFT_ACTION_FORWARD) || pMinecraft->localgameModes[iPad]->isInputAllowed(MINECRAFT_ACTION_BACKWARD))
- ya = max(min(ya + kbY, 1.0f), -1.0f);
+ if( pMinecraft->localgameModes[iPad]->isInputAllowed(MINECRAFT_ACTION_LEFT) || pMinecraft->localgameModes[iPad]->isInputAllowed(MINECRAFT_ACTION_RIGHT) )
+ kbXA = g_KBMInput.GetMoveX();
+ if( pMinecraft->localgameModes[iPad]->isInputAllowed(MINECRAFT_ACTION_FORWARD) || pMinecraft->localgameModes[iPad]->isInputAllowed(MINECRAFT_ACTION_BACKWARD) )
+ kbYA = g_KBMInput.GetMoveY();
}
#endif
- sprintForward = max(min(sprintForward, 1.0f), -1.0f);
+
+ if (kbXA != 0.0f || kbYA != 0.0f)
+ {
+ xa = kbXA;
+ ya = kbYA;
+ }
+ else
+ {
+ xa = controllerXA;
+ ya = controllerYA;
+ }
#ifndef _CONTENT_PACKAGE
if (app.GetFreezePlayers())
{
xa = ya = 0.0f;
- sprintForward = 0.0f;
player->abilities.flying = true;
}
#endif
@@ -80,7 +81,6 @@ void Input::tick(LocalPlayer *player)
lReset = true;
}
xa = ya = 0.0f;
- sprintForward = 0.0f;
}
// 4J: In flying mode, don't actually toggle sneaking (unless we're riding in which case we need to sneak to dismount)
@@ -88,15 +88,46 @@ void Input::tick(LocalPlayer *player)
{
if((player->ullButtonsPressed&(1LL<<MINECRAFT_ACTION_SNEAK_TOGGLE)) && pMinecraft->localgameModes[iPad]->isInputAllowed(MINECRAFT_ACTION_SNEAK_TOGGLE))
{
- m_gamepadSneaking=!m_gamepadSneaking;
+ sneaking=!sneaking;
}
}
- sneaking = m_gamepadSneaking;
#ifdef _WINDOWS64
- // Keyboard hold-to-sneak (overrides gamepad toggle)
- if (iPad == 0 && KMInput.IsCaptured() && KMInput.IsKeyDown(VK_SHIFT) && !player->abilities.flying)
- sneaking = true;
+ if (iPad == 0 && g_KBMInput.IsMouseGrabbed() && g_KBMInput.IsKBMActive())
+ {
+ // Left Shift = sneak (hold to crouch)
+ if (pMinecraft->localgameModes[iPad]->isInputAllowed(MINECRAFT_ACTION_SNEAK_TOGGLE))
+ {
+ if (!player->abilities.flying)
+ {
+ sneaking = g_KBMInput.IsKeyDown(KeyboardMouseInput::KEY_SNEAK);
+ }
+ }
+
+ // Left Ctrl + forward = sprint (hold to sprint)
+ if (!player->abilities.flying)
+ {
+ bool ctrlHeld = g_KBMInput.IsKeyDown(KeyboardMouseInput::KEY_SPRINT);
+ bool movingForward = (kbYA > 0.0f);
+
+ if (ctrlHeld && movingForward)
+ {
+ sprinting = true;
+ }
+ else
+ {
+ sprinting = false;
+ }
+ }
+ else
+ {
+ sprinting = false;
+ }
+ }
+ else if (iPad == 0)
+ {
+ sprinting = false;
+ }
#endif
if(sneaking)
@@ -109,6 +140,7 @@ void Input::tick(LocalPlayer *player)
float tx = 0.0f;
float ty = 0.0f;
+
if( pMinecraft->localgameModes[iPad]->isInputAllowed(MINECRAFT_ACTION_LOOK_LEFT) || pMinecraft->localgameModes[iPad]->isInputAllowed(MINECRAFT_ACTION_LOOK_RIGHT) )
tx = InputManager.GetJoypadStick_RX(iPad)*(((float)app.GetGameSettings(iPad,eGameSetting_Sensitivity_InGame))/100.0f); // apply sensitivity to look
if( pMinecraft->localgameModes[iPad]->isInputAllowed(MINECRAFT_ACTION_LOOK_UP) || pMinecraft->localgameModes[iPad]->isInputAllowed(MINECRAFT_ACTION_LOOK_DOWN) )
@@ -132,47 +164,52 @@ void Input::tick(LocalPlayer *player)
}
tx = ty = 0.0f;
}
- player->interpolateTurn(tx * abs(tx) * turnSpeed, ty * abs(ty) * turnSpeed);
+
+ float turnX = tx * abs(tx) * turnSpeed;
+ float turnY = ty * abs(ty) * turnSpeed;
#ifdef _WINDOWS64
- // Mouse look is now handled per-frame in Minecraft::applyFrameMouseLook()
- // to eliminate the 20Hz tick delay. Only flush any remaining delta here
- // as a safety measure.
- if (iPad == 0 && KMInput.IsCaptured())
+ if (iPad == 0 && g_KBMInput.IsMouseGrabbed() && g_KBMInput.IsKBMActive())
{
- float rawDx, rawDy;
- KMInput.ConsumeMouseDelta(rawDx, rawDy);
- // Delta should normally be 0 since applyFrameMouseLook() already consumed it
- if (rawDx != 0.0f || rawDy != 0.0f)
+ float mouseSensitivity = ((float)app.GetGameSettings(iPad,eGameSetting_Sensitivity_InGame)) / 100.0f;
+ float mouseLookScale = 5.0f;
+ float mx = g_KBMInput.GetLookX(mouseSensitivity * mouseLookScale);
+ float my = g_KBMInput.GetLookY(mouseSensitivity * mouseLookScale);
+
+ if ( app.GetGameSettings(iPad,eGameSetting_ControlInvertLook) )
{
- float mouseSensitivity = ((float)app.GetGameSettings(iPad, eGameSetting_Sensitivity_InGame)) / 100.0f;
- float mdx = rawDx * mouseSensitivity;
- float mdy = -rawDy * mouseSensitivity;
- if (app.GetGameSettings(iPad, eGameSetting_ControlInvertLook))
- mdy = -mdy;
- player->interpolateTurn(mdx, mdy);
+ my = -my;
}
+
+ turnX += mx;
+ turnY += my;
}
#endif
- //jumping = controller.isButtonPressed(0);
+ player->interpolateTurn(turnX, turnY);
+ //jumping = controller.isButtonPressed(0);
unsigned int jump = InputManager.GetValue(iPad, MINECRAFT_ACTION_JUMP);
- if( jump > 0 && pMinecraft->localgameModes[iPad]->isInputAllowed(MINECRAFT_ACTION_JUMP) )
+ bool kbJump = false;
+#ifdef _WINDOWS64
+ kbJump = (iPad == 0) && g_KBMInput.IsMouseGrabbed() && g_KBMInput.IsKBMActive() && g_KBMInput.IsKeyDown(KeyboardMouseInput::KEY_JUMP);
+#endif
+ if( (jump > 0 || kbJump) && pMinecraft->localgameModes[iPad]->isInputAllowed(MINECRAFT_ACTION_JUMP) )
jumping = true;
else
jumping = false;
-#ifdef _WINDOWS64
- // Keyboard jump (Space)
- if (iPad == 0 && KMInput.IsCaptured() && KMInput.IsKeyDown(VK_SPACE) && pMinecraft->localgameModes[iPad]->isInputAllowed(MINECRAFT_ACTION_JUMP))
- jumping = true;
-#endif
-
#ifndef _CONTENT_PACKAGE
if (app.GetFreezePlayers()) jumping = false;
#endif
+#ifdef _WINDOWS64
+ if (iPad == 0 && g_KBMInput.IsKeyPressed(VK_ESCAPE) && g_KBMInput.IsMouseGrabbed())
+ {
+ g_KBMInput.SetMouseGrabbed(false);
+ }
+#endif
+
//OutputDebugString("INPUT: End input tick\n");
}