mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-11-03 23:56:43 +00:00 
			
		
		
		
	Rebuild the cache in readState
This commit is contained in:
		
							parent
							
								
									90fa8dca35
								
							
						
					
					
						commit
						7d756d997e
					
				
					 2 changed files with 23 additions and 5 deletions
				
			
		| 
						 | 
					@ -1261,7 +1261,7 @@ namespace MWMechanics
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                bool found = creatureStats.mBoundItems.find(effect) != creatureStats.mBoundItems.end();
 | 
					                bool found = creatureStats.mBoundItems.find(effect) != creatureStats.mBoundItems.end();
 | 
				
			||||||
                float magnitude = effects.get(effect).getMagnitude();
 | 
					                float magnitude = effects.get(effect).getMagnitude();
 | 
				
			||||||
                if (found != (magnitude > 0) || creatureStats.mBoundItems.empty())
 | 
					                if (found != (magnitude > 0))
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    if (magnitude > 0)
 | 
					                    if (magnitude > 0)
 | 
				
			||||||
                        creatureStats.mBoundItems.insert(effect);
 | 
					                        creatureStats.mBoundItems.insert(effect);
 | 
				
			||||||
| 
						 | 
					@ -1281,10 +1281,6 @@ namespace MWMechanics
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            // 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.
 | 
					        // Summoned creature update visitor assumes the actor belongs to a cell.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -601,6 +601,28 @@ namespace MWMechanics
 | 
				
			||||||
        mAiSequence.readState(state.mAiSequence);
 | 
					        mAiSequence.readState(state.mAiSequence);
 | 
				
			||||||
        mMagicEffects.readState(state.mMagicEffects);
 | 
					        mMagicEffects.readState(state.mMagicEffects);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Rebuild the bound item cache
 | 
				
			||||||
 | 
					        for(int effectId = ESM::MagicEffect::BoundDagger; effectId <= ESM::MagicEffect::BoundGloves; effectId++)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if(mMagicEffects.get(effectId).getMagnitude() > 0)
 | 
				
			||||||
 | 
					                mBoundItems.insert(effectId);
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                // Check active spell effects
 | 
				
			||||||
 | 
					                // We can't use mActiveSpells::getMagicEffects here because it doesn't include expired effects
 | 
				
			||||||
 | 
					                auto spell = std::find_if(mActiveSpells.begin(), mActiveSpells.end(), [&] (const auto& spell)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    const auto& effects = spell.second.mEffects;
 | 
				
			||||||
 | 
					                    return std::find_if(effects.begin(), effects.end(), [&] (const auto& effect)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        return effect.mEffectId == effectId;
 | 
				
			||||||
 | 
					                    }) != effects.end();
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					                if(spell != mActiveSpells.end())
 | 
				
			||||||
 | 
					                    mBoundItems.insert(effectId);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        mSummonedCreatures = state.mSummonedCreatureMap;
 | 
					        mSummonedCreatures = state.mSummonedCreatureMap;
 | 
				
			||||||
        mSummonGraveyard = state.mSummonGraveyard;
 | 
					        mSummonGraveyard = state.mSummonGraveyard;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue