mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-10-31 20:56:39 +00:00 
			
		
		
		
	Actor avoiding door asks all surrounding actors to do the same.
This commit is contained in:
		
							parent
							
								
									cbcf0f6039
								
							
						
					
					
						commit
						993ef1be43
					
				
					 2 changed files with 16 additions and 2 deletions
				
			
		|  | @ -6,6 +6,7 @@ | |||
| #include "../mwworld/cellstore.hpp" | ||||
| #include "creaturestats.hpp" | ||||
| #include "movement.hpp" | ||||
| #include "mechanicsmanagerimp.hpp" | ||||
| 
 | ||||
| #include <OgreMath.h> | ||||
| 
 | ||||
|  | @ -44,6 +45,18 @@ bool MWMechanics::AiAvoidDoor::execute (const MWWorld::Ptr& actor,float duration | |||
|     actor.getClass().getMovementSettings(actor).mPosition[1] = -1 * std::sin(dirToDoor); //I knew I'd use trig someday
 | ||||
|     actor.getClass().getMovementSettings(actor).mPosition[0] = -1 * std::cos(dirToDoor); | ||||
| 
 | ||||
|     //Make all nearby actors also avoid the door
 | ||||
|     std::vector<MWWorld::Ptr> actors; | ||||
|     MWBase::Environment::get().getMechanicsManager()->getActorsInRange(Ogre::Vector3(pos.pos[0],pos.pos[1],pos.pos[2]),50,actors); | ||||
|     for(std::vector<MWWorld::Ptr>::iterator it = actors.begin(); it != actors.end(); it++) { | ||||
|         if(*it != MWBase::Environment::get().getWorld()->getPlayerPtr()) { //Not the player
 | ||||
|             MWMechanics::AiSequence& seq = MWWorld::Class::get(*it).getCreatureStats(*it).getAiSequence(); | ||||
|             if(seq.getTypeId() != MWMechanics::AiPackage::TypeIdAvoidDoor) { //Only add it once
 | ||||
|                 seq.stack(MWMechanics::AiAvoidDoor(mDoorPtr),*it); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     return false; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -1209,15 +1209,16 @@ namespace MWWorld | |||
|                 for (std::vector<std::string>::iterator cit = collisions.begin(); cit != collisions.end(); ++cit) | ||||
|                 { | ||||
|                     MWWorld::Ptr ptr = getPtrViaHandle(*cit); | ||||
|                     if (MWWorld::Class::get(ptr).isActor()) | ||||
|                     if (MWWorld::Class::get(ptr).isActor() && ptr != MWBase::Environment::get().getWorld()->getPlayerPtr() ) | ||||
|                     { | ||||
|                         // Collided with actor, ask actor to try to avoid door
 | ||||
|                         MWMechanics::AiSequence& seq = MWWorld::Class::get(ptr).getCreatureStats(ptr).getAiSequence(); | ||||
|                         if(seq.getTypeId() != MWMechanics::AiPackage::TypeIdAvoidDoor) //Only add it once
 | ||||
|                             seq.stack(MWMechanics::AiAvoidDoor(it->first),ptr); | ||||
| 
 | ||||
|                         // we need to undo the rotation
 | ||||
|                         localRotateObject(it->first, 0, 0, oldRot); | ||||
|                         break; | ||||
|                         //break; //Removed in case ultiple actors are touching
 | ||||
|                     } | ||||
|                 } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue