mirror of
https://github.com/TES3MP/TES3MP.git
synced 2025-09-29 08:00:56 -04:00
#58 - Sneak Skill: functional sneaking
Removed sneak checking from individual actor update. Added sneak checking to Actors::update()
This commit is contained in:
parent
a65e8393bb
commit
7d5dab214c
@ -226,7 +226,6 @@ namespace MWMechanics
|
|||||||
updateDrowning(ptr, duration);
|
updateDrowning(ptr, duration);
|
||||||
calculateNpcStatModifiers(ptr);
|
calculateNpcStatModifiers(ptr);
|
||||||
updateEquippedLight(ptr, duration);
|
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)
|
void Actors::updateCrimePersuit(const MWWorld::Ptr& ptr, float duration)
|
||||||
{
|
{
|
||||||
MWWorld::Ptr player = MWBase::Environment::get().getWorld()->getPlayerPtr();
|
MWWorld::Ptr player = MWBase::Environment::get().getWorld()->getPlayerPtr();
|
||||||
@ -971,6 +949,34 @@ namespace MWMechanics
|
|||||||
MWBase::Environment::get().getWindowManager()->messageBox("#{sKilledEssential}");
|
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)
|
void Actors::restoreDynamicStats(bool sleep)
|
||||||
|
@ -44,8 +44,6 @@ namespace MWMechanics
|
|||||||
|
|
||||||
void updateCrimePersuit (const MWWorld::Ptr& ptr, float duration);
|
void updateCrimePersuit (const MWWorld::Ptr& ptr, float duration);
|
||||||
|
|
||||||
void updateSneak (const MWWorld::Ptr& ptr);
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
Actors();
|
Actors();
|
||||||
|
@ -131,9 +131,6 @@ namespace MWWorld
|
|||||||
{
|
{
|
||||||
MWWorld::Ptr ptr = getPlayer();
|
MWWorld::Ptr ptr = getPlayer();
|
||||||
ptr.getClass().getCreatureStats(ptr).setMovementFlag(MWMechanics::CreatureStats::Flag_Sneak, sneak);
|
ptr.getClass().getCreatureStats(ptr).setMovementFlag(MWMechanics::CreatureStats::Flag_Sneak, sneak);
|
||||||
|
|
||||||
if(!sneak)
|
|
||||||
MWBase::Environment::get().getWindowManager()->setSneakVisibility(false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::yaw(float yaw)
|
void Player::yaw(float yaw)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user