mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-11-04 04:26:42 +00: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
					
				
					 3 changed files with 37 additions and 36 deletions
				
			
		| 
						 | 
					@ -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…
	
		Reference in a new issue