forked from teamnwah/openmw-tes3coop
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 "../mwworld/cellstore.hpp"
|
||||||
#include "creaturestats.hpp"
|
#include "creaturestats.hpp"
|
||||||
#include "movement.hpp"
|
#include "movement.hpp"
|
||||||
|
#include "mechanicsmanagerimp.hpp"
|
||||||
|
|
||||||
#include <OgreMath.h>
|
#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[1] = -1 * std::sin(dirToDoor); //I knew I'd use trig someday
|
||||||
actor.getClass().getMovementSettings(actor).mPosition[0] = -1 * std::cos(dirToDoor);
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1209,15 +1209,16 @@ namespace MWWorld
|
||||||
for (std::vector<std::string>::iterator cit = collisions.begin(); cit != collisions.end(); ++cit)
|
for (std::vector<std::string>::iterator cit = collisions.begin(); cit != collisions.end(); ++cit)
|
||||||
{
|
{
|
||||||
MWWorld::Ptr ptr = getPtrViaHandle(*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
|
// Collided with actor, ask actor to try to avoid door
|
||||||
MWMechanics::AiSequence& seq = MWWorld::Class::get(ptr).getCreatureStats(ptr).getAiSequence();
|
MWMechanics::AiSequence& seq = MWWorld::Class::get(ptr).getCreatureStats(ptr).getAiSequence();
|
||||||
if(seq.getTypeId() != MWMechanics::AiPackage::TypeIdAvoidDoor) //Only add it once
|
if(seq.getTypeId() != MWMechanics::AiPackage::TypeIdAvoidDoor) //Only add it once
|
||||||
seq.stack(MWMechanics::AiAvoidDoor(it->first),ptr);
|
seq.stack(MWMechanics::AiAvoidDoor(it->first),ptr);
|
||||||
|
|
||||||
// we need to undo the rotation
|
// we need to undo the rotation
|
||||||
localRotateObject(it->first, 0, 0, oldRot);
|
localRotateObject(it->first, 0, 0, oldRot);
|
||||||
break;
|
//break; //Removed in case ultiple actors are touching
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue