Improve face shielding behavior in general case (bug #4240)

pull/2405/head
Capostrophic 5 years ago
parent 883dc2136d
commit e7208bb80e

@ -12,6 +12,7 @@
Bug #3765: DisableTeleporting makes Mark/Recall/Intervention effects undetectable
Bug #3778: [Mod] Improved Thrown Weapon Projectiles - weapons have wrong transformation during throw animation
Bug #3812: Wrong multiline tooltips width when word-wrapping is enabled
Bug #4240: Ash storm origin coordinates and hand shielding animation behavior are incorrect
Bug #4329: Removed birthsign abilities are restored after reloading the save
Bug #4383: Bow model obscures crosshair when arrow is drawn
Bug #4384: Resist Normal Weapons only checks ammunition for ranged weapons

@ -1119,41 +1119,36 @@ void CharacterController::updatePtr(const MWWorld::Ptr &ptr)
void CharacterController::updateIdleStormState(bool inwater)
{
bool inStormDirection = false;
if (MWBase::Environment::get().getWorld()->isInStorm())
if (!mAnimation->hasAnimation("idlestorm") || mUpperBodyState != UpperCharState_Nothing || inwater)
{
osg::Vec3f stormDirection = MWBase::Environment::get().getWorld()->getStormDirection();
osg::Vec3f characterDirection = mPtr.getRefData().getBaseNode()->getAttitude() * osg::Vec3f(0,1,0);
inStormDirection = std::acos(stormDirection * characterDirection / (stormDirection.length() * characterDirection.length()))
> osg::DegreesToRadians(120.f);
mAnimation->disable("idlestorm");
return;
}
if (inStormDirection && !inwater && mUpperBodyState == UpperCharState_Nothing && mAnimation->hasAnimation("idlestorm"))
{
float complete = 0;
mAnimation->getInfo("idlestorm", &complete);
if (complete == 0)
mAnimation->play("idlestorm", Priority_Storm, MWRender::Animation::BlendMask_RightArm, false,
1.0f, "start", "loop start", 0.0f, 0);
else if (complete == 1)
mAnimation->play("idlestorm", Priority_Storm, MWRender::Animation::BlendMask_RightArm, false,
1.0f, "loop start", "loop stop", 0.0f, ~0ul);
}
else
if (MWBase::Environment::get().getWorld()->isInStorm())
{
if (mUpperBodyState == UpperCharState_Nothing)
osg::Vec3f stormDirection = MWBase::Environment::get().getWorld()->getStormDirection();
osg::Vec3f characterDirection = mPtr.getRefData().getBaseNode()->getAttitude() * osg::Vec3f(0,1,0);
stormDirection.normalize();
characterDirection.normalize();
if (stormDirection * characterDirection < -0.5f)
{
if (mAnimation->isPlaying("idlestorm"))
if (!mAnimation->isPlaying("idlestorm"))
{
if (mAnimation->getCurrentTime("idlestorm") < mAnimation->getTextKeyTime("idlestorm: loop stop"))
{
mAnimation->play("idlestorm", Priority_Storm, MWRender::Animation::BlendMask_RightArm, true,
1.0f, "loop stop", "stop", 0.0f, 0);
}
mAnimation->play("idlestorm", Priority_Storm, MWRender::Animation::BlendMask_RightArm, true,
1.0f, "start", "stop", 0.0f, ~0ul);
}
else
{
mAnimation->setLoopingEnabled("idlestorm", true);
}
return;
}
else
mAnimation->disable("idlestorm");
}
if (mAnimation->isPlaying("idlestorm"))
{
mAnimation->setLoopingEnabled("idlestorm", false);
}
}

@ -710,10 +710,9 @@ void WeatherManager::update(float duration, bool paused, const TimeStamp& time,
if (mIsStorm)
{
osg::Vec3f playerPos (player.getRefData().getPosition().asVec3());
osg::Vec3f redMountainPos (19950, 72032, 27831);
playerPos.z() = 0;
osg::Vec3f redMountainPos (25000, 70000, 0);
mStormDirection = (playerPos - redMountainPos);
mStormDirection.z() = 0;
mStormDirection.normalize();
mRendering.getSkyManager()->setStormDirection(mStormDirection);
}

Loading…
Cancel
Save