1
0
Fork 0
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:
psi29a 2025-07-22 07:37:35 +00:00
commit 2b1cd1deb8
4 changed files with 26 additions and 33 deletions

View file

@ -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;

View file

@ -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));
}
}

View file

@ -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)

View file

@ -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));
}
};