Do not store player reference in the InputManager

This commit is contained in:
Andrei Kortunov 2020-04-08 19:42:25 +04:00
parent ce40294124
commit f9d6137a29
3 changed files with 39 additions and 36 deletions

View File

@ -561,7 +561,6 @@ void OMW::Engine::prepareEngine (Settings::Manager & settings)
mFileCollections, mContentFiles, mEncoder, mActivationDistanceOverride, mCellName, mFileCollections, mContentFiles, mEncoder, mActivationDistanceOverride, mCellName,
mStartupScript, mResDir.string(), mCfgMgr.getUserDataPath().string())); mStartupScript, mResDir.string(), mCfgMgr.getUserDataPath().string()));
mEnvironment.getWorld()->setupPlayer(); mEnvironment.getWorld()->setupPlayer();
input->setPlayer(&mEnvironment.getWorld()->getPlayer());
window->setStore(mEnvironment.getWorld()->getStore()); window->setStore(mEnvironment.getWorld()->getStore());
window->initUI(); window->initUI();

View File

@ -47,7 +47,6 @@ namespace MWInput
: mWindow(window) : mWindow(window)
, mWindowVisible(true) , mWindowVisible(true)
, mJoystickLastUsed(false) , mJoystickLastUsed(false)
, mPlayer(nullptr)
, mInputManager(nullptr) , mInputManager(nullptr)
, mVideoWrapper(nullptr) , mVideoWrapper(nullptr)
, mUserFile(userFile) , mUserFile(userFile)
@ -308,8 +307,9 @@ namespace MWInput
else else
{ {
MWMechanics::DrawState_ state = MWBase::Environment::get().getWorld()->getPlayer().getDrawState(); MWWorld::Player& player = MWBase::Environment::get().getWorld()->getPlayer();
mPlayer->setAttackingOrSpell(currentValue != 0 && state != MWMechanics::DrawState_Nothing); MWMechanics::DrawState_ state = player.getDrawState();
player.setAttackingOrSpell(currentValue != 0 && state != MWMechanics::DrawState_Nothing);
} }
} }
else if (action == A_Jump) else if (action == A_Jump)
@ -408,6 +408,8 @@ namespace MWInput
// be done in the physics system. // be done in the physics system.
if (mControlSwitch["playercontrols"]) if (mControlSwitch["playercontrols"])
{ {
MWWorld::Player& player = MWBase::Environment::get().getWorld()->getPlayer();
bool triedToMove = false; bool triedToMove = false;
bool isRunning = false; bool isRunning = false;
bool alwaysRunAllowed = false; bool alwaysRunAllowed = false;
@ -418,14 +420,14 @@ namespace MWInput
if (xAxis != .5) if (xAxis != .5)
{ {
triedToMove = true; triedToMove = true;
mPlayer->setLeftRight((xAxis - 0.5f) * 2); player.setLeftRight((xAxis - 0.5f) * 2);
} }
if (yAxis != .5) if (yAxis != .5)
{ {
triedToMove = true; triedToMove = true;
mPlayer->setAutoMove (false); player.setAutoMove (false);
mPlayer->setForwardBackward((yAxis - 0.5f) * 2 * -1); player.setForwardBackward((yAxis - 0.5f) * 2 * -1);
} }
if (triedToMove) if (triedToMove)
@ -439,22 +441,22 @@ namespace MWInput
{ {
alwaysRunAllowed = true; alwaysRunAllowed = true;
triedToMove = true; triedToMove = true;
mPlayer->setLeftRight (actionIsActive(A_MoveRight) ? 1 : -1); player.setLeftRight (actionIsActive(A_MoveRight) ? 1 : -1);
} }
if (actionIsActive(A_MoveForward) != actionIsActive(A_MoveBackward)) if (actionIsActive(A_MoveForward) != actionIsActive(A_MoveBackward))
{ {
alwaysRunAllowed = true; alwaysRunAllowed = true;
triedToMove = true; triedToMove = true;
mPlayer->setAutoMove (false); player.setAutoMove (false);
mPlayer->setForwardBackward (actionIsActive(A_MoveForward) ? 1 : -1); player.setForwardBackward (actionIsActive(A_MoveForward) ? 1 : -1);
} }
if (mPlayer->getAutoMove()) if (player.getAutoMove())
{ {
alwaysRunAllowed = true; alwaysRunAllowed = true;
triedToMove = true; triedToMove = true;
mPlayer->setForwardBackward (1); player.setForwardBackward (1);
} }
static const bool isToggleSneak = Settings::Manager::getBool("toggle sneak", "Input"); static const bool isToggleSneak = Settings::Manager::getBool("toggle sneak", "Input");
@ -488,29 +490,29 @@ namespace MWInput
} }
} }
else else
mPlayer->setSneak(actionIsActive(A_Sneak)); player.setSneak(actionIsActive(A_Sneak));
} }
if (mAttemptJump && mControlSwitch["playerjumping"]) if (mAttemptJump && mControlSwitch["playerjumping"])
{ {
mPlayer->setUpDown (1); player.setUpDown (1);
triedToMove = true; triedToMove = true;
mOverencumberedMessageDelay = 0.f; mOverencumberedMessageDelay = 0.f;
} }
if ((mActionManager->isAlwaysRunActive() && alwaysRunAllowed) || isRunning) if ((mActionManager->isAlwaysRunActive() && alwaysRunAllowed) || isRunning)
mPlayer->setRunState(!actionIsActive(A_Run)); player.setRunState(!actionIsActive(A_Run));
else 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 player tried to start moving, but can't (due to being overencumbered), display a notification.
if (triedToMove) if (triedToMove)
{ {
MWWorld::Ptr player = MWBase::Environment::get().getWorld ()->getPlayerPtr(); MWWorld::Ptr playerPtr = MWBase::Environment::get().getWorld ()->getPlayerPtr();
mOverencumberedMessageDelay -= dt; 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) if (mOverencumberedMessageDelay <= 0)
{ {
MWBase::Environment::get().getWindowManager ()->messageBox("#{sNotifyMessage59}"); MWBase::Environment::get().getWindowManager ()->messageBox("#{sNotifyMessage59}");
@ -633,19 +635,28 @@ namespace MWInput
void InputManager::toggleControlSwitch (const std::string& sw, bool value) 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 /// \note 7 switches at all, if-else is relevant
if (sw == "playercontrols" && !value) { if (sw == "playercontrols" && !value)
mPlayer->setLeftRight(0); {
mPlayer->setForwardBackward(0); player.setLeftRight(0);
mPlayer->setAutoMove(false); player.setForwardBackward(0);
mPlayer->setUpDown(0); player.setAutoMove(false);
} else if (sw == "playerjumping" && !value) { player.setUpDown(0);
}
else if (sw == "playerjumping" && !value)
{
/// \fixme maybe crouching at this time /// \fixme maybe crouching at this time
mPlayer->setUpDown(0); player.setUpDown(0);
} else if (sw == "vanitymode") { }
else if (sw == "vanitymode")
{
MWBase::Environment::get().getWorld()->allowVanityMode(value); 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; mControlSwitch[sw] = value;
} }
@ -1387,9 +1398,4 @@ namespace MWInput
{ {
loadControllerDefaults(true); loadControllerDefaults(true);
} }
void InputManager::setPlayer (MWWorld::Player* player)
{
mPlayer = player;
}
} }

View File

@ -86,8 +86,6 @@ namespace MWInput
virtual void update(float dt, bool disableControls=false, bool disableEvents=false); virtual void update(float dt, bool disableControls=false, bool disableEvents=false);
void setPlayer (MWWorld::Player* player);
virtual void changeInputMode(bool guiMode); virtual void changeInputMode(bool guiMode);
virtual void processChangedSettings(const Settings::CategorySettingVector& changed); virtual void processChangedSettings(const Settings::CategorySettingVector& changed);