mirror of
https://github.com/OpenMW/openmw.git
synced 2026-01-04 04:13:06 +00:00
Merge branch 'getpcrunning' into 'master'
Deduplicate GetPCRunning logic See merge request OpenMW/openmw!4800
This commit is contained in:
commit
2b1cd1deb8
4 changed files with 26 additions and 33 deletions
|
|
@ -530,10 +530,11 @@ namespace MWClass
|
|||
|
||||
const MWBase::World* world = MWBase::Environment::get().getWorld();
|
||||
const MWMechanics::MagicEffects& mageffects = stats.getMagicEffects();
|
||||
const float normalizedEncumbrance = getNormalizedEncumbrance(ptr);
|
||||
|
||||
float moveSpeed;
|
||||
|
||||
if (getEncumbrance(ptr) > getCapacity(ptr))
|
||||
if (normalizedEncumbrance > 1.0f)
|
||||
moveSpeed = 0.0f;
|
||||
else if (canFly(ptr)
|
||||
|| (mageffects.getOrDefault(ESM::MagicEffect::Levitate).getMagnitude() > 0 && world->isLevitationEnabled()))
|
||||
|
|
@ -543,7 +544,6 @@ namespace MWClass
|
|||
+ mageffects.getOrDefault(ESM::MagicEffect::Levitate).getMagnitude());
|
||||
flySpeed = gmst.fMinFlySpeed->mValue.getFloat()
|
||||
+ flySpeed * (gmst.fMaxFlySpeed->mValue.getFloat() - gmst.fMinFlySpeed->mValue.getFloat());
|
||||
const float normalizedEncumbrance = getNormalizedEncumbrance(ptr);
|
||||
flySpeed *= 1.0f - gmst.fEncumberedMoveEffect->mValue.getFloat() * normalizedEncumbrance;
|
||||
flySpeed = std::max(0.0f, flySpeed);
|
||||
moveSpeed = flySpeed;
|
||||
|
|
|
|||
|
|
@ -990,15 +990,10 @@ namespace MWClass
|
|||
const MWMechanics::MagicEffects& mageffects = stats.getMagicEffects();
|
||||
|
||||
const float normalizedEncumbrance = getNormalizedEncumbrance(ptr);
|
||||
|
||||
bool swimming = world->isSwimming(ptr);
|
||||
bool sneaking = MWBase::Environment::get().getMechanicsManager()->isSneaking(ptr);
|
||||
bool running = stats.getStance(MWMechanics::CreatureStats::Stance_Run);
|
||||
bool inair = !world->isOnGround(ptr) && !swimming && !world->isFlying(ptr);
|
||||
running = running && (inair || MWBase::Environment::get().getMechanicsManager()->isRunning(ptr));
|
||||
const bool running = MWBase::Environment::get().getMechanicsManager()->isRunning(ptr);
|
||||
|
||||
float moveSpeed;
|
||||
if (getEncumbrance(ptr) > getCapacity(ptr))
|
||||
if (normalizedEncumbrance > 1.0f)
|
||||
moveSpeed = 0.0f;
|
||||
else if (mageffects.getOrDefault(ESM::MagicEffect::Levitate).getMagnitude() > 0 && world->isLevitationEnabled())
|
||||
{
|
||||
|
|
@ -1011,9 +1006,9 @@ namespace MWClass
|
|||
flySpeed = std::max(0.0f, flySpeed);
|
||||
moveSpeed = flySpeed;
|
||||
}
|
||||
else if (swimming)
|
||||
else if (world->isSwimming(ptr))
|
||||
moveSpeed = getSwimSpeed(ptr);
|
||||
else if (running && !sneaking)
|
||||
else if (running && !MWBase::Environment::get().getMechanicsManager()->isSneaking(ptr))
|
||||
moveSpeed = getRunSpeed(ptr);
|
||||
else
|
||||
moveSpeed = getWalkSpeed(ptr);
|
||||
|
|
@ -1509,14 +1504,8 @@ namespace MWClass
|
|||
|
||||
float Npc::getSwimSpeed(const MWWorld::Ptr& ptr) const
|
||||
{
|
||||
const MWBase::World* world = MWBase::Environment::get().getWorld();
|
||||
const MWMechanics::NpcStats& stats = getNpcStats(ptr);
|
||||
const MWMechanics::MagicEffects& mageffects = stats.getMagicEffects();
|
||||
const bool swimming = world->isSwimming(ptr);
|
||||
const bool inair = !world->isOnGround(ptr) && !swimming && !world->isFlying(ptr);
|
||||
const bool running = stats.getStance(MWMechanics::CreatureStats::Stance_Run)
|
||||
&& (inair || MWBase::Environment::get().getMechanicsManager()->isRunning(ptr));
|
||||
|
||||
return getSwimSpeedImpl(ptr, getGmst(), mageffects, running ? getRunSpeed(ptr) : getWalkSpeed(ptr));
|
||||
const MWMechanics::MagicEffects& effects = getNpcStats(ptr).getMagicEffects();
|
||||
const bool running = MWBase::Environment::get().getMechanicsManager()->isRunning(ptr);
|
||||
return getSwimSpeedImpl(ptr, getGmst(), effects, running ? getRunSpeed(ptr) : getWalkSpeed(ptr));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -368,17 +368,28 @@ namespace MWMechanics
|
|||
|
||||
bool MechanicsManager::isRunning(const MWWorld::Ptr& ptr)
|
||||
{
|
||||
return mActors.isRunning(ptr);
|
||||
CreatureStats& stats = ptr.getClass().getCreatureStats(ptr);
|
||||
if (!stats.getStance(MWMechanics::CreatureStats::Stance_Run))
|
||||
return false;
|
||||
|
||||
if (mActors.isRunning(ptr))
|
||||
return true;
|
||||
|
||||
MWBase::World* world = MWBase::Environment::get().getWorld();
|
||||
return !world->isOnGround(ptr) && !world->isSwimming(ptr) && !world->isFlying(ptr);
|
||||
}
|
||||
|
||||
bool MechanicsManager::isSneaking(const MWWorld::Ptr& ptr)
|
||||
{
|
||||
CreatureStats& stats = ptr.getClass().getCreatureStats(ptr);
|
||||
if (!stats.getStance(MWMechanics::CreatureStats::Stance_Sneak))
|
||||
return false;
|
||||
|
||||
if (mActors.isSneaking(ptr))
|
||||
return true;
|
||||
|
||||
MWBase::World* world = MWBase::Environment::get().getWorld();
|
||||
bool animActive = mActors.isSneaking(ptr);
|
||||
bool stanceOn = stats.getStance(MWMechanics::CreatureStats::Stance_Sneak);
|
||||
bool inair = !world->isOnGround(ptr) && !world->isSwimming(ptr) && !world->isFlying(ptr);
|
||||
return stanceOn && (animActive || inair);
|
||||
return !world->isOnGround(ptr) && !world->isSwimming(ptr) && !world->isFlying(ptr);
|
||||
}
|
||||
|
||||
void MechanicsManager::rest(double hours, bool sleep)
|
||||
|
|
|
|||
|
|
@ -164,14 +164,7 @@ namespace MWScript
|
|||
void execute(Interpreter::Runtime& runtime) override
|
||||
{
|
||||
MWWorld::Ptr ptr = MWBase::Environment::get().getWorld()->getPlayerPtr();
|
||||
MWMechanics::CreatureStats& stats = ptr.getClass().getCreatureStats(ptr);
|
||||
MWBase::World* world = MWBase::Environment::get().getWorld();
|
||||
|
||||
bool stanceOn = stats.getStance(MWMechanics::CreatureStats::Stance_Run);
|
||||
bool running = MWBase::Environment::get().getMechanicsManager()->isRunning(ptr);
|
||||
bool inair = !world->isOnGround(ptr) && !world->isSwimming(ptr) && !world->isFlying(ptr);
|
||||
|
||||
runtime.push(stanceOn && (running || inair));
|
||||
runtime.push(MWBase::Environment::get().getMechanicsManager()->isRunning(ptr));
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue