#58 - Sneak Skill: functional sneaking

Removed sneak checking from individual actor update.
Added sneak checking to Actors::update()
This commit is contained in:
Jeffrey Haines 2014-05-04 16:20:09 -04:00
parent a65e8393bb
commit 7d5dab214c
3 changed files with 37 additions and 36 deletions

View file

@ -226,7 +226,6 @@ namespace MWMechanics
updateDrowning(ptr, duration);
calculateNpcStatModifiers(ptr);
updateEquippedLight(ptr, duration);
updateSneak(ptr);
}
}
@ -711,27 +710,6 @@ namespace MWMechanics
}
}
void Actors::updateSneak (const MWWorld::Ptr& ptr)
{
const MWWorld::Ptr player = MWBase::Environment::get().getWorld()->getPlayerPtr();
if ( player.getClass().getCreatureStats(player).getMovementFlag(MWMechanics::CreatureStats::Flag_Sneak)
&& ptr != player)
{
const MWWorld::ESMStore& esmStore = MWBase::Environment::get().getWorld()->getStore();
int radius = esmStore.get<ESM::GameSetting>().find("fSneakUseDist")->getInt();
bool seen = false;
// am I close enough and can I see the player?
if ( (Ogre::Vector3(ptr.getRefData().getPosition().pos).squaredDistance(Ogre::Vector3(player.getRefData().getPosition().pos)) <= radius*radius)
&& MWBase::Environment::get().getMechanicsManager()->awarenessCheck(player, ptr)
&& MWBase::Environment::get().getWorld()->getLOS(player, ptr))
seen = true;
MWBase::Environment::get().getWindowManager()->setSneakVisibility(seen);
}
}
void Actors::updateCrimePersuit(const MWWorld::Ptr& ptr, float duration)
{
MWWorld::Ptr player = MWBase::Environment::get().getWorld()->getPlayerPtr();
@ -971,6 +949,34 @@ namespace MWMechanics
MWBase::Environment::get().getWindowManager()->messageBox("#{sKilledEssential}");
}
}
// if player is in sneak state see if anyone detects him
const MWWorld::Ptr player = MWBase::Environment::get().getWorld()->getPlayerPtr();
if (player.getClass().getCreatureStats(player).getMovementFlag(MWMechanics::CreatureStats::Flag_Sneak))
{
const MWWorld::ESMStore& esmStore = MWBase::Environment::get().getWorld()->getStore();
const int radius = esmStore.get<ESM::GameSetting>().find("fSneakUseDist")->getInt();
bool detected = false;
for (PtrControllerMap::iterator iter(mActors.begin()); iter != mActors.end(); ++iter)
{
if (iter->first == player) // not the player
continue;
// 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)
&& MWBase::Environment::get().getMechanicsManager()->awarenessCheck(player, iter->first)
&& MWBase::Environment::get().getWorld()->getLOS(player, iter->first))
{
detected = true;
MWBase::Environment::get().getWindowManager()->setSneakVisibility(false);
break;
}
}
if (!detected)
MWBase::Environment::get().getWindowManager()->setSneakVisibility(true);
}
}
}
void Actors::restoreDynamicStats(bool sleep)

View file

@ -44,8 +44,6 @@ namespace MWMechanics
void updateCrimePersuit (const MWWorld::Ptr& ptr, float duration);
void updateSneak (const MWWorld::Ptr& ptr);
public:
Actors();

View file

@ -131,9 +131,6 @@ namespace MWWorld
{
MWWorld::Ptr ptr = getPlayer();
ptr.getClass().getCreatureStats(ptr).setMovementFlag(MWMechanics::CreatureStats::Flag_Sneak, sneak);
if(!sneak)
MWBase::Environment::get().getWindowManager()->setSneakVisibility(false);
}
void Player::yaw(float yaw)