From 30ff688c70b706de93454a1b294369a38664eb5b Mon Sep 17 00:00:00 2001 From: kuyondo Date: Wed, 24 Nov 2021 19:35:39 +0800 Subject: [PATCH 1/7] Create only one overencumbered messagebox --- apps/openmw/mwgui/messagebox.cpp | 9 +++++++++ apps/openmw/mwgui/messagebox.hpp | 1 + 2 files changed, 10 insertions(+) diff --git a/apps/openmw/mwgui/messagebox.cpp b/apps/openmw/mwgui/messagebox.cpp index ed6633c983..f77b274f30 100644 --- a/apps/openmw/mwgui/messagebox.cpp +++ b/apps/openmw/mwgui/messagebox.cpp @@ -93,10 +93,19 @@ namespace MWGui void MessageBoxManager::createMessageBox (const std::string& message, bool stat) { + if (message == "#{sNotifyMessage59}") + for (MessageBox* messageBox : mMessageBoxes) + if (messageBox->mIsEncumberedMessage) + { + messageBox->mCurrentTime = 0; + return; + } + MessageBox *box = new MessageBox(*this, message); box->mCurrentTime = 0; std::string realMessage = MyGUI::LanguageManager::getInstance().replaceTags(message); box->mMaxTime = realMessage.length()*mMessageBoxSpeed; + box->mIsEncumberedMessage = (message == "#{sNotifyMessage59}"); if(stat) mStaticMessageBox = box; diff --git a/apps/openmw/mwgui/messagebox.hpp b/apps/openmw/mwgui/messagebox.hpp index 26d26bac56..b7c8e91b99 100644 --- a/apps/openmw/mwgui/messagebox.hpp +++ b/apps/openmw/mwgui/messagebox.hpp @@ -69,6 +69,7 @@ namespace MWGui float mCurrentTime; float mMaxTime; + bool mIsEncumberedMessage; protected: MessageBoxManager& mMessageBoxManager; From 11925b17ea7b28c9cc953527da2a56b886e17fe3 Mon Sep 17 00:00:00 2001 From: kuyondo Date: Wed, 24 Nov 2021 19:39:22 +0800 Subject: [PATCH 2/7] Remove mOverencumberedMessageDelay --- apps/openmw/mwinput/actionmanager.cpp | 9 +-------- apps/openmw/mwinput/actionmanager.hpp | 1 - 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/apps/openmw/mwinput/actionmanager.cpp b/apps/openmw/mwinput/actionmanager.cpp index 59bdc37bb8..3931517fab 100644 --- a/apps/openmw/mwinput/actionmanager.cpp +++ b/apps/openmw/mwinput/actionmanager.cpp @@ -39,7 +39,6 @@ namespace MWInput , mAlwaysRunActive(Settings::Manager::getBool("always run", "Input")) , mSneaking(false) , mAttemptJump(false) - , mOverencumberedMessageDelay(0.f) , mTimeIdle(0.f) { } @@ -88,22 +87,16 @@ namespace MWInput { 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; - } + MWBase::Environment::get().getWindowManager()->messageBox("#{sNotifyMessage59}"); } } diff --git a/apps/openmw/mwinput/actionmanager.hpp b/apps/openmw/mwinput/actionmanager.hpp index 4141767bcc..4c51139d46 100644 --- a/apps/openmw/mwinput/actionmanager.hpp +++ b/apps/openmw/mwinput/actionmanager.hpp @@ -67,7 +67,6 @@ namespace MWInput bool mSneaking; bool mAttemptJump; - float mOverencumberedMessageDelay; float mTimeIdle; }; } From 1f2311538dc344cd418ef682cbe2806bf342b110 Mon Sep 17 00:00:00 2001 From: kuyondo Date: Fri, 26 Nov 2021 05:20:58 +0800 Subject: [PATCH 3/7] vanilla style messagebox 2 --- apps/openmw/mwbase/windowmanager.hpp | 2 ++ apps/openmw/mwgui/messagebox.cpp | 11 +++++++++++ apps/openmw/mwgui/messagebox.hpp | 5 ++++- apps/openmw/mwgui/windowmanagerimp.cpp | 5 +++++ apps/openmw/mwgui/windowmanagerimp.hpp | 1 + apps/openmw/mwinput/actionmanager.cpp | 17 +++++++++++------ apps/openmw/mwinput/actionmanager.hpp | 1 - 7 files changed, 34 insertions(+), 8 deletions(-) diff --git a/apps/openmw/mwbase/windowmanager.hpp b/apps/openmw/mwbase/windowmanager.hpp index 961a63ac79..6a05a71703 100644 --- a/apps/openmw/mwbase/windowmanager.hpp +++ b/apps/openmw/mwbase/windowmanager.hpp @@ -69,6 +69,7 @@ namespace MWGui class DialogueWindow; class WindowModal; class JailScreen; + class MessageBox; enum ShowInDialogueMode { ShowInDialogueMode_IfPossible, @@ -145,6 +146,7 @@ namespace MWBase virtual MWGui::CountDialog* getCountDialog() = 0; virtual MWGui::ConfirmationDialog* getConfirmationDialog() = 0; virtual MWGui::TradeWindow* getTradeWindow() = 0; + virtual std::vector getActiveMessageBoxes() = 0; /// Make the player use an item, while updating GUI state accordingly virtual void useItem(const MWWorld::Ptr& item, bool force=false) = 0; diff --git a/apps/openmw/mwgui/messagebox.cpp b/apps/openmw/mwgui/messagebox.cpp index ed6633c983..738d28e189 100644 --- a/apps/openmw/mwgui/messagebox.cpp +++ b/apps/openmw/mwgui/messagebox.cpp @@ -161,6 +161,12 @@ namespace MWGui return false; } + std::vector MessageBoxManager::getActiveMessageBoxes() + { + return mMessageBoxes; + } + + int MessageBoxManager::readPressedButton (bool reset) { int pressed = mLastButtonPressed; @@ -202,6 +208,11 @@ namespace MWGui mMainWidget->setPosition(pos); } + std::string MessageBox::getMessage() + { + return mMessage; + } + int MessageBox::getHeight () { return mMainWidget->getHeight()+mNextBoxPadding; diff --git a/apps/openmw/mwgui/messagebox.hpp b/apps/openmw/mwgui/messagebox.hpp index 26d26bac56..746d558e6a 100644 --- a/apps/openmw/mwgui/messagebox.hpp +++ b/apps/openmw/mwgui/messagebox.hpp @@ -49,6 +49,8 @@ namespace MWGui void setVisible(bool value); + std::vector getActiveMessageBoxes(); + private: std::vector mMessageBoxes; InteractiveMessageBox* mInterMessageBoxe; @@ -63,6 +65,7 @@ namespace MWGui public: MessageBox (MessageBoxManager& parMessageBoxManager, const std::string& message); void setMessage (const std::string& message); + std::string getMessage(); int getHeight (); void update (int height); void setVisible(bool value); @@ -72,7 +75,7 @@ namespace MWGui protected: MessageBoxManager& mMessageBoxManager; - const std::string& mMessage; + const std::string mMessage; MyGUI::EditBox* mMessageWidget; int mBottomPadding; int mNextBoxPadding; diff --git a/apps/openmw/mwgui/windowmanagerimp.cpp b/apps/openmw/mwgui/windowmanagerimp.cpp index a935d7f900..28a19a63ef 100644 --- a/apps/openmw/mwgui/windowmanagerimp.cpp +++ b/apps/openmw/mwgui/windowmanagerimp.cpp @@ -771,6 +771,11 @@ namespace MWGui mMessageBoxManager->removeStaticMessageBox(); } + std::vector WindowManager::getActiveMessageBoxes() + { + return mMessageBoxManager->getActiveMessageBoxes(); + } + int WindowManager::readPressedButton () { return mMessageBoxManager->readPressedButton(); diff --git a/apps/openmw/mwgui/windowmanagerimp.hpp b/apps/openmw/mwgui/windowmanagerimp.hpp index 9ec79e0c82..a4bc266a86 100644 --- a/apps/openmw/mwgui/windowmanagerimp.hpp +++ b/apps/openmw/mwgui/windowmanagerimp.hpp @@ -187,6 +187,7 @@ namespace MWGui MWGui::CountDialog* getCountDialog() override; MWGui::ConfirmationDialog* getConfirmationDialog() override; MWGui::TradeWindow* getTradeWindow() override; + std::vector getActiveMessageBoxes() override; /// Make the player use an item, while updating GUI state accordingly void useItem(const MWWorld::Ptr& item, bool bypassBeastRestrictions=false) override; diff --git a/apps/openmw/mwinput/actionmanager.cpp b/apps/openmw/mwinput/actionmanager.cpp index 59bdc37bb8..180f3aa2fb 100644 --- a/apps/openmw/mwinput/actionmanager.cpp +++ b/apps/openmw/mwinput/actionmanager.cpp @@ -22,6 +22,8 @@ #include "../mwmechanics/npcstats.hpp" #include "../mwmechanics/actorutil.hpp" +#include "../mwgui/messagebox.hpp" + #include "actions.hpp" #include "bindingsmanager.hpp" @@ -39,7 +41,6 @@ namespace MWInput , mAlwaysRunActive(Settings::Manager::getBool("always run", "Input")) , mSneaking(false) , mAttemptJump(false) - , mOverencumberedMessageDelay(0.f) , mTimeIdle(0.f) { } @@ -88,22 +89,26 @@ namespace MWInput { 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) + std::vector msgboxs = MWBase::Environment::get().getWindowManager()->getActiveMessageBoxes(); + std::vector::iterator it = std::find_if(msgboxs.begin(), msgboxs.end(), [](MWGui::MessageBox*& msg) { + return (msg->getMessage() == "#{sNotifyMessage59}"); + }); + + // if an overencumbered messagebox is already present, reset its expiry timer, otherwise create new one. + if (it != msgboxs.end()) + (*it)->mCurrentTime = 0; + else MWBase::Environment::get().getWindowManager()->messageBox("#{sNotifyMessage59}"); - mOverencumberedMessageDelay = 1.0; - } } } diff --git a/apps/openmw/mwinput/actionmanager.hpp b/apps/openmw/mwinput/actionmanager.hpp index 4141767bcc..4c51139d46 100644 --- a/apps/openmw/mwinput/actionmanager.hpp +++ b/apps/openmw/mwinput/actionmanager.hpp @@ -67,7 +67,6 @@ namespace MWInput bool mSneaking; bool mAttemptJump; - float mOverencumberedMessageDelay; float mTimeIdle; }; } From df9f601ed74aef143b1487da34906e685e530a5b Mon Sep 17 00:00:00 2001 From: kuyondo Date: Sun, 28 Nov 2021 02:22:34 +0800 Subject: [PATCH 4/7] initialize constants --- apps/openmw/mwbase/windowmanager.hpp | 2 +- apps/openmw/mwgui/messagebox.cpp | 4 ++-- apps/openmw/mwgui/messagebox.hpp | 4 ++-- apps/openmw/mwgui/windowmanagerimp.cpp | 2 +- apps/openmw/mwgui/windowmanagerimp.hpp | 2 +- apps/openmw/mwinput/actionmanager.cpp | 7 ++++--- apps/openmw/mwinput/actionmanager.hpp | 2 ++ 7 files changed, 13 insertions(+), 10 deletions(-) diff --git a/apps/openmw/mwbase/windowmanager.hpp b/apps/openmw/mwbase/windowmanager.hpp index 6a05a71703..e7d22bef92 100644 --- a/apps/openmw/mwbase/windowmanager.hpp +++ b/apps/openmw/mwbase/windowmanager.hpp @@ -146,7 +146,7 @@ namespace MWBase virtual MWGui::CountDialog* getCountDialog() = 0; virtual MWGui::ConfirmationDialog* getConfirmationDialog() = 0; virtual MWGui::TradeWindow* getTradeWindow() = 0; - virtual std::vector getActiveMessageBoxes() = 0; + virtual const std::vector getActiveMessageBoxes() = 0; /// Make the player use an item, while updating GUI state accordingly virtual void useItem(const MWWorld::Ptr& item, bool force=false) = 0; diff --git a/apps/openmw/mwgui/messagebox.cpp b/apps/openmw/mwgui/messagebox.cpp index 738d28e189..fa9a8007b7 100644 --- a/apps/openmw/mwgui/messagebox.cpp +++ b/apps/openmw/mwgui/messagebox.cpp @@ -161,7 +161,7 @@ namespace MWGui return false; } - std::vector MessageBoxManager::getActiveMessageBoxes() + const std::vector MessageBoxManager::getActiveMessageBoxes() { return mMessageBoxes; } @@ -208,7 +208,7 @@ namespace MWGui mMainWidget->setPosition(pos); } - std::string MessageBox::getMessage() + const std::string MessageBox::getMessage() { return mMessage; } diff --git a/apps/openmw/mwgui/messagebox.hpp b/apps/openmw/mwgui/messagebox.hpp index 746d558e6a..e01c54b9a5 100644 --- a/apps/openmw/mwgui/messagebox.hpp +++ b/apps/openmw/mwgui/messagebox.hpp @@ -49,7 +49,7 @@ namespace MWGui void setVisible(bool value); - std::vector getActiveMessageBoxes(); + const std::vector getActiveMessageBoxes(); private: std::vector mMessageBoxes; @@ -65,7 +65,7 @@ namespace MWGui public: MessageBox (MessageBoxManager& parMessageBoxManager, const std::string& message); void setMessage (const std::string& message); - std::string getMessage(); + const std::string getMessage(); int getHeight (); void update (int height); void setVisible(bool value); diff --git a/apps/openmw/mwgui/windowmanagerimp.cpp b/apps/openmw/mwgui/windowmanagerimp.cpp index 28a19a63ef..2eff1f6c84 100644 --- a/apps/openmw/mwgui/windowmanagerimp.cpp +++ b/apps/openmw/mwgui/windowmanagerimp.cpp @@ -771,7 +771,7 @@ namespace MWGui mMessageBoxManager->removeStaticMessageBox(); } - std::vector WindowManager::getActiveMessageBoxes() + const std::vector WindowManager::getActiveMessageBoxes() { return mMessageBoxManager->getActiveMessageBoxes(); } diff --git a/apps/openmw/mwgui/windowmanagerimp.hpp b/apps/openmw/mwgui/windowmanagerimp.hpp index a4bc266a86..10577c8485 100644 --- a/apps/openmw/mwgui/windowmanagerimp.hpp +++ b/apps/openmw/mwgui/windowmanagerimp.hpp @@ -187,7 +187,7 @@ namespace MWGui MWGui::CountDialog* getCountDialog() override; MWGui::ConfirmationDialog* getConfirmationDialog() override; MWGui::TradeWindow* getTradeWindow() override; - std::vector getActiveMessageBoxes() override; + const std::vector getActiveMessageBoxes() override; /// Make the player use an item, while updating GUI state accordingly void useItem(const MWWorld::Ptr& item, bool bypassBeastRestrictions=false) override; diff --git a/apps/openmw/mwinput/actionmanager.cpp b/apps/openmw/mwinput/actionmanager.cpp index 180f3aa2fb..84bdc7d12b 100644 --- a/apps/openmw/mwinput/actionmanager.cpp +++ b/apps/openmw/mwinput/actionmanager.cpp @@ -42,6 +42,7 @@ namespace MWInput , mSneaking(false) , mAttemptJump(false) , mTimeIdle(0.f) + , mOverencumberedMessage("#{sNotifyMessage59}") { } @@ -99,16 +100,16 @@ namespace MWInput { player.setAutoMove (false); std::vector msgboxs = MWBase::Environment::get().getWindowManager()->getActiveMessageBoxes(); - std::vector::iterator it = std::find_if(msgboxs.begin(), msgboxs.end(), [](MWGui::MessageBox*& msg) + const std::vector::iterator it = std::find_if(msgboxs.begin(), msgboxs.end(), [=](MWGui::MessageBox*& msgbox) { - return (msg->getMessage() == "#{sNotifyMessage59}"); + return (msgbox->getMessage() == mOverencumberedMessage); }); // if an overencumbered messagebox is already present, reset its expiry timer, otherwise create new one. if (it != msgboxs.end()) (*it)->mCurrentTime = 0; else - MWBase::Environment::get().getWindowManager()->messageBox("#{sNotifyMessage59}"); + MWBase::Environment::get().getWindowManager()->messageBox(mOverencumberedMessage); } } diff --git a/apps/openmw/mwinput/actionmanager.hpp b/apps/openmw/mwinput/actionmanager.hpp index 4c51139d46..b3deaed20e 100644 --- a/apps/openmw/mwinput/actionmanager.hpp +++ b/apps/openmw/mwinput/actionmanager.hpp @@ -67,6 +67,8 @@ namespace MWInput bool mSneaking; bool mAttemptJump; + const std::string mOverencumberedMessage; + float mTimeIdle; }; } From 6e43206d690c14f57242fdbe7ebaf201e44d33d8 Mon Sep 17 00:00:00 2001 From: kuyondo Date: Sun, 28 Nov 2021 04:58:49 +0800 Subject: [PATCH 5/7] remove empty/redundant lines --- apps/openmw/mwgui/messagebox.cpp | 11 ----------- apps/openmw/mwgui/messagebox.hpp | 1 - 2 files changed, 12 deletions(-) diff --git a/apps/openmw/mwgui/messagebox.cpp b/apps/openmw/mwgui/messagebox.cpp index 1eee2bb857..ef9ad73437 100644 --- a/apps/openmw/mwgui/messagebox.cpp +++ b/apps/openmw/mwgui/messagebox.cpp @@ -93,19 +93,10 @@ namespace MWGui void MessageBoxManager::createMessageBox (const std::string& message, bool stat) { - if (message == "#{sNotifyMessage59}") - for (MessageBox* messageBox : mMessageBoxes) - if (messageBox->mIsEncumberedMessage) - { - messageBox->mCurrentTime = 0; - return; - } - MessageBox *box = new MessageBox(*this, message); box->mCurrentTime = 0; std::string realMessage = MyGUI::LanguageManager::getInstance().replaceTags(message); box->mMaxTime = realMessage.length()*mMessageBoxSpeed; - box->mIsEncumberedMessage = (message == "#{sNotifyMessage59}"); if(stat) mStaticMessageBox = box; @@ -154,7 +145,6 @@ namespace MWGui return mInterMessageBoxe != nullptr; } - bool MessageBoxManager::removeMessageBox (MessageBox *msgbox) { std::vector::iterator it; @@ -175,7 +165,6 @@ namespace MWGui return mMessageBoxes; } - int MessageBoxManager::readPressedButton (bool reset) { int pressed = mLastButtonPressed; diff --git a/apps/openmw/mwgui/messagebox.hpp b/apps/openmw/mwgui/messagebox.hpp index 6a4cda948e..e01c54b9a5 100644 --- a/apps/openmw/mwgui/messagebox.hpp +++ b/apps/openmw/mwgui/messagebox.hpp @@ -72,7 +72,6 @@ namespace MWGui float mCurrentTime; float mMaxTime; - bool mIsEncumberedMessage; protected: MessageBoxManager& mMessageBoxManager; From 2fce89e64fdc170ab086283240862c289109a61d Mon Sep 17 00:00:00 2001 From: kuyondo Date: Tue, 14 Dec 2021 22:40:05 +0800 Subject: [PATCH 6/7] changes --- apps/openmw/mwgui/messagebox.cpp | 5 ----- apps/openmw/mwgui/messagebox.hpp | 4 ++-- apps/openmw/mwinput/actionmanager.cpp | 7 +++---- apps/openmw/mwinput/actionmanager.hpp | 2 -- 4 files changed, 5 insertions(+), 13 deletions(-) diff --git a/apps/openmw/mwgui/messagebox.cpp b/apps/openmw/mwgui/messagebox.cpp index ef9ad73437..890406cd12 100644 --- a/apps/openmw/mwgui/messagebox.cpp +++ b/apps/openmw/mwgui/messagebox.cpp @@ -206,11 +206,6 @@ namespace MWGui mMainWidget->setPosition(pos); } - const std::string MessageBox::getMessage() - { - return mMessage; - } - int MessageBox::getHeight () { return mMainWidget->getHeight()+mNextBoxPadding; diff --git a/apps/openmw/mwgui/messagebox.hpp b/apps/openmw/mwgui/messagebox.hpp index e01c54b9a5..d46d31d938 100644 --- a/apps/openmw/mwgui/messagebox.hpp +++ b/apps/openmw/mwgui/messagebox.hpp @@ -65,7 +65,7 @@ namespace MWGui public: MessageBox (MessageBoxManager& parMessageBoxManager, const std::string& message); void setMessage (const std::string& message); - const std::string getMessage(); + const std::string& getMessage() { return mMessage; }; int getHeight (); void update (int height); void setVisible(bool value); @@ -75,7 +75,7 @@ namespace MWGui protected: MessageBoxManager& mMessageBoxManager; - const std::string mMessage; + std::string mMessage; MyGUI::EditBox* mMessageWidget; int mBottomPadding; int mNextBoxPadding; diff --git a/apps/openmw/mwinput/actionmanager.cpp b/apps/openmw/mwinput/actionmanager.cpp index 84bdc7d12b..63b0a197a7 100644 --- a/apps/openmw/mwinput/actionmanager.cpp +++ b/apps/openmw/mwinput/actionmanager.cpp @@ -42,7 +42,6 @@ namespace MWInput , mSneaking(false) , mAttemptJump(false) , mTimeIdle(0.f) - , mOverencumberedMessage("#{sNotifyMessage59}") { } @@ -100,16 +99,16 @@ namespace MWInput { player.setAutoMove (false); std::vector msgboxs = MWBase::Environment::get().getWindowManager()->getActiveMessageBoxes(); - const std::vector::iterator it = std::find_if(msgboxs.begin(), msgboxs.end(), [=](MWGui::MessageBox*& msgbox) + const std::vector::iterator it = std::find_if(msgboxs.begin(), msgboxs.end(), [](MWGui::MessageBox*& msgbox) { - return (msgbox->getMessage() == mOverencumberedMessage); + return (msgbox->getMessage() == "#{sNotifyMessage59}"); }); // if an overencumbered messagebox is already present, reset its expiry timer, otherwise create new one. if (it != msgboxs.end()) (*it)->mCurrentTime = 0; else - MWBase::Environment::get().getWindowManager()->messageBox(mOverencumberedMessage); + MWBase::Environment::get().getWindowManager()->messageBox("#{sNotifyMessage59}"); } } diff --git a/apps/openmw/mwinput/actionmanager.hpp b/apps/openmw/mwinput/actionmanager.hpp index b3deaed20e..4c51139d46 100644 --- a/apps/openmw/mwinput/actionmanager.hpp +++ b/apps/openmw/mwinput/actionmanager.hpp @@ -67,8 +67,6 @@ namespace MWInput bool mSneaking; bool mAttemptJump; - const std::string mOverencumberedMessage; - float mTimeIdle; }; } From 651b79d34e43b32d8392c1bb2ea690a46b8ba163 Mon Sep 17 00:00:00 2001 From: kuyondo Date: Thu, 16 Dec 2021 12:53:28 +0800 Subject: [PATCH 7/7] Update changelog.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 174eb9e4b4..e5428e9112 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -54,6 +54,7 @@ Bug #6174: Spellmaking and Enchanting sliders differences from vanilla Bug #6177: Followers of player follower stop following after waiting for a day Bug #6184: Command and Calm and Demoralize and Frenzy and Rally magic effects inconsistencies with vanilla + Bug #6191: Encumbrance messagebox timer works incorrectly Bug #6197: Infinite Casting Loop Bug #6253: Multiple instances of Reflect stack additively Bug #6255: Reflect is different from vanilla