diff --git a/CHANGELOG.md b/CHANGELOG.md index 7fd1e4d26b..fa84ec10ae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -104,6 +104,7 @@ Bug #4999: Drop instruction behaves differently from vanilla Bug #5001: Possible data race in the Animation::setAlpha() Bug #5004: Werewolves shield their eyes during storm + Bug #5012: "Take all" on owned container generates a messagebox per item Bug #5018: Spell tooltips don't support purely negative magnitudes Bug #5025: Data race in the ICO::setMaximumNumOfObjectsToCompilePerFrame() Bug #5028: Offered price caps are not trading-specific diff --git a/apps/openmw/mwgui/windowmanagerimp.cpp b/apps/openmw/mwgui/windowmanagerimp.cpp index 4a17dea7bc..02bedee869 100644 --- a/apps/openmw/mwgui/windowmanagerimp.cpp +++ b/apps/openmw/mwgui/windowmanagerimp.cpp @@ -175,6 +175,7 @@ namespace MWGui , mHudEnabled(true) , mCursorVisible(true) , mCursorActive(false) + , mPlayerBounty(-1) , mPlayerName() , mPlayerRaceId() , mPlayerAttributes() @@ -1025,6 +1026,18 @@ namespace MWGui if (!gameRunning) return; + // We should display message about crime only once per frame, even if there are several crimes. + // Otherwise we will get message spam when stealing several items via Take All button. + const MWWorld::Ptr player = MWMechanics::getPlayer(); + int currentBounty = player.getClass().getNpcStats(player).getBounty(); + if (currentBounty != mPlayerBounty) + { + if (mPlayerBounty >= 0 && currentBounty > mPlayerBounty) + messageBox("#{sCrimeMessage}"); + + mPlayerBounty = currentBounty; + } + mDragAndDrop->onFrame(); mHud->onFrame(frameDuration); @@ -1773,6 +1786,8 @@ namespace MWGui void WindowManager::clear() { + mPlayerBounty = -1; + for (WindowBase* window : mWindows) window->clear(); diff --git a/apps/openmw/mwgui/windowmanagerimp.hpp b/apps/openmw/mwgui/windowmanagerimp.hpp index e7fc8109d8..0b4307ec49 100644 --- a/apps/openmw/mwgui/windowmanagerimp.hpp +++ b/apps/openmw/mwgui/windowmanagerimp.hpp @@ -462,6 +462,8 @@ namespace MWGui bool mCursorVisible; bool mCursorActive; + int mPlayerBounty; + void setCursorVisible(bool visible); /// \todo get rid of this stuff. Move it to the respective UI element classes, if needed. diff --git a/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp b/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp index c39487493e..7547f086b2 100644 --- a/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp +++ b/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp @@ -1452,7 +1452,6 @@ namespace MWMechanics if (reported) { - MWBase::Environment::get().getWindowManager()->messageBox("#{sCrimeMessage}"); player.getClass().getNpcStats(player).setBounty(player.getClass().getNpcStats(player).getBounty() + arg); @@ -1923,7 +1922,6 @@ namespace MWMechanics { npcStats.setBounty(npcStats.getBounty()+ gmst.find("iWereWolfBounty")->mValue.getInteger()); - windowManager->messageBox("#{sCrimeMessage}"); } } }