mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-02-06 19:45:33 +00:00
Rework actions update
This commit is contained in:
parent
d3a9f893c8
commit
13b7c5b519
12 changed files with 200 additions and 191 deletions
|
@ -40,9 +40,163 @@ namespace MWInput
|
||||||
, mScreenCaptureOperation(screenCaptureOperation)
|
, mScreenCaptureOperation(screenCaptureOperation)
|
||||||
, mAlwaysRunActive(Settings::Manager::getBool("always run", "Input"))
|
, mAlwaysRunActive(Settings::Manager::getBool("always run", "Input"))
|
||||||
, mSneaking(false)
|
, mSneaking(false)
|
||||||
|
, mAttemptJump(false)
|
||||||
|
, mOverencumberedMessageDelay(0.f)
|
||||||
|
, mPreviewPOVDelay(0.f)
|
||||||
|
, mTimeIdle(0.f)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ActionManager::update(float dt, bool triedToMove)
|
||||||
|
{
|
||||||
|
// Disable movement in Gui mode
|
||||||
|
if (MWBase::Environment::get().getWindowManager()->isGuiMode()
|
||||||
|
|| MWBase::Environment::get().getStateManager()->getState() != MWBase::StateManager::State_Running)
|
||||||
|
{
|
||||||
|
mAttemptJump = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Configure player movement according to keyboard input. Actual movement will
|
||||||
|
// be done in the physics system.
|
||||||
|
if (MWBase::Environment::get().getInputManager()->getControlSwitch("playercontrols"))
|
||||||
|
{
|
||||||
|
bool alwaysRunAllowed = false;
|
||||||
|
|
||||||
|
MWWorld::Player& player = MWBase::Environment::get().getWorld()->getPlayer();
|
||||||
|
|
||||||
|
if (actionIsActive(A_MoveLeft) != actionIsActive(A_MoveRight))
|
||||||
|
{
|
||||||
|
alwaysRunAllowed = true;
|
||||||
|
triedToMove = true;
|
||||||
|
player.setLeftRight (actionIsActive(A_MoveRight) ? 1 : -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (actionIsActive(A_MoveForward) != actionIsActive(A_MoveBackward))
|
||||||
|
{
|
||||||
|
alwaysRunAllowed = true;
|
||||||
|
triedToMove = true;
|
||||||
|
player.setAutoMove (false);
|
||||||
|
player.setForwardBackward (actionIsActive(A_MoveForward) ? 1 : -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (player.getAutoMove())
|
||||||
|
{
|
||||||
|
alwaysRunAllowed = true;
|
||||||
|
triedToMove = true;
|
||||||
|
player.setForwardBackward (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mAttemptJump && MWBase::Environment::get().getInputManager()->getControlSwitch("playerjumping"))
|
||||||
|
{
|
||||||
|
player.setUpDown(1);
|
||||||
|
triedToMove = true;
|
||||||
|
mOverencumberedMessageDelay = 0.f;
|
||||||
|
}
|
||||||
|
|
||||||
|
// if player tried to start moving, but can't (due to being overencumbered), display a notification.
|
||||||
|
if (triedToMove)
|
||||||
|
{
|
||||||
|
MWWorld::Ptr playerPtr = MWBase::Environment::get().getWorld ()->getPlayerPtr();
|
||||||
|
mOverencumberedMessageDelay -= dt;
|
||||||
|
if (playerPtr.getClass().getEncumbrance(playerPtr) > playerPtr.getClass().getCapacity(playerPtr))
|
||||||
|
{
|
||||||
|
player.setAutoMove (false);
|
||||||
|
if (mOverencumberedMessageDelay <= 0)
|
||||||
|
{
|
||||||
|
MWBase::Environment::get().getWindowManager()->messageBox("#{sNotifyMessage59}");
|
||||||
|
mOverencumberedMessageDelay = 1.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (MWBase::Environment::get().getInputManager()->getControlSwitch("playerviewswitch"))
|
||||||
|
{
|
||||||
|
if (actionIsActive(A_TogglePOV))
|
||||||
|
{
|
||||||
|
if (mPreviewPOVDelay <= 0.5 &&
|
||||||
|
(mPreviewPOVDelay += dt) > 0.5)
|
||||||
|
{
|
||||||
|
mPreviewPOVDelay = 1.f;
|
||||||
|
MWBase::Environment::get().getWorld()->togglePreviewMode(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//disable preview mode
|
||||||
|
MWBase::Environment::get().getWorld()->togglePreviewMode(false);
|
||||||
|
if (mPreviewPOVDelay > 0.f && mPreviewPOVDelay <= 0.5)
|
||||||
|
{
|
||||||
|
MWBase::Environment::get().getWorld()->togglePOV();
|
||||||
|
}
|
||||||
|
mPreviewPOVDelay = 0.f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (triedToMove)
|
||||||
|
MWBase::Environment::get().getInputManager()->resetIdleTime();
|
||||||
|
|
||||||
|
static const bool isToggleSneak = Settings::Manager::getBool("toggle sneak", "Input");
|
||||||
|
if (!isToggleSneak)
|
||||||
|
{
|
||||||
|
if(!MWBase::Environment::get().getInputManager()->joystickLastUsed())
|
||||||
|
player.setSneak(actionIsActive(A_Sneak));
|
||||||
|
}
|
||||||
|
|
||||||
|
float xAxis = mInputBinder->getChannel(A_MoveLeftRight)->getValue();
|
||||||
|
float yAxis = mInputBinder->getChannel(A_MoveForwardBackward)->getValue();
|
||||||
|
bool isRunning = xAxis > .75 || xAxis < .25 || yAxis > .75 || yAxis < .25;
|
||||||
|
if ((mAlwaysRunActive && alwaysRunAllowed) || isRunning)
|
||||||
|
player.setRunState(!actionIsActive(A_Run));
|
||||||
|
else
|
||||||
|
player.setRunState(actionIsActive(A_Run));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (actionIsActive(A_MoveForward) ||
|
||||||
|
actionIsActive(A_MoveBackward) ||
|
||||||
|
actionIsActive(A_MoveLeft) ||
|
||||||
|
actionIsActive(A_MoveRight) ||
|
||||||
|
actionIsActive(A_Jump) ||
|
||||||
|
actionIsActive(A_Sneak) ||
|
||||||
|
actionIsActive(A_TogglePOV) ||
|
||||||
|
actionIsActive(A_ZoomIn) ||
|
||||||
|
actionIsActive(A_ZoomOut))
|
||||||
|
{
|
||||||
|
resetIdleTime();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
updateIdleTime(dt);
|
||||||
|
}
|
||||||
|
|
||||||
|
mAttemptJump = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ActionManager::resetIdleTime()
|
||||||
|
{
|
||||||
|
if (mTimeIdle < 0)
|
||||||
|
MWBase::Environment::get().getWorld()->toggleVanityMode(false);
|
||||||
|
mTimeIdle = 0.f;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ActionManager::updateIdleTime(float dt)
|
||||||
|
{
|
||||||
|
static const float vanityDelay = MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>()
|
||||||
|
.find("fVanityDelay")->mValue.getFloat();
|
||||||
|
if (mTimeIdle >= 0.f)
|
||||||
|
mTimeIdle += dt;
|
||||||
|
if (mTimeIdle > vanityDelay)
|
||||||
|
{
|
||||||
|
MWBase::Environment::get().getWorld()->toggleVanityMode(true);
|
||||||
|
mTimeIdle = -1.f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ActionManager::actionIsActive(int id)
|
||||||
|
{
|
||||||
|
return (mInputBinder->getChannel(id)->getValue ()==1.0);
|
||||||
|
}
|
||||||
|
|
||||||
void ActionManager::executeAction(int action)
|
void ActionManager::executeAction(int action)
|
||||||
{
|
{
|
||||||
// trigger action activated
|
// trigger action activated
|
||||||
|
|
|
@ -28,6 +28,8 @@ namespace MWInput
|
||||||
|
|
||||||
void clear();
|
void clear();
|
||||||
|
|
||||||
|
void update(float dt, bool triedToMove);
|
||||||
|
|
||||||
void executeAction(int action);
|
void executeAction(int action);
|
||||||
|
|
||||||
bool checkAllowedToUseItems() const;
|
bool checkAllowedToUseItems() const;
|
||||||
|
@ -50,12 +52,22 @@ namespace MWInput
|
||||||
void quickKey (int index);
|
void quickKey (int index);
|
||||||
void showQuickKeysMenu();
|
void showQuickKeysMenu();
|
||||||
|
|
||||||
|
void resetIdleTime();
|
||||||
|
|
||||||
bool isAlwaysRunActive() const { return mAlwaysRunActive; };
|
bool isAlwaysRunActive() const { return mAlwaysRunActive; };
|
||||||
bool isSneaking() const { return mSneaking; };
|
bool isSneaking() const { return mSneaking; };
|
||||||
|
|
||||||
|
void setAttemptJump(bool enabled) { mAttemptJump = enabled; }
|
||||||
|
|
||||||
|
float getPreviewDelay() const { return mPreviewPOVDelay; };
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void handleGuiArrowKey(int action);
|
void handleGuiArrowKey(int action);
|
||||||
|
|
||||||
|
bool actionIsActive(int id);
|
||||||
|
|
||||||
|
void updateIdleTime(float dt);
|
||||||
|
|
||||||
ICS::InputControlSystem* mInputBinder;
|
ICS::InputControlSystem* mInputBinder;
|
||||||
osg::ref_ptr<osgViewer::Viewer> mViewer;
|
osg::ref_ptr<osgViewer::Viewer> mViewer;
|
||||||
osg::ref_ptr<osgViewer::ScreenCaptureHandler> mScreenCaptureHandler;
|
osg::ref_ptr<osgViewer::ScreenCaptureHandler> mScreenCaptureHandler;
|
||||||
|
@ -63,6 +75,11 @@ namespace MWInput
|
||||||
|
|
||||||
bool mAlwaysRunActive;
|
bool mAlwaysRunActive;
|
||||||
bool mSneaking;
|
bool mSneaking;
|
||||||
|
bool mAttemptJump;
|
||||||
|
|
||||||
|
float mOverencumberedMessageDelay;
|
||||||
|
float mPreviewPOVDelay;
|
||||||
|
float mTimeIdle;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -94,10 +94,10 @@ namespace MWInput
|
||||||
return (mInputBinder->getChannel (id)->getValue ()==1.0);
|
return (mInputBinder->getChannel (id)->getValue ()==1.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ControllerManager::update(float dt, bool disableControls, bool gamepadPreviewMode)
|
bool ControllerManager::update(float dt, bool disableControls)
|
||||||
{
|
{
|
||||||
mControlsDisabled = disableControls;
|
mControlsDisabled = disableControls;
|
||||||
mGamepadPreviewMode = gamepadPreviewMode;
|
mGamepadPreviewMode = mActionManager->getPreviewDelay() == 1.f;
|
||||||
|
|
||||||
if (mGuiCursorEnabled && !(mJoystickLastUsed && !mGamepadGuiCursorEnabled))
|
if (mGuiCursorEnabled && !(mJoystickLastUsed && !mGamepadGuiCursorEnabled))
|
||||||
{
|
{
|
||||||
|
@ -153,10 +153,10 @@ namespace MWInput
|
||||||
}
|
}
|
||||||
|
|
||||||
if (triedToMove)
|
if (triedToMove)
|
||||||
|
{
|
||||||
mJoystickLastUsed = true;
|
mJoystickLastUsed = true;
|
||||||
|
|
||||||
if (triedToMove)
|
|
||||||
MWBase::Environment::get().getInputManager()->resetIdleTime();
|
MWBase::Environment::get().getInputManager()->resetIdleTime();
|
||||||
|
}
|
||||||
|
|
||||||
static const bool isToggleSneak = Settings::Manager::getBool("toggle sneak", "Input");
|
static const bool isToggleSneak = Settings::Manager::getBool("toggle sneak", "Input");
|
||||||
if (!isToggleSneak)
|
if (!isToggleSneak)
|
||||||
|
@ -208,7 +208,7 @@ namespace MWInput
|
||||||
return triedToMove;
|
return triedToMove;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ControllerManager::buttonPressed(int deviceID, const SDL_ControllerButtonEvent &arg )
|
void ControllerManager::buttonPressed(int deviceID, const SDL_ControllerButtonEvent &arg)
|
||||||
{
|
{
|
||||||
if (!mJoystickEnabled || mInputBinder->detectingBindingState())
|
if (!mJoystickEnabled || mInputBinder->detectingBindingState())
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -31,7 +31,7 @@ namespace MWInput
|
||||||
|
|
||||||
void clear();
|
void clear();
|
||||||
|
|
||||||
bool update(float dt, bool disableControls, bool gamepadPreviewMode);
|
bool update(float dt, bool disableControls);
|
||||||
|
|
||||||
virtual void buttonPressed(int deviceID, const SDL_ControllerButtonEvent &arg);
|
virtual void buttonPressed(int deviceID, const SDL_ControllerButtonEvent &arg);
|
||||||
virtual void buttonReleased(int deviceID, const SDL_ControllerButtonEvent &arg);
|
virtual void buttonReleased(int deviceID, const SDL_ControllerButtonEvent &arg);
|
||||||
|
|
|
@ -46,17 +46,12 @@ namespace MWInput
|
||||||
osgViewer::ScreenCaptureHandler::CaptureOperation *screenCaptureOperation,
|
osgViewer::ScreenCaptureHandler::CaptureOperation *screenCaptureOperation,
|
||||||
const std::string& userFile, bool userFileExists, const std::string& userControllerBindingsFile,
|
const std::string& userFile, bool userFileExists, const std::string& userControllerBindingsFile,
|
||||||
const std::string& controllerBindingsFile, bool grab)
|
const std::string& controllerBindingsFile, bool grab)
|
||||||
: mWindow(window)
|
: mWindowVisible(true)
|
||||||
, mWindowVisible(true)
|
|
||||||
, mUserFile(userFile)
|
, mUserFile(userFile)
|
||||||
, mDragDrop(false)
|
, mDragDrop(false)
|
||||||
, mGrabCursor (Settings::Manager::getBool("grab cursor", "Input"))
|
, mGrabCursor(Settings::Manager::getBool("grab cursor", "Input"))
|
||||||
, mPreviewPOVDelay(0.f)
|
|
||||||
, mTimeIdle(0.f)
|
|
||||||
, mGuiCursorEnabled(true)
|
, mGuiCursorEnabled(true)
|
||||||
, mDetectingKeyboard(false)
|
, mDetectingKeyboard(false)
|
||||||
, mOverencumberedMessageDelay(0.f)
|
|
||||||
, mAttemptJump(false)
|
|
||||||
, mFakeDeviceID(1)
|
, mFakeDeviceID(1)
|
||||||
{
|
{
|
||||||
mInputWrapper = new SDLUtil::InputWrapper(window, viewer, grab);
|
mInputWrapper = new SDLUtil::InputWrapper(window, viewer, grab);
|
||||||
|
@ -204,7 +199,7 @@ namespace MWInput
|
||||||
action = A_CycleSpellLeft;
|
action = A_CycleSpellLeft;
|
||||||
|
|
||||||
else
|
else
|
||||||
mAttemptJump = (currentValue == 1.0 && previousValue == 0.0);
|
mActionManager->setAttemptJump(currentValue == 1.0 && previousValue == 0.0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -252,82 +247,11 @@ namespace MWInput
|
||||||
|
|
||||||
updateCursorMode();
|
updateCursorMode();
|
||||||
|
|
||||||
bool controllerMove = mControllerManager->update(dt, disableControls, mPreviewPOVDelay == 1.f);
|
bool controllerMove = mControllerManager->update(dt, disableControls);
|
||||||
bool keyboardMove = mKeyboardManager->update(dt, disableControls);
|
mKeyboardManager->update(dt, disableControls);
|
||||||
|
mMouseManager->update(dt, disableControls);
|
||||||
if (mMouseManager->update(dt, disableControls))
|
mSensorManager->update(dt, mGuiCursorEnabled);
|
||||||
resetIdleTime();
|
mActionManager->update(dt, controllerMove);
|
||||||
|
|
||||||
if (mSensorManager->update(dt, mGuiCursorEnabled, mControlSwitch["playerlooking"]))
|
|
||||||
resetIdleTime();
|
|
||||||
|
|
||||||
// Disable movement in Gui mode
|
|
||||||
if (!(MWBase::Environment::get().getWindowManager()->isGuiMode()
|
|
||||||
|| MWBase::Environment::get().getStateManager()->getState() != MWBase::StateManager::State_Running))
|
|
||||||
{
|
|
||||||
if (mControlSwitch["playercontrols"])
|
|
||||||
{
|
|
||||||
MWWorld::Player& player = MWBase::Environment::get().getWorld()->getPlayer();
|
|
||||||
|
|
||||||
bool attemptToJump = false;
|
|
||||||
if (mAttemptJump && mControlSwitch["playerjumping"])
|
|
||||||
{
|
|
||||||
player.setUpDown(1);
|
|
||||||
attemptToJump = true;
|
|
||||||
mOverencumberedMessageDelay = 0.f;
|
|
||||||
}
|
|
||||||
|
|
||||||
// if player tried to start moving, but can't (due to being overencumbered), display a notification.
|
|
||||||
if (controllerMove || keyboardMove || attemptToJump)
|
|
||||||
{
|
|
||||||
MWWorld::Ptr playerPtr = MWBase::Environment::get().getWorld ()->getPlayerPtr();
|
|
||||||
mOverencumberedMessageDelay -= dt;
|
|
||||||
if (playerPtr.getClass().getEncumbrance(playerPtr) > playerPtr.getClass().getCapacity(playerPtr))
|
|
||||||
{
|
|
||||||
player.setAutoMove (false);
|
|
||||||
if (mOverencumberedMessageDelay <= 0)
|
|
||||||
{
|
|
||||||
MWBase::Environment::get().getWindowManager ()->messageBox("#{sNotifyMessage59}");
|
|
||||||
mOverencumberedMessageDelay = 1.0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mControlSwitch["playerviewswitch"]) {
|
|
||||||
|
|
||||||
if (actionIsActive(A_TogglePOV)) {
|
|
||||||
if (mPreviewPOVDelay <= 0.5 &&
|
|
||||||
(mPreviewPOVDelay += dt) > 0.5)
|
|
||||||
{
|
|
||||||
mPreviewPOVDelay = 1.f;
|
|
||||||
MWBase::Environment::get().getWorld()->togglePreviewMode(true);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
//disable preview mode
|
|
||||||
MWBase::Environment::get().getWorld()->togglePreviewMode(false);
|
|
||||||
if (mPreviewPOVDelay > 0.f && mPreviewPOVDelay <= 0.5) {
|
|
||||||
MWBase::Environment::get().getWorld()->togglePOV();
|
|
||||||
}
|
|
||||||
mPreviewPOVDelay = 0.f;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (actionIsActive(A_MoveForward) ||
|
|
||||||
actionIsActive(A_MoveBackward) ||
|
|
||||||
actionIsActive(A_MoveLeft) ||
|
|
||||||
actionIsActive(A_MoveRight) ||
|
|
||||||
actionIsActive(A_Jump) ||
|
|
||||||
actionIsActive(A_Sneak) ||
|
|
||||||
actionIsActive(A_TogglePOV) ||
|
|
||||||
actionIsActive(A_ZoomIn) ||
|
|
||||||
actionIsActive(A_ZoomOut) )
|
|
||||||
{
|
|
||||||
resetIdleTime();
|
|
||||||
} else {
|
|
||||||
updateIdleTime(dt);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
mAttemptJump = false; // Can only jump on first frame input is on
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void InputManager::setDragDrop(bool dragDrop)
|
void InputManager::setDragDrop(bool dragDrop)
|
||||||
|
@ -453,21 +377,7 @@ namespace MWInput
|
||||||
|
|
||||||
void InputManager::resetIdleTime()
|
void InputManager::resetIdleTime()
|
||||||
{
|
{
|
||||||
if (mTimeIdle < 0)
|
mActionManager->resetIdleTime();
|
||||||
MWBase::Environment::get().getWorld()->toggleVanityMode(false);
|
|
||||||
mTimeIdle = 0.f;
|
|
||||||
}
|
|
||||||
|
|
||||||
void InputManager::updateIdleTime(float dt)
|
|
||||||
{
|
|
||||||
static const float vanityDelay = MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>()
|
|
||||||
.find("fVanityDelay")->mValue.getFloat();
|
|
||||||
if (mTimeIdle >= 0.f)
|
|
||||||
mTimeIdle += dt;
|
|
||||||
if (mTimeIdle > vanityDelay) {
|
|
||||||
MWBase::Environment::get().getWorld()->toggleVanityMode(true);
|
|
||||||
mTimeIdle = -1.f;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool InputManager::actionIsActive (int id)
|
bool InputManager::actionIsActive (int id)
|
||||||
|
|
|
@ -146,7 +146,6 @@ namespace MWInput
|
||||||
virtual void resetIdleTime();
|
virtual void resetIdleTime();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
SDL_Window* mWindow;
|
|
||||||
bool mWindowVisible;
|
bool mWindowVisible;
|
||||||
|
|
||||||
ICS::InputControlSystem* mInputBinder;
|
ICS::InputControlSystem* mInputBinder;
|
||||||
|
@ -160,17 +159,10 @@ namespace MWInput
|
||||||
|
|
||||||
bool mGrabCursor;
|
bool mGrabCursor;
|
||||||
|
|
||||||
float mPreviewPOVDelay;
|
|
||||||
float mTimeIdle;
|
|
||||||
|
|
||||||
bool mGuiCursorEnabled;
|
bool mGuiCursorEnabled;
|
||||||
|
|
||||||
bool mDetectingKeyboard;
|
bool mDetectingKeyboard;
|
||||||
|
|
||||||
float mOverencumberedMessageDelay;
|
|
||||||
|
|
||||||
bool mAttemptJump;
|
|
||||||
|
|
||||||
std::map<std::string, bool> mControlSwitch;
|
std::map<std::string, bool> mControlSwitch;
|
||||||
|
|
||||||
ActionManager* mActionManager;
|
ActionManager* mActionManager;
|
||||||
|
@ -181,8 +173,6 @@ namespace MWInput
|
||||||
|
|
||||||
void convertMousePosForMyGUI(int& x, int& y);
|
void convertMousePosForMyGUI(int& x, int& y);
|
||||||
|
|
||||||
void updateIdleTime(float dt);
|
|
||||||
|
|
||||||
void handleGuiArrowKey(int action);
|
void handleGuiArrowKey(int action);
|
||||||
|
|
||||||
void updateCursorMode();
|
void updateCursorMode();
|
||||||
|
|
|
@ -27,70 +27,9 @@ namespace MWInput
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
bool KeyboardManager::update(float dt, bool disableControls)
|
void KeyboardManager::update(float dt, bool disableControls)
|
||||||
{
|
{
|
||||||
mControlsDisabled = disableControls;
|
mControlsDisabled = disableControls;
|
||||||
|
|
||||||
// Disable movement in Gui mode
|
|
||||||
if (MWBase::Environment::get().getWindowManager()->isGuiMode()
|
|
||||||
|| MWBase::Environment::get().getStateManager()->getState() != MWBase::StateManager::State_Running)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Configure player movement according to keyboard input. Actual movement will
|
|
||||||
// be done in the physics system.
|
|
||||||
if (!MWBase::Environment::get().getInputManager()->getControlSwitch("playercontrols"))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool triedToMove = false;
|
|
||||||
bool alwaysRunAllowed = false;
|
|
||||||
|
|
||||||
MWWorld::Player& player = MWBase::Environment::get().getWorld()->getPlayer();
|
|
||||||
|
|
||||||
if (actionIsActive(A_MoveLeft) != actionIsActive(A_MoveRight))
|
|
||||||
{
|
|
||||||
alwaysRunAllowed = true;
|
|
||||||
triedToMove = true;
|
|
||||||
player.setLeftRight (actionIsActive(A_MoveRight) ? 1 : -1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (actionIsActive(A_MoveForward) != actionIsActive(A_MoveBackward))
|
|
||||||
{
|
|
||||||
alwaysRunAllowed = true;
|
|
||||||
triedToMove = true;
|
|
||||||
player.setAutoMove (false);
|
|
||||||
player.setForwardBackward (actionIsActive(A_MoveForward) ? 1 : -1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (player.getAutoMove())
|
|
||||||
{
|
|
||||||
alwaysRunAllowed = true;
|
|
||||||
triedToMove = true;
|
|
||||||
player.setForwardBackward (1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (triedToMove)
|
|
||||||
MWBase::Environment::get().getInputManager()->resetIdleTime();
|
|
||||||
|
|
||||||
static const bool isToggleSneak = Settings::Manager::getBool("toggle sneak", "Input");
|
|
||||||
if (!isToggleSneak)
|
|
||||||
{
|
|
||||||
if(!MWBase::Environment::get().getInputManager()->joystickLastUsed())
|
|
||||||
player.setSneak(actionIsActive(A_Sneak));
|
|
||||||
}
|
|
||||||
|
|
||||||
float xAxis = mInputBinder->getChannel(A_MoveLeftRight)->getValue();
|
|
||||||
float yAxis = mInputBinder->getChannel(A_MoveForwardBackward)->getValue();
|
|
||||||
bool isRunning = xAxis > .75 || xAxis < .25 || yAxis > .75 || yAxis < .25;
|
|
||||||
if ((mActionManager->isAlwaysRunActive() && alwaysRunAllowed) || isRunning)
|
|
||||||
player.setRunState(!actionIsActive(A_Run));
|
|
||||||
else
|
|
||||||
player.setRunState(actionIsActive(A_Run));
|
|
||||||
|
|
||||||
return triedToMove;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool KeyboardManager::actionIsActive (int id)
|
bool KeyboardManager::actionIsActive (int id)
|
||||||
|
|
|
@ -25,7 +25,7 @@ namespace MWInput
|
||||||
|
|
||||||
virtual ~KeyboardManager() = default;
|
virtual ~KeyboardManager() = default;
|
||||||
|
|
||||||
bool update(float dt, bool disableControls);
|
void update(float dt, bool disableControls);
|
||||||
|
|
||||||
virtual void textInput(const SDL_TextInputEvent &arg);
|
virtual void textInput(const SDL_TextInputEvent &arg);
|
||||||
virtual void keyPressed(const SDL_KeyboardEvent &arg);
|
virtual void keyPressed(const SDL_KeyboardEvent &arg);
|
||||||
|
|
|
@ -173,17 +173,17 @@ namespace MWInput
|
||||||
mInputBinder->mousePressed (arg, id);
|
mInputBinder->mousePressed (arg, id);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MouseManager::update(float dt, bool disableControls)
|
void MouseManager::update(float dt, bool disableControls)
|
||||||
{
|
{
|
||||||
mControlsDisabled = disableControls;
|
mControlsDisabled = disableControls;
|
||||||
|
|
||||||
if (!mMouseLookEnabled)
|
if (!mMouseLookEnabled)
|
||||||
return false;
|
return;
|
||||||
|
|
||||||
float xAxis = mInputBinder->getChannel(A_LookLeftRight)->getValue()*2.0f-1.0f;
|
float xAxis = mInputBinder->getChannel(A_LookLeftRight)->getValue()*2.0f-1.0f;
|
||||||
float yAxis = mInputBinder->getChannel(A_LookUpDown)->getValue()*2.0f-1.0f;
|
float yAxis = mInputBinder->getChannel(A_LookUpDown)->getValue()*2.0f-1.0f;
|
||||||
if (xAxis == 0 && yAxis == 0)
|
if (xAxis == 0 && yAxis == 0)
|
||||||
return false;
|
return;
|
||||||
|
|
||||||
float rot[3];
|
float rot[3];
|
||||||
rot[0] = yAxis * (dt * 100.0f) * 10.0f * mCameraSensitivity * (1.0f/256.f) * (mInvertY ? -1 : 1) * mCameraYMultiplier;
|
rot[0] = yAxis * (dt * 100.0f) * 10.0f * mCameraSensitivity * (1.0f/256.f) * (mInvertY ? -1 : 1) * mCameraYMultiplier;
|
||||||
|
@ -198,7 +198,7 @@ namespace MWInput
|
||||||
player.pitch(rot[0]);
|
player.pitch(rot[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
MWBase::Environment::get().getInputManager()->resetIdleTime();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MouseManager::injectMouseButtonPress(Uint8 button)
|
bool MouseManager::injectMouseButtonPress(Uint8 button)
|
||||||
|
|
|
@ -30,7 +30,7 @@ namespace MWInput
|
||||||
|
|
||||||
void clear();
|
void clear();
|
||||||
|
|
||||||
bool update(float dt, bool disableControls);
|
void update(float dt, bool disableControls);
|
||||||
|
|
||||||
virtual void mouseMoved(const SDLUtil::MouseMotionEvent &arg);
|
virtual void mouseMoved(const SDLUtil::MouseMotionEvent &arg);
|
||||||
virtual void mousePressed(const SDL_MouseButtonEvent &arg, Uint8 id);
|
virtual void mousePressed(const SDL_MouseButtonEvent &arg, Uint8 id);
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
#include <components/debug/debuglog.hpp>
|
#include <components/debug/debuglog.hpp>
|
||||||
|
|
||||||
#include "../mwbase/environment.hpp"
|
#include "../mwbase/environment.hpp"
|
||||||
|
#include "../mwbase/inputmanager.hpp"
|
||||||
#include "../mwbase/world.hpp"
|
#include "../mwbase/world.hpp"
|
||||||
|
|
||||||
#include "../mwworld/player.hpp"
|
#include "../mwworld/player.hpp"
|
||||||
|
@ -234,10 +235,10 @@ namespace MWInput
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SensorManager::update(float dt, bool isCursorEnabled, bool isTurningEnabled)
|
void SensorManager::update(float dt, bool isCursorEnabled)
|
||||||
{
|
{
|
||||||
if (mGyroXSpeed == 0.f && mGyroYSpeed == 0.f)
|
if (mGyroXSpeed == 0.f && mGyroYSpeed == 0.f)
|
||||||
return false;
|
return;
|
||||||
|
|
||||||
if (mGyroUpdateTimer > 0.5f)
|
if (mGyroUpdateTimer > 0.5f)
|
||||||
{
|
{
|
||||||
|
@ -246,7 +247,7 @@ namespace MWInput
|
||||||
// Reset current rotation speed and wait for update.
|
// Reset current rotation speed and wait for update.
|
||||||
clear();
|
clear();
|
||||||
mGyroUpdateTimer = 0.f;
|
mGyroUpdateTimer = 0.f;
|
||||||
return false;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
mGyroUpdateTimer += dt;
|
mGyroUpdateTimer += dt;
|
||||||
|
@ -259,16 +260,14 @@ namespace MWInput
|
||||||
rot[2] = mGyroXSpeed * dt * mGyroHSensitivity * 4 * (mInvertX ? -1 : 1);
|
rot[2] = mGyroXSpeed * dt * mGyroHSensitivity * 4 * (mInvertX ? -1 : 1);
|
||||||
|
|
||||||
// Only actually turn player when we're not in vanity mode
|
// Only actually turn player when we're not in vanity mode
|
||||||
if(!MWBase::Environment::get().getWorld()->vanityRotateCamera(rot) && isTurningEnabled)
|
if(!MWBase::Environment::get().getWorld()->vanityRotateCamera(rot) && MWBase::Environment::get().getInputManager()->getControlSwitch("playerlooking"))
|
||||||
{
|
{
|
||||||
MWWorld::Player& player = MWBase::Environment::get().getWorld()->getPlayer();
|
MWWorld::Player& player = MWBase::Environment::get().getWorld()->getPlayer();
|
||||||
player.yaw(rot[2]);
|
player.yaw(rot[2]);
|
||||||
player.pitch(rot[0]);
|
player.pitch(rot[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
MWBase::Environment::get().getInputManager()->resetIdleTime();
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,7 +29,7 @@ namespace MWInput
|
||||||
|
|
||||||
void clear();
|
void clear();
|
||||||
|
|
||||||
bool update(float dt, bool isCursorEnabled, bool isTurningEnabled);
|
void update(float dt, bool isCursorEnabled);
|
||||||
|
|
||||||
virtual void sensorUpdated(const SDL_SensorEvent &arg);
|
virtual void sensorUpdated(const SDL_SensorEvent &arg);
|
||||||
virtual void displayOrientationChanged();
|
virtual void displayOrientationChanged();
|
||||||
|
|
Loading…
Reference in a new issue