From f9d6137a29c0c4b396ba51f27aaaf2b9103b5806 Mon Sep 17 00:00:00 2001 From: Andrei Kortunov Date: Wed, 8 Apr 2020 19:42:25 +0400 Subject: [PATCH] Do not store player reference in the InputManager --- apps/openmw/engine.cpp | 1 - apps/openmw/mwinput/inputmanagerimp.cpp | 72 +++++++++++++------------ apps/openmw/mwinput/inputmanagerimp.hpp | 2 - 3 files changed, 39 insertions(+), 36 deletions(-) diff --git a/apps/openmw/engine.cpp b/apps/openmw/engine.cpp index 7d6348789..efb3c01a3 100644 --- a/apps/openmw/engine.cpp +++ b/apps/openmw/engine.cpp @@ -561,7 +561,6 @@ void OMW::Engine::prepareEngine (Settings::Manager & settings) mFileCollections, mContentFiles, mEncoder, mActivationDistanceOverride, mCellName, mStartupScript, mResDir.string(), mCfgMgr.getUserDataPath().string())); mEnvironment.getWorld()->setupPlayer(); - input->setPlayer(&mEnvironment.getWorld()->getPlayer()); window->setStore(mEnvironment.getWorld()->getStore()); window->initUI(); diff --git a/apps/openmw/mwinput/inputmanagerimp.cpp b/apps/openmw/mwinput/inputmanagerimp.cpp index f332b03af..4376951b5 100644 --- a/apps/openmw/mwinput/inputmanagerimp.cpp +++ b/apps/openmw/mwinput/inputmanagerimp.cpp @@ -47,7 +47,6 @@ namespace MWInput : mWindow(window) , mWindowVisible(true) , mJoystickLastUsed(false) - , mPlayer(nullptr) , mInputManager(nullptr) , mVideoWrapper(nullptr) , mUserFile(userFile) @@ -308,8 +307,9 @@ namespace MWInput else { - MWMechanics::DrawState_ state = MWBase::Environment::get().getWorld()->getPlayer().getDrawState(); - mPlayer->setAttackingOrSpell(currentValue != 0 && state != MWMechanics::DrawState_Nothing); + MWWorld::Player& player = MWBase::Environment::get().getWorld()->getPlayer(); + MWMechanics::DrawState_ state = player.getDrawState(); + player.setAttackingOrSpell(currentValue != 0 && state != MWMechanics::DrawState_Nothing); } } else if (action == A_Jump) @@ -408,6 +408,8 @@ namespace MWInput // be done in the physics system. if (mControlSwitch["playercontrols"]) { + MWWorld::Player& player = MWBase::Environment::get().getWorld()->getPlayer(); + bool triedToMove = false; bool isRunning = false; bool alwaysRunAllowed = false; @@ -418,14 +420,14 @@ namespace MWInput if (xAxis != .5) { triedToMove = true; - mPlayer->setLeftRight((xAxis - 0.5f) * 2); + player.setLeftRight((xAxis - 0.5f) * 2); } if (yAxis != .5) { triedToMove = true; - mPlayer->setAutoMove (false); - mPlayer->setForwardBackward((yAxis - 0.5f) * 2 * -1); + player.setAutoMove (false); + player.setForwardBackward((yAxis - 0.5f) * 2 * -1); } if (triedToMove) @@ -439,22 +441,22 @@ namespace MWInput { alwaysRunAllowed = true; triedToMove = true; - mPlayer->setLeftRight (actionIsActive(A_MoveRight) ? 1 : -1); + player.setLeftRight (actionIsActive(A_MoveRight) ? 1 : -1); } if (actionIsActive(A_MoveForward) != actionIsActive(A_MoveBackward)) { alwaysRunAllowed = true; triedToMove = true; - mPlayer->setAutoMove (false); - mPlayer->setForwardBackward (actionIsActive(A_MoveForward) ? 1 : -1); + player.setAutoMove (false); + player.setForwardBackward (actionIsActive(A_MoveForward) ? 1 : -1); } - if (mPlayer->getAutoMove()) + if (player.getAutoMove()) { alwaysRunAllowed = true; triedToMove = true; - mPlayer->setForwardBackward (1); + player.setForwardBackward (1); } static const bool isToggleSneak = Settings::Manager::getBool("toggle sneak", "Input"); @@ -488,29 +490,29 @@ namespace MWInput } } else - mPlayer->setSneak(actionIsActive(A_Sneak)); + player.setSneak(actionIsActive(A_Sneak)); } if (mAttemptJump && mControlSwitch["playerjumping"]) { - mPlayer->setUpDown (1); + player.setUpDown (1); triedToMove = true; mOverencumberedMessageDelay = 0.f; } if ((mActionManager->isAlwaysRunActive() && alwaysRunAllowed) || isRunning) - mPlayer->setRunState(!actionIsActive(A_Run)); + player.setRunState(!actionIsActive(A_Run)); else - mPlayer->setRunState(actionIsActive(A_Run)); + player.setRunState(actionIsActive(A_Run)); // if player tried to start moving, but can't (due to being overencumbered), display a notification. if (triedToMove) { - MWWorld::Ptr player = MWBase::Environment::get().getWorld ()->getPlayerPtr(); + MWWorld::Ptr playerPtr = MWBase::Environment::get().getWorld ()->getPlayerPtr(); mOverencumberedMessageDelay -= dt; - if (player.getClass().getEncumbrance(player) > player.getClass().getCapacity(player)) + if (playerPtr.getClass().getEncumbrance(playerPtr) > playerPtr.getClass().getCapacity(playerPtr)) { - mPlayer->setAutoMove (false); + player.setAutoMove (false); if (mOverencumberedMessageDelay <= 0) { MWBase::Environment::get().getWindowManager ()->messageBox("#{sNotifyMessage59}"); @@ -633,19 +635,28 @@ namespace MWInput void InputManager::toggleControlSwitch (const std::string& sw, bool value) { + MWWorld::Player& player = MWBase::Environment::get().getWorld()->getPlayer(); + /// \note 7 switches at all, if-else is relevant - if (sw == "playercontrols" && !value) { - mPlayer->setLeftRight(0); - mPlayer->setForwardBackward(0); - mPlayer->setAutoMove(false); - mPlayer->setUpDown(0); - } else if (sw == "playerjumping" && !value) { + if (sw == "playercontrols" && !value) + { + player.setLeftRight(0); + player.setForwardBackward(0); + player.setAutoMove(false); + player.setUpDown(0); + } + else if (sw == "playerjumping" && !value) + { /// \fixme maybe crouching at this time - mPlayer->setUpDown(0); - } else if (sw == "vanitymode") { + player.setUpDown(0); + } + else if (sw == "vanitymode") + { MWBase::Environment::get().getWorld()->allowVanityMode(value); - } else if (sw == "playerlooking" && !value) { - MWBase::Environment::get().getWorld()->rotateObject(mPlayer->getPlayer(), 0.f, 0.f, 0.f); + } + else if (sw == "playerlooking" && !value) + { + MWBase::Environment::get().getWorld()->rotateObject(player.getPlayer(), 0.f, 0.f, 0.f); } mControlSwitch[sw] = value; } @@ -1387,9 +1398,4 @@ namespace MWInput { loadControllerDefaults(true); } - - void InputManager::setPlayer (MWWorld::Player* player) - { - mPlayer = player; - } } diff --git a/apps/openmw/mwinput/inputmanagerimp.hpp b/apps/openmw/mwinput/inputmanagerimp.hpp index 761180f12..da7075e4e 100644 --- a/apps/openmw/mwinput/inputmanagerimp.hpp +++ b/apps/openmw/mwinput/inputmanagerimp.hpp @@ -86,8 +86,6 @@ namespace MWInput virtual void update(float dt, bool disableControls=false, bool disableEvents=false); - void setPlayer (MWWorld::Player* player); - virtual void changeInputMode(bool guiMode); virtual void processChangedSettings(const Settings::CategorySettingVector& changed);