Merge pull request #1217 from Allofich/follow

Fix loading 0-duration Follow and Escort packages
This commit is contained in:
scrawl 2017-02-17 21:10:15 +01:00 committed by GitHub
commit f2174ee9f4
2 changed files with 23 additions and 21 deletions

View file

@ -45,8 +45,8 @@ namespace MWMechanics
, mCellY(std::numeric_limits<int>::max()) , mCellY(std::numeric_limits<int>::max())
{ {
// mDuration isn't saved in the save file, so just giving it "1" for now if the package has a duration. // mDuration isn't saved in the save file, so just giving it "1" for now if the package has a duration.
// The exact value of mDuration only matters for repeating packages // The exact value of mDuration only matters for repeating packages.
if (mRemainingDuration != 0) if (mRemainingDuration > 0) // Previously mRemainingDuration could be negative even when mDuration was 0. Checking for > 0 should fix old saves.
mDuration = 1; mDuration = 1;
else else
mDuration = 0; mDuration = 0;
@ -62,7 +62,7 @@ namespace MWMechanics
{ {
// If AiEscort has ran for as long or longer then the duration specified // If AiEscort has ran for as long or longer then the duration specified
// and the duration is not infinite, the package is complete. // and the duration is not infinite, the package is complete.
if(mDuration > 0) if (mDuration > 0)
{ {
mRemainingDuration -= ((duration*MWBase::Environment::get().getWorld()->getTimeScaleFactor()) / 3600); mRemainingDuration -= ((duration*MWBase::Environment::get().getWorld()->getTimeScaleFactor()) / 3600);
if (mRemainingDuration <= 0) if (mRemainingDuration <= 0)
@ -90,13 +90,13 @@ namespace MWMechanics
(differenceBetween[0] * differenceBetween[0]) + (differenceBetween[1] * differenceBetween[1]) + (differenceBetween[2] * (differenceBetween[0] * differenceBetween[0]) + (differenceBetween[1] * differenceBetween[1]) + (differenceBetween[2] *
differenceBetween[2]); differenceBetween[2]);
if(distanceBetweenResult <= mMaxDist * mMaxDist) if (distanceBetweenResult <= mMaxDist * mMaxDist)
{ {
ESM::Pathgrid::Point point(static_cast<int>(mX), static_cast<int>(mY), static_cast<int>(mZ)); ESM::Pathgrid::Point point(static_cast<int>(mX), static_cast<int>(mY), static_cast<int>(mZ));
point.mAutogenerated = 0; point.mAutogenerated = 0;
point.mConnectionNum = 0; point.mConnectionNum = 0;
point.mUnknown = 0; point.mUnknown = 0;
if(pathTo(actor,point,duration)) //Returns true on path complete if (pathTo(actor,point,duration)) //Returns true on path complete
{ {
mRemainingDuration = mDuration; mRemainingDuration = mDuration;
return true; return true;
@ -140,10 +140,11 @@ namespace MWMechanics
sequence.mPackages.push_back(package); sequence.mPackages.push_back(package);
} }
void AiEscort::fastForward(const MWWorld::Ptr& actor, AiState &state) void AiEscort::fastForward(const MWWorld::Ptr& actor, AiState &state)
{ {
// Update duration counter // Update duration counter if this package has a duration
if (mDuration > 0)
mRemainingDuration--; mRemainingDuration--;
} }
} }

View file

@ -52,9 +52,9 @@ AiFollow::AiFollow(const ESM::AiSequence::AiFollow *follow)
, mActorRefId(follow->mTargetId), mActorId(-1) , mActorRefId(follow->mTargetId), mActorId(-1)
, mCellId(follow->mCellId), mActive(follow->mActive), mFollowIndex(mFollowIndexCounter++) , mCellId(follow->mCellId), mActive(follow->mActive), mFollowIndex(mFollowIndexCounter++)
{ {
// mDuration isn't saved in the save file, so just giving it "1" for now if the package has a duration. // mDuration isn't saved in the save file, so just giving it "1" for now if the package had a duration.
// The exact value of mDuration only matters for repeating packages // The exact value of mDuration only matters for repeating packages.
if (mRemainingDuration != 0) if (mRemainingDuration > 0) // Previously mRemainingDuration could be negative even when mDuration was 0. Checking for > 0 should fix old saves.
mDuration = 1; mDuration = 1;
else else
mDuration = 0; mDuration = 0;
@ -104,10 +104,10 @@ bool AiFollow::execute (const MWWorld::Ptr& actor, CharacterController& characte
++i; ++i;
} }
if(!mAlwaysFollow) //Update if you only follow for a bit if (!mAlwaysFollow) //Update if you only follow for a bit
{ {
//Check if we've run out of time //Check if we've run out of time
if (mDuration != 0) if (mDuration > 0)
{ {
mRemainingDuration -= ((duration*MWBase::Environment::get().getWorld()->getTimeScaleFactor()) / 3600); mRemainingDuration -= ((duration*MWBase::Environment::get().getWorld()->getTimeScaleFactor()) / 3600);
if (mRemainingDuration <= 0) if (mRemainingDuration <= 0)
@ -117,18 +117,18 @@ bool AiFollow::execute (const MWWorld::Ptr& actor, CharacterController& characte
} }
} }
if((pos.pos[0]-mX)*(pos.pos[0]-mX) + if ((pos.pos[0]-mX)*(pos.pos[0]-mX) +
(pos.pos[1]-mY)*(pos.pos[1]-mY) + (pos.pos[1]-mY)*(pos.pos[1]-mY) +
(pos.pos[2]-mZ)*(pos.pos[2]-mZ) < followDistance*followDistance) //Close-ish to final position (pos.pos[2]-mZ)*(pos.pos[2]-mZ) < followDistance*followDistance) //Close-ish to final position
{ {
if(actor.getCell()->isExterior()) //Outside? if (actor.getCell()->isExterior()) //Outside?
{ {
if(mCellId == "") //No cell to travel to if (mCellId == "") //No cell to travel to
return true; return true;
} }
else else
{ {
if(mCellId == actor.getCell()->getCell()->mName) //Cell to travel to if (mCellId == actor.getCell()->getCell()->mName) //Cell to travel to
return true; return true;
} }
} }
@ -228,7 +228,8 @@ int AiFollow::getFollowIndex() const
void AiFollow::fastForward(const MWWorld::Ptr& actor, AiState &state) void AiFollow::fastForward(const MWWorld::Ptr& actor, AiState &state)
{ {
// Update duration counter // Update duration counter if this package has a duration
if (mDuration > 0)
mRemainingDuration--; mRemainingDuration--;
} }