AiWander: resume moving to destination after combat

pull/456/head
Andrei Kortunov 7 years ago
parent 18ff097e4a
commit 81f29d8dcd

@ -79,6 +79,9 @@ namespace MWMechanics
/// Get the target actor the AI is targeted at (not applicable to all AI packages, default return empty Ptr) /// Get the target actor the AI is targeted at (not applicable to all AI packages, default return empty Ptr)
virtual MWWorld::Ptr getTarget() const; virtual MWWorld::Ptr getTarget() const;
/// Get the destination point of the AI package (not applicable to all AI packages, default return (0, 0, 0))
virtual osg::Vec3f getDestination(const MWWorld::Ptr& actor) const { return osg::Vec3f(0, 0, 0); };
/// Return true if having this AiPackage makes the actor side with the target in fights (default false) /// Return true if having this AiPackage makes the actor side with the target in fights (default false)
virtual bool sideWithTarget() const; virtual bool sideWithTarget() const;

@ -335,9 +335,18 @@ namespace MWMechanics
bool AiWander::getRepeat() const bool AiWander::getRepeat() const
{ {
return mRepeat; return mRepeat;
} }
osg::Vec3f AiWander::getDestination(const MWWorld::Ptr& actor) const
{
if (mHasDestination)
return mDestination;
const ESM::Pathgrid::Point currentPosition = actor.getRefData().getPosition().pos;
const osg::Vec3f currentPositionVec3f = osg::Vec3f(currentPosition.mX, currentPosition.mY, currentPosition.mZ);
return currentPositionVec3f;
}
bool AiWander::isPackageCompleted(const MWWorld::Ptr& actor, AiWanderStorage& storage) bool AiWander::isPackageCompleted(const MWWorld::Ptr& actor, AiWanderStorage& storage)
{ {
@ -346,8 +355,8 @@ namespace MWMechanics
// End package if duration is complete // End package if duration is complete
if (mRemainingDuration <= 0) if (mRemainingDuration <= 0)
{ {
stopWalking(actor, storage); stopWalking(actor, storage);
return true; return true;
} }
} }
// if get here, not yet completed // if get here, not yet completed

@ -47,9 +47,11 @@ namespace MWMechanics
virtual void writeState(ESM::AiSequence::AiSequence &sequence) const; virtual void writeState(ESM::AiSequence::AiSequence &sequence) const;
virtual void fastForward(const MWWorld::Ptr& actor, AiState& state); virtual void fastForward(const MWWorld::Ptr& actor, AiState& state);
bool getRepeat() const; bool getRepeat() const;
osg::Vec3f getDestination(const MWWorld::Ptr& actor) const;
enum GreetingState { enum GreetingState {
Greet_None, Greet_None,
Greet_InProgress, Greet_InProgress,

@ -1605,12 +1605,22 @@ namespace MWMechanics
return; return;
// we should return a wandering actor back after combat // we should return a wandering actor back after combat
// TODO: only for stationary wander? // the same thing for actors without AI packages
if (!aiSequence.isInCombat() && aiSequence.getLastRunTypeId() == MWMechanics::AiPackage::TypeIdWander) if (!aiSequence.isInCombat() && aiSequence.getTypeId() <= MWMechanics::AiPackage::TypeIdWander)
{ {
osg::Vec3f pos = ptr.getRefData().getPosition().asVec3(); int typeId = aiSequence.getTypeId();
osg::Vec3f dest;
if (typeId == MWMechanics::AiPackage::TypeIdNone)
{
dest = ptr.getRefData().getPosition().asVec3();
}
else if (typeId == MWMechanics::AiPackage::TypeIdWander)
{
AiPackage* activePackage = aiSequence.getActivePackage();
dest = activePackage->getDestination(ptr);
}
MWMechanics::AiTravel travelPackage(pos.x(), pos.y(), pos.z()); MWMechanics::AiTravel travelPackage(dest.x(), dest.y(), dest.z());
aiSequence.stack(travelPackage, ptr, false); aiSequence.stack(travelPackage, ptr, false);
} }

Loading…
Cancel
Save