mirror of
https://github.com/OpenMW/openmw.git
synced 2025-02-01 06:45:35 +00:00
Move head tracking update into a separate function
This commit is contained in:
parent
fe206c1526
commit
77eaf2082f
1 changed files with 82 additions and 77 deletions
|
@ -224,6 +224,7 @@ void removeTemporaryEffects(const MWWorld::Ptr& ptr)
|
||||||
return spell.getType() == ESM::ActiveSpells::Type_Consumable || spell.getType() == ESM::ActiveSpells::Type_Temporary;
|
return spell.getType() == ESM::ActiveSpells::Type_Consumable || spell.getType() == ESM::ActiveSpells::Type_Temporary;
|
||||||
}, ptr);
|
}, ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace MWMechanics
|
namespace MWMechanics
|
||||||
|
@ -240,18 +241,8 @@ namespace MWMechanics
|
||||||
const auto distanceToNextPathPoint = (package.getNextPathPoint(package.getDestination()) - position).length();
|
const auto distanceToNextPathPoint = (package.getNextPathPoint(package.getDestination()) - position).length();
|
||||||
return (distanceToNextPathPoint - package.getNextPathPointTolerance(speed, duration, halfExtents)) / speed;
|
return (distanceToNextPathPoint - package.getNextPathPointTolerance(speed, duration, halfExtents)) / speed;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void Actors::updateActor (const MWWorld::Ptr& ptr, float duration)
|
void updateHeadTracking(const MWWorld::Ptr& actor, const MWWorld::Ptr& targetActor,
|
||||||
{
|
|
||||||
// magic effects
|
|
||||||
adjustMagicEffects (ptr, duration);
|
|
||||||
|
|
||||||
// fatigue restoration
|
|
||||||
calculateRestoration(ptr, duration);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void updateHeadTracking(const MWWorld::Ptr& actor, const MWWorld::Ptr& targetActor,
|
|
||||||
MWWorld::Ptr& headTrackTarget, float& sqrHeadTrackDistance, bool inCombatOrPursue)
|
MWWorld::Ptr& headTrackTarget, float& sqrHeadTrackDistance, bool inCombatOrPursue)
|
||||||
{
|
{
|
||||||
const auto& actorRefData = actor.getRefData();
|
const auto& actorRefData = actor.getRefData();
|
||||||
|
@ -261,10 +252,10 @@ namespace MWMechanics
|
||||||
if (targetActor.getClass().getCreatureStats(targetActor).isDead())
|
if (targetActor.getClass().getCreatureStats(targetActor).isDead())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
static const float fMaxHeadTrackDistance = MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>()
|
static const float fMaxHeadTrackDistance = MWBase::Environment::get().getWorld()->getStore()
|
||||||
.find("fMaxHeadTrackDistance")->mValue.getFloat();
|
.get<ESM::GameSetting>().find("fMaxHeadTrackDistance")->mValue.getFloat();
|
||||||
static const float fInteriorHeadTrackMult = MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>()
|
static const float fInteriorHeadTrackMult = MWBase::Environment::get().getWorld()->getStore()
|
||||||
.find("fInteriorHeadTrackMult")->mValue.getFloat();
|
.get<ESM::GameSetting>().find("fInteriorHeadTrackMult")->mValue.getFloat();
|
||||||
float maxDistance = fMaxHeadTrackDistance;
|
float maxDistance = fMaxHeadTrackDistance;
|
||||||
const ESM::Cell* currentCell = actor.getCell()->getCell();
|
const ESM::Cell* currentCell = actor.getCell()->getCell();
|
||||||
if (!currentCell->isExterior() && !(currentCell->mData.mFlags & ESM::Cell::QuasiEx))
|
if (!currentCell->isExterior() && !(currentCell->mData.mFlags & ESM::Cell::QuasiEx))
|
||||||
|
@ -283,7 +274,8 @@ namespace MWMechanics
|
||||||
actorDirection.z() = 0;
|
actorDirection.z() = 0;
|
||||||
targetDirection.z() = 0;
|
targetDirection.z() = 0;
|
||||||
if ((actorDirection * targetDirection > 0 || inCombatOrPursue)
|
if ((actorDirection * targetDirection > 0 || inCombatOrPursue)
|
||||||
&& MWBase::Environment::get().getWorld()->getLOS(actor, targetActor) // check LOS and awareness last as it's the most expensive function
|
// check LOS and awareness last as it's the most expensive function
|
||||||
|
&& MWBase::Environment::get().getWorld()->getLOS(actor, targetActor)
|
||||||
&& MWBase::Environment::get().getMechanicsManager()->awarenessCheck(targetActor, actor))
|
&& MWBase::Environment::get().getMechanicsManager()->awarenessCheck(targetActor, actor))
|
||||||
{
|
{
|
||||||
sqrHeadTrackDistance = sqrDist;
|
sqrHeadTrackDistance = sqrDist;
|
||||||
|
@ -291,6 +283,55 @@ namespace MWMechanics
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void updateHeadTracking(const MWWorld::Ptr& ptr, const std::list<Actor>& actors, bool isPlayer, CharacterController& ctrl)
|
||||||
|
{
|
||||||
|
float sqrHeadTrackDistance = std::numeric_limits<float>::max();
|
||||||
|
MWWorld::Ptr headTrackTarget;
|
||||||
|
|
||||||
|
const MWMechanics::CreatureStats& stats = ptr.getClass().getCreatureStats(ptr);
|
||||||
|
const bool firstPersonPlayer = isPlayer && MWBase::Environment::get().getWorld()->isFirstPerson();
|
||||||
|
|
||||||
|
// 1. Unconsious actor can not track target
|
||||||
|
// 2. Actors in combat and pursue mode do not bother to headtrack anyone except their target
|
||||||
|
// 3. Player character does not use headtracking in the 1st-person view
|
||||||
|
if (!stats.getKnockedDown() && !firstPersonPlayer)
|
||||||
|
{
|
||||||
|
bool inCombatOrPursue = stats.getAiSequence().isInCombat() || stats.getAiSequence().isInPursuit();
|
||||||
|
if (inCombatOrPursue)
|
||||||
|
{
|
||||||
|
auto activePackageTarget = stats.getAiSequence().getActivePackage().getTarget();
|
||||||
|
if (!activePackageTarget.isEmpty())
|
||||||
|
{
|
||||||
|
// Track the specified target of package.
|
||||||
|
updateHeadTracking(ptr, activePackageTarget, headTrackTarget, sqrHeadTrackDistance, inCombatOrPursue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Find something nearby.
|
||||||
|
for (const Actor& otherActor : actors)
|
||||||
|
{
|
||||||
|
if (otherActor.getPtr() == ptr)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
updateHeadTracking(ptr, otherActor.getPtr(), headTrackTarget, sqrHeadTrackDistance, inCombatOrPursue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ctrl.setHeadTrackTarget(headTrackTarget);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Actors::updateActor (const MWWorld::Ptr& ptr, float duration)
|
||||||
|
{
|
||||||
|
// magic effects
|
||||||
|
adjustMagicEffects (ptr, duration);
|
||||||
|
|
||||||
|
// fatigue restoration
|
||||||
|
calculateRestoration(ptr, duration);
|
||||||
|
}
|
||||||
|
|
||||||
void Actors::playIdleDialogue(const MWWorld::Ptr& actor)
|
void Actors::playIdleDialogue(const MWWorld::Ptr& actor)
|
||||||
{
|
{
|
||||||
if (!actor.getClass().isActor() || actor == getPlayer() || MWBase::Environment::get().getSoundManager()->sayActive(actor))
|
if (!actor.getClass().isActor() || actor == getPlayer() || MWBase::Environment::get().getSoundManager()->sayActive(actor))
|
||||||
|
@ -1461,43 +1502,7 @@ namespace MWMechanics
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (mTimerUpdateHeadTrack == 0)
|
if (mTimerUpdateHeadTrack == 0)
|
||||||
{
|
updateHeadTracking(actor.getPtr(), mActors, isPlayer, ctrl);
|
||||||
float sqrHeadTrackDistance = std::numeric_limits<float>::max();
|
|
||||||
MWWorld::Ptr headTrackTarget;
|
|
||||||
|
|
||||||
MWMechanics::CreatureStats& stats = actor.getPtr().getClass().getCreatureStats(actor.getPtr());
|
|
||||||
bool firstPersonPlayer = isPlayer && world->isFirstPerson();
|
|
||||||
|
|
||||||
// 1. Unconsious actor can not track target
|
|
||||||
// 2. Actors in combat and pursue mode do not bother to headtrack anyone except their target
|
|
||||||
// 3. Player character does not use headtracking in the 1st-person view
|
|
||||||
if (!stats.getKnockedDown() && !firstPersonPlayer)
|
|
||||||
{
|
|
||||||
bool inCombatOrPursue = stats.getAiSequence().isInCombat() || stats.getAiSequence().isInPursuit();
|
|
||||||
if (inCombatOrPursue)
|
|
||||||
{
|
|
||||||
auto activePackageTarget = stats.getAiSequence().getActivePackage().getTarget();
|
|
||||||
if (!activePackageTarget.isEmpty())
|
|
||||||
{
|
|
||||||
// Track the specified target of package.
|
|
||||||
updateHeadTracking(actor.getPtr(), activePackageTarget, headTrackTarget, sqrHeadTrackDistance, inCombatOrPursue);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Find something nearby.
|
|
||||||
for (const Actor& otherActor : mActors)
|
|
||||||
{
|
|
||||||
if (otherActor.getPtr() == actor.getPtr())
|
|
||||||
continue;
|
|
||||||
|
|
||||||
updateHeadTracking(actor.getPtr(), otherActor.getPtr(), headTrackTarget, sqrHeadTrackDistance, inCombatOrPursue);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ctrl.setHeadTrackTarget(headTrackTarget);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (actor.getPtr().getClass().isNpc() && actor.getPtr() != player)
|
if (actor.getPtr().getClass().isNpc() && actor.getPtr() != player)
|
||||||
updateCrimePursuit(actor.getPtr(), duration);
|
updateCrimePursuit(actor.getPtr(), duration);
|
||||||
|
|
Loading…
Reference in a new issue