From 27950979076d929656409086a14f49ec532d73ea Mon Sep 17 00:00:00 2001 From: psi29a Date: Sun, 21 Aug 2022 20:05:46 +0000 Subject: [PATCH] Merge branch 'consistently_hostile' into 'master' Clear the magic queue when unloading actors Closes #6954 See merge request OpenMW/openmw!2317 (cherry picked from commit 7c899364af0c047dfddaf5280aa1d43f3b95d8fd) afcbb3cb Clear the magic queue when unloading actors 443420ea CI compare cells --- apps/openmw/mwmechanics/activespells.cpp | 9 +++++++++ apps/openmw/mwmechanics/activespells.hpp | 2 ++ apps/openmw/mwmechanics/actors.cpp | 5 +---- apps/openmw/mwworld/worldimp.cpp | 2 +- 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/apps/openmw/mwmechanics/activespells.cpp b/apps/openmw/mwmechanics/activespells.cpp index 148d0e11cc..7ee3aedbb8 100644 --- a/apps/openmw/mwmechanics/activespells.cpp +++ b/apps/openmw/mwmechanics/activespells.cpp @@ -497,4 +497,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 55b089dc52..e761721925 100644 --- a/apps/openmw/mwmechanics/activespells.hpp +++ b/apps/openmw/mwmechanics/activespells.hpp @@ -145,6 +145,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 0d1b5662c0..b95a29b217 100644 --- a/apps/openmw/mwworld/worldimp.cpp +++ b/apps/openmw/mwworld/worldimp.cpp @@ -972,7 +972,7 @@ namespace MWWorld mPhysics->clearQueuedMovement(); mDiscardMovements = true; - if (changeEvent && mCurrentWorldSpace != cellName) + if (changeEvent && !Misc::StringUtils::ciEqual(mCurrentWorldSpace, cellName)) { // changed worldspace mProjectileManager->clear();