mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-02-10 03:39:55 +00:00
Add delay to sneak icon update and skill progress (Fixes #1321)
This commit is contained in:
parent
ec66484472
commit
3801dfb4ba
@ -1074,6 +1074,9 @@ namespace MWMechanics
|
|||||||
isBattleMusic = true;
|
isBattleMusic = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static float sneakTimer = 0.f; // times update of sneak icon
|
||||||
|
static float sneakSkillTimer = 0.f; // times sneak skill progress from "avoid notice"
|
||||||
|
|
||||||
// if player is in sneak state see if anyone detects him
|
// if player is in sneak state see if anyone detects him
|
||||||
if (player.getClass().getCreatureStats(player).getMovementFlag(MWMechanics::CreatureStats::Flag_Sneak))
|
if (player.getClass().getCreatureStats(player).getMovementFlag(MWMechanics::CreatureStats::Flag_Sneak))
|
||||||
{
|
{
|
||||||
@ -1081,29 +1084,56 @@ namespace MWMechanics
|
|||||||
const int radius = esmStore.get<ESM::GameSetting>().find("fSneakUseDist")->getInt();
|
const int radius = esmStore.get<ESM::GameSetting>().find("fSneakUseDist")->getInt();
|
||||||
bool detected = false;
|
bool detected = false;
|
||||||
|
|
||||||
|
static float fSneakUseDelay = esmStore.get<ESM::GameSetting>().find("fSneakUseDelay")->getFloat();
|
||||||
|
|
||||||
|
if (sneakTimer >= fSneakUseDelay)
|
||||||
|
sneakTimer = 0.f;
|
||||||
|
|
||||||
|
if (sneakTimer == 0.f)
|
||||||
|
{
|
||||||
|
// Set when an NPC is within line of sight and distance, but is still unaware. Used for skill progress.
|
||||||
|
bool avoidedNotice = false;
|
||||||
|
|
||||||
for (PtrControllerMap::iterator iter(mActors.begin()); iter != mActors.end(); ++iter)
|
for (PtrControllerMap::iterator iter(mActors.begin()); iter != mActors.end(); ++iter)
|
||||||
{
|
{
|
||||||
if (iter->first == player) // not the player
|
if (iter->first == player) // not the player
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// is the player in range and can they be detected
|
// is the player in range and can they be detected
|
||||||
if ( (Ogre::Vector3(iter->first.getRefData().getPosition().pos).squaredDistance(Ogre::Vector3(player.getRefData().getPosition().pos)) <= radius*radius)
|
if (Ogre::Vector3(iter->first.getRefData().getPosition().pos).squaredDistance(Ogre::Vector3(player.getRefData().getPosition().pos)) <= radius*radius
|
||||||
&& MWBase::Environment::get().getMechanicsManager()->awarenessCheck(player, iter->first)
|
|
||||||
&& MWBase::Environment::get().getWorld()->getLOS(player, iter->first))
|
&& MWBase::Environment::get().getWorld()->getLOS(player, iter->first))
|
||||||
|
{
|
||||||
|
if (MWBase::Environment::get().getMechanicsManager()->awarenessCheck(player, iter->first))
|
||||||
{
|
{
|
||||||
detected = true;
|
detected = true;
|
||||||
|
avoidedNotice = false;
|
||||||
MWBase::Environment::get().getWindowManager()->setSneakVisibility(false);
|
MWBase::Environment::get().getWindowManager()->setSneakVisibility(false);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
else if (!detected)
|
||||||
|
avoidedNotice = true;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sneakSkillTimer >= fSneakUseDelay)
|
||||||
|
sneakSkillTimer = 0.f;
|
||||||
|
|
||||||
|
if (avoidedNotice && sneakSkillTimer == 0.f)
|
||||||
|
player.getClass().skillUsageSucceeded(player, ESM::Skill::Sneak, 0);
|
||||||
|
|
||||||
if (!detected)
|
if (!detected)
|
||||||
MWBase::Environment::get().getWindowManager()->setSneakVisibility(true);
|
MWBase::Environment::get().getWindowManager()->setSneakVisibility(true);
|
||||||
}
|
}
|
||||||
|
sneakTimer += duration;
|
||||||
|
sneakSkillTimer += duration;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
sneakTimer = 0.f;
|
||||||
MWBase::Environment::get().getWindowManager()->setSneakVisibility(false);
|
MWBase::Environment::get().getWindowManager()->setSneakVisibility(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
void Actors::restoreDynamicStats(bool sleep)
|
void Actors::restoreDynamicStats(bool sleep)
|
||||||
{
|
{
|
||||||
for(PtrControllerMap::iterator iter(mActors.begin());iter != mActors.end();++iter)
|
for(PtrControllerMap::iterator iter(mActors.begin());iter != mActors.end();++iter)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user