From 58e3900ea0edc9e09ad9d561a9d02e7ade4c3b1e Mon Sep 17 00:00:00 2001 From: Andrei Kortunov Date: Wed, 8 Jul 2020 14:12:55 +0400 Subject: [PATCH 1/2] Avoid redundant call --- apps/openmw/mwworld/worldimp.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/openmw/mwworld/worldimp.cpp b/apps/openmw/mwworld/worldimp.cpp index fd934b8a8..0ab15dfc4 100644 --- a/apps/openmw/mwworld/worldimp.cpp +++ b/apps/openmw/mwworld/worldimp.cpp @@ -1907,7 +1907,7 @@ namespace MWWorld std::string enchantId = selectedEnchantItem.getClass().getEnchantment(selectedEnchantItem); if (!enchantId.empty()) { - const ESM::Enchantment* ench = mStore.get().search(selectedEnchantItem.getClass().getEnchantment(selectedEnchantItem)); + const ESM::Enchantment* ench = mStore.get().search(enchantId); if (ench) preloadEffects(&ench->mEffects); } From da791590ac05010ba768480754b97b47cb939a5e Mon Sep 17 00:00:00 2001 From: Andrei Kortunov Date: Sat, 11 Jul 2020 20:40:00 +0400 Subject: [PATCH 2/2] Update HUD icons during mechanics update again to avoid crashes --- apps/openmw/mwgui/statswatcher.cpp | 21 --------------- .../mwmechanics/mechanicsmanagerimp.cpp | 26 ++++++++++++++++++- 2 files changed, 25 insertions(+), 22 deletions(-) diff --git a/apps/openmw/mwgui/statswatcher.cpp b/apps/openmw/mwgui/statswatcher.cpp index 7baec2f2c..ccb77de8f 100644 --- a/apps/openmw/mwgui/statswatcher.cpp +++ b/apps/openmw/mwgui/statswatcher.cpp @@ -136,27 +136,6 @@ namespace MWGui } mWatchedStatsEmpty = false; - - // Update the equipped weapon icon - MWWorld::InventoryStore& inv = mWatched.getClass().getInventoryStore(mWatched); - MWWorld::ContainerStoreIterator weapon = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedRight); - if (weapon == inv.end()) - winMgr->unsetSelectedWeapon(); - else - winMgr->setSelectedWeapon(*weapon); - - // Update the selected spell icon - MWWorld::ContainerStoreIterator enchantItem = inv.getSelectedEnchantItem(); - if (enchantItem != inv.end()) - winMgr->setSelectedEnchantItem(*enchantItem); - else - { - const std::string& spell = winMgr->getSelectedSpell(); - if (!spell.empty()) - winMgr->setSelectedSpell(spell, int(MWMechanics::getSpellSuccessChance(spell, mWatched))); - else - winMgr->unsetSelectedSpell(); - } } void StatsWatcher::addListener(StatsListener* listener) diff --git a/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp b/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp index fcae60c58..fd8902b37 100644 --- a/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp +++ b/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp @@ -302,13 +302,37 @@ namespace MWMechanics void MechanicsManager::update(float duration, bool paused) { + // Note: we should do it here since game mechanics and world updates use these values + MWWorld::Ptr ptr = getPlayer(); + MWBase::WindowManager *winMgr = MWBase::Environment::get().getWindowManager(); + + // Update the equipped weapon icon + MWWorld::InventoryStore& inv = ptr.getClass().getInventoryStore(ptr); + MWWorld::ContainerStoreIterator weapon = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedRight); + if (weapon == inv.end()) + winMgr->unsetSelectedWeapon(); + else + winMgr->setSelectedWeapon(*weapon); + + // Update the selected spell icon + MWWorld::ContainerStoreIterator enchantItem = inv.getSelectedEnchantItem(); + if (enchantItem != inv.end()) + winMgr->setSelectedEnchantItem(*enchantItem); + else + { + const std::string& spell = winMgr->getSelectedSpell(); + if (!spell.empty()) + winMgr->setSelectedSpell(spell, int(MWMechanics::getSpellSuccessChance(spell, ptr))); + else + winMgr->unsetSelectedSpell(); + } + if (mUpdatePlayer) { mUpdatePlayer = false; // HACK? The player has been changed, so a new Animation object may // have been made for them. Make sure they're properly updated. - MWWorld::Ptr ptr = getPlayer(); mActors.removeActor(ptr); mActors.addActor(ptr, true); }