From 90fa8dca3535a4312794e951d6e93335f16ec2c1 Mon Sep 17 00:00:00 2001 From: Evil Eye <malusluminis@hotmail.com> Date: Sun, 6 Jun 2021 18:10:55 +0200 Subject: [PATCH] Do not assume the bound item cache is valid after loading a save --- apps/openmw/mwmechanics/actors.cpp | 44 +++++++++++++++++------------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/apps/openmw/mwmechanics/actors.cpp b/apps/openmw/mwmechanics/actors.cpp index 0ffcef2f8b..218d4b4201 100644 --- a/apps/openmw/mwmechanics/actors.cpp +++ b/apps/openmw/mwmechanics/actors.cpp @@ -1239,7 +1239,7 @@ namespace MWMechanics // Update bound effects // Note: in vanilla MW multiple bound items of the same type can be created by different spells. // As these extra copies are kinda useless this may or may not be important. - static std::map<int, std::string> boundItemsMap; + static std::map<ESM::MagicEffect::Effects, std::string> boundItemsMap; if (boundItemsMap.empty()) { boundItemsMap[ESM::MagicEffect::BoundBattleAxe] = "sMagicBoundBattleAxeID"; @@ -1255,30 +1255,36 @@ namespace MWMechanics boundItemsMap[ESM::MagicEffect::BoundSpear] = "sMagicBoundSpearID"; } - for (std::map<int, std::string>::iterator it = boundItemsMap.begin(); it != boundItemsMap.end(); ++it) + if(ptr.getClass().hasInventoryStore(ptr)) { - bool found = creatureStats.mBoundItems.find(it->first) != creatureStats.mBoundItems.end(); - float magnitude = effects.get(it->first).getMagnitude(); - if (found != (magnitude > 0)) + for (const auto& [effect, itemGmst] : boundItemsMap) { - if (magnitude > 0) - creatureStats.mBoundItems.insert(it->first); - else - creatureStats.mBoundItems.erase(it->first); - - std::string itemGmst = it->second; - std::string item = MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>().find( - itemGmst)->mValue.getString(); - - magnitude > 0 ? addBoundItem(item, ptr) : removeBoundItem(item, ptr); - - if (it->first == ESM::MagicEffect::BoundGloves) + bool found = creatureStats.mBoundItems.find(effect) != creatureStats.mBoundItems.end(); + float magnitude = effects.get(effect).getMagnitude(); + if (found != (magnitude > 0) || creatureStats.mBoundItems.empty()) { - item = MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>().find( - "sMagicBoundRightGauntletID")->mValue.getString(); + if (magnitude > 0) + creatureStats.mBoundItems.insert(effect); + else + creatureStats.mBoundItems.erase(effect); + + std::string item = MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>().find( + itemGmst)->mValue.getString(); + magnitude > 0 ? addBoundItem(item, ptr) : removeBoundItem(item, ptr); + + if (effect == ESM::MagicEffect::BoundGloves) + { + item = MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>().find( + "sMagicBoundRightGauntletID")->mValue.getString(); + magnitude > 0 ? addBoundItem(item, ptr) : removeBoundItem(item, ptr); + } } } + // mBoundItems does not get saved so the cache is out of date after loading a save. + // Use Length as a sentinel value to force an update. + if(creatureStats.mBoundItems.empty()) + creatureStats.mBoundItems.insert(ESM::MagicEffect::Length); } // Summoned creature update visitor assumes the actor belongs to a cell.