diff --git a/apps/openmw/mwmechanics/activespells.cpp b/apps/openmw/mwmechanics/activespells.cpp index 4c450b1363..e8cbfedecf 100644 --- a/apps/openmw/mwmechanics/activespells.cpp +++ b/apps/openmw/mwmechanics/activespells.cpp @@ -498,4 +498,13 @@ namespace MWMechanics for(const ESM::ActiveSpells::ActiveSpellParams& spell : state.mQueue) mQueue.emplace_back(ActiveSpellParams{spell}); } + + void ActiveSpells::unloadActor(const MWWorld::Ptr& ptr) + { + purge([] (const auto& spell) + { + return spell.getType() == ESM::ActiveSpells::Type_Consumable || spell.getType() == ESM::ActiveSpells::Type_Temporary; + }, ptr); + mQueue.clear(); + } } diff --git a/apps/openmw/mwmechanics/activespells.hpp b/apps/openmw/mwmechanics/activespells.hpp index 9f8252c8a4..5481211985 100644 --- a/apps/openmw/mwmechanics/activespells.hpp +++ b/apps/openmw/mwmechanics/activespells.hpp @@ -144,6 +144,8 @@ namespace MWMechanics ///< case insensitive void skipWorsenings(double hours); + + void unloadActor(const MWWorld::Ptr& ptr); }; } diff --git a/apps/openmw/mwmechanics/actors.cpp b/apps/openmw/mwmechanics/actors.cpp index 49d4f3f6e4..40aa628f01 100644 --- a/apps/openmw/mwmechanics/actors.cpp +++ b/apps/openmw/mwmechanics/actors.cpp @@ -220,10 +220,7 @@ void soulTrap(const MWWorld::Ptr& creature) void removeTemporaryEffects(const MWWorld::Ptr& ptr) { - ptr.getClass().getCreatureStats(ptr).getActiveSpells().purge([] (const auto& spell) - { - return spell.getType() == ESM::ActiveSpells::Type_Consumable || spell.getType() == ESM::ActiveSpells::Type_Temporary; - }, ptr); + ptr.getClass().getCreatureStats(ptr).getActiveSpells().unloadActor(ptr); } } diff --git a/apps/openmw/mwworld/worldimp.cpp b/apps/openmw/mwworld/worldimp.cpp index 322e134b9e..8e55ae0731 100644 --- a/apps/openmw/mwworld/worldimp.cpp +++ b/apps/openmw/mwworld/worldimp.cpp @@ -973,7 +973,7 @@ namespace MWWorld mPhysics->clearQueuedMovement(); mDiscardMovements = true; - if (changeEvent && mCurrentWorldSpace != cellName) + if (changeEvent && !Misc::StringUtils::ciEqual(mCurrentWorldSpace, cellName)) { // changed worldspace mProjectileManager->clear();