From 5d11238723d90457427067d718c66f2dd8806b42 Mon Sep 17 00:00:00 2001 From: Alexei Kotov Date: Tue, 8 Nov 2022 19:30:49 +0300 Subject: [PATCH] Always consider an actor their own ally (bug #6313) --- CHANGELOG.md | 1 + apps/openmw/mwmechanics/actors.cpp | 12 +++++++----- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 671fa68bc2..4d9b02be7c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ Bug #5714: Touch spells cast using ExplodeSpell don't always explode Bug #5849: Paralysis breaks landing Bug #5977: Fatigueless NPCs' corpse underwater changes animation on game load + Bug #6313: Followers with high Fight can turn hostile Bug #6427: Enemy health bar disappears before damaging effect ends Bug #6645: Enemy block sounds align with animation instead of blocked hits Bug #6661: Saved games that have no preview screenshot cause issues or crashes diff --git a/apps/openmw/mwmechanics/actors.cpp b/apps/openmw/mwmechanics/actors.cpp index c0cdceb3f6..b89e32b72c 100644 --- a/apps/openmw/mwmechanics/actors.cpp +++ b/apps/openmw/mwmechanics/actors.cpp @@ -563,7 +563,6 @@ namespace MWMechanics { std::set allySet; getActorsSidingWith(ptr, allySet); - allySet.insert(ptr); std::vector allies(allySet.begin(), allySet.end()); for (const auto& ally : allies) ally.getClass().getCreatureStats(ally).getAiSequence().stopCombat(targets); @@ -646,7 +645,7 @@ namespace MWMechanics // Check that an ally of actor2 is also in combat with actor1 for (const MWWorld::Ptr& ally2 : allies2) { - if (ally2.getClass().getCreatureStats(ally2).getAiSequence().isInCombat(actor1)) + if (ally2 != actor2 && ally2.getClass().getCreatureStats(ally2).getAiSequence().isInCombat(actor1)) { mechanicsManager->startCombat(actor1, actor2); // Also have actor1's allies start combat @@ -676,7 +675,7 @@ namespace MWMechanics { for (const MWWorld::Ptr& ally : allies1) { - if (creatureStats2.getAiSequence().isInCombat(ally)) + if (ally != actor1 && creatureStats2.getAiSequence().isInCombat(ally)) { aggressive = true; break; @@ -2071,6 +2070,7 @@ namespace MWMechanics std::vector Actors::getActorsSidingWith(const MWWorld::Ptr& actorPtr, bool excludeInfighting) const { std::vector list; + list.push_back(actorPtr); for (const Actor& actor : mActors) { const MWWorld::Ptr& iteratedActor = actor.getPtr(); @@ -2147,7 +2147,7 @@ namespace MWMechanics { auto followers = getActorsSidingWith(actor, excludeInfighting); for (const MWWorld::Ptr& follower : followers) - if (out.insert(follower).second) + if (out.insert(follower).second && follower != actor) getActorsSidingWith(follower, out, excludeInfighting); } @@ -2161,13 +2161,15 @@ namespace MWMechanics else { for (const MWWorld::Ptr& follower : getActorsSidingWith(actor, true)) - if (out.insert(follower).second) + if (out.insert(follower).second && follower != actor) getActorsSidingWith(follower, out, cachedAllies); // Cache ptrs and their sets of allies cachedAllies.insert(std::make_pair(actor, out)); for (const MWWorld::Ptr& iter : out) { + if (iter == actor) + continue; search = cachedAllies.find(iter); if (search == cachedAllies.end()) cachedAllies.insert(std::make_pair(iter, out));