diff --git a/apps/openmw/mwmechanics/actors.cpp b/apps/openmw/mwmechanics/actors.cpp index 92879fe377..dfec007d79 100644 --- a/apps/openmw/mwmechanics/actors.cpp +++ b/apps/openmw/mwmechanics/actors.cpp @@ -301,20 +301,31 @@ namespace MWMechanics } } - // start combat if we are in combat with any followers of this actor - const std::list& followers = getActorsFollowing(actor2); + // start combat if target actor is in combat with one of our followers + const std::list& followers = getActorsFollowing(actor1); + const CreatureStats& creatureStats2 = actor2.getClass().getCreatureStats(actor2); for (std::list::const_iterator it = followers.begin(); it != followers.end(); ++it) { - if (creatureStats.getAiSequence().isInCombat(*it)) + // need to check both ways since player doesn't use AI packages + if (creatureStats2.getAiSequence().isInCombat(*it) + || it->getClass().getCreatureStats(*it).getAiSequence().isInCombat(actor2)) aggressive = true; } - // start combat if we are in combat with someone this actor is following - const CreatureStats& creatureStats2 = actor2.getClass().getCreatureStats(actor2); - for (std::list::const_iterator it = creatureStats2.getAiSequence().begin(); it != creatureStats2.getAiSequence().end(); ++it) + + // start combat if target actor is in combat with someone we are following + for (std::list::const_iterator it = creatureStats.getAiSequence().begin(); it != creatureStats.getAiSequence().end(); ++it) { - if ((*it)->getTypeId() == MWMechanics::AiPackage::TypeIdFollow && - creatureStats.getAiSequence().isInCombat(dynamic_cast(*it)->getTarget())) - aggressive = true; + if ((*it)->getTypeId() == MWMechanics::AiPackage::TypeIdFollow) + { + MWWorld::Ptr followTarget = dynamic_cast(*it)->getTarget(); + if (followTarget.isEmpty()) + continue; + + // need to check both ways since player doesn't use AI packages + if (creatureStats2.getAiSequence().isInCombat(followTarget) + || followTarget.getClass().getCreatureStats(followTarget).getAiSequence().isInCombat(actor2)) + aggressive = true; + } } if(aggressive) @@ -1374,11 +1385,19 @@ namespace MWMechanics { const MWWorld::Class &cls = iter->first.getClass(); CreatureStats &stats = cls.getCreatureStats(iter->first); - if(!stats.isDead() && stats.getAiSequence().getTypeId() == AiPackage::TypeIdFollow) + if (stats.isDead()) + continue; + + for (std::list::const_iterator it = stats.getAiSequence().begin(); it != stats.getAiSequence().end(); ++it) { - MWMechanics::AiFollow* package = static_cast(stats.getAiSequence().getActivePackage()); - if(package->getFollowedActor() == actor.getCellRef().getRefId()) - list.push_front(iter->first); + if ((*it)->getTypeId() == MWMechanics::AiPackage::TypeIdFollow) + { + MWWorld::Ptr followTarget = dynamic_cast(*it)->getTarget(); + if (followTarget.isEmpty()) + continue; + if (followTarget == actor) + list.push_back(iter->first); + } } } return list; diff --git a/apps/openmw/mwmechanics/aifollow.cpp b/apps/openmw/mwmechanics/aifollow.cpp index 44d2552be4..d8b16b366c 100644 --- a/apps/openmw/mwmechanics/aifollow.cpp +++ b/apps/openmw/mwmechanics/aifollow.cpp @@ -137,10 +137,19 @@ MWMechanics::AiFollow::AiFollow(const ESM::AiSequence::AiFollow *follow) MWWorld::Ptr MWMechanics::AiFollow::getTarget() { + if (mActorId == -2) + return MWWorld::Ptr(); + if (mActorId == -1) { MWWorld::Ptr target = MWBase::Environment::get().getWorld()->searchPtr(mActorRefId, false); - mActorId = target.getClass().getCreatureStats(target).getActorId(); + if (target.isEmpty()) + { + mActorId = -2; + return target; + } + else + mActorId = target.getClass().getCreatureStats(target).getActorId(); } if (mActorId != -1)