mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-03-31 01:20:23 +00:00
Merge branch 'refactor/predictAndAvoidCollisions' into 'master'
Use active package in predictAndAvoidCollisions See merge request OpenMW/openmw!1770
This commit is contained in:
commit
d3d9abede4
@ -1234,8 +1234,8 @@ namespace MWMechanics
|
|||||||
const float maxTimeToCheck = 2.0f;
|
const float maxTimeToCheck = 2.0f;
|
||||||
static const bool giveWayWhenIdle = Settings::Manager::getBool("NPCs give way", "Game");
|
static const bool giveWayWhenIdle = Settings::Manager::getBool("NPCs give way", "Game");
|
||||||
|
|
||||||
MWWorld::Ptr player = getPlayer();
|
const MWWorld::Ptr player = getPlayer();
|
||||||
MWBase::World* world = MWBase::Environment::get().getWorld();
|
const MWBase::World* world = MWBase::Environment::get().getWorld();
|
||||||
for(PtrActorMap::iterator iter(mActors.begin()); iter != mActors.end(); ++iter)
|
for(PtrActorMap::iterator iter(mActors.begin()); iter != mActors.end(); ++iter)
|
||||||
{
|
{
|
||||||
const MWWorld::Ptr& ptr = iter->first;
|
const MWWorld::Ptr& ptr = iter->first;
|
||||||
@ -1260,23 +1260,26 @@ namespace MWMechanics
|
|||||||
bool shouldTurnToApproachingActor = !isMoving;
|
bool shouldTurnToApproachingActor = !isMoving;
|
||||||
MWWorld::Ptr currentTarget; // Combat or pursue target (NPCs should not avoid collision with their targets).
|
MWWorld::Ptr currentTarget; // Combat or pursue target (NPCs should not avoid collision with their targets).
|
||||||
const auto& aiSequence = ptr.getClass().getCreatureStats(ptr).getAiSequence();
|
const auto& aiSequence = ptr.getClass().getCreatureStats(ptr).getAiSequence();
|
||||||
for (const auto& package : aiSequence)
|
if (!aiSequence.isEmpty())
|
||||||
{
|
{
|
||||||
if (package->getTypeId() == AiPackageTypeId::Follow)
|
const auto& package = aiSequence.getActivePackage();
|
||||||
shouldAvoidCollision = true;
|
if (package.getTypeId() == AiPackageTypeId::Follow)
|
||||||
else if (package->getTypeId() == AiPackageTypeId::Wander && giveWayWhenIdle)
|
|
||||||
{
|
{
|
||||||
if (!static_cast<const AiWander*>(package.get())->isStationary())
|
shouldAvoidCollision = true;
|
||||||
|
}
|
||||||
|
else if (package.getTypeId() == AiPackageTypeId::Wander && giveWayWhenIdle)
|
||||||
|
{
|
||||||
|
if (!static_cast<const AiWander&>(package).isStationary())
|
||||||
shouldGiveWay = true;
|
shouldGiveWay = true;
|
||||||
}
|
}
|
||||||
else if (package->getTypeId() == AiPackageTypeId::Combat || package->getTypeId() == AiPackageTypeId::Pursue)
|
else if (package.getTypeId() == AiPackageTypeId::Combat || package.getTypeId() == AiPackageTypeId::Pursue)
|
||||||
{
|
{
|
||||||
currentTarget = package->getTarget();
|
currentTarget = package.getTarget();
|
||||||
shouldAvoidCollision = isMoving;
|
shouldAvoidCollision = isMoving;
|
||||||
shouldTurnToApproachingActor = false;
|
shouldTurnToApproachingActor = false;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!shouldAvoidCollision && !shouldGiveWay)
|
if (!shouldAvoidCollision && !shouldGiveWay)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user