diff --git a/apps/openmw/mwmechanics/aicombat.cpp b/apps/openmw/mwmechanics/aicombat.cpp index 283c7f0426..f246185106 100644 --- a/apps/openmw/mwmechanics/aicombat.cpp +++ b/apps/openmw/mwmechanics/aicombat.cpp @@ -1,5 +1,4 @@ #include "aicombat.hpp" -#include "aifollow.hpp" #include "movement.hpp" @@ -39,7 +38,7 @@ namespace MWMechanics mTimerAttack(0), mTimerReact(0), mTimerCombatMove(0), - mFollowTarget(false), + mCloseUp(false), mReadyToAttack(false), mStrike(false), mCombatMove(false), @@ -183,7 +182,7 @@ namespace MWMechanics Ogre::Vector3 vDir = vDest - vStart; float distBetween = vDir.length(); - if(distBetween < rangeMelee || (distBetween <= rangeCloseUp && mFollowTarget) ) + if(distBetween < rangeMelee || (distBetween <= rangeCloseUp && mCloseUp) ) { //Melee and Close-up combat vDir.z = 0; @@ -193,10 +192,13 @@ namespace MWMechanics // TODO: use movement settings instead of rotating directly MWBase::Environment::get().getWorld()->rotateObject(actor, 0, 0, zAngle, false); + if(mPathFinder.isPathConstructed()) + mPathFinder.clearPath(); + //MWWorld::Class::get(actor).getMovementSettings(actor).mPosition[1] = 0; //bool LOS = MWBase::Environment::get().getWorld()->getLOS(actor, mTarget); - if (mFollowTarget && distBetween > rangeMelee) + if (mCloseUp && distBetween > rangeMelee) { //Close-up combat: just run up on target mMovement.mPosition[1] = 1; @@ -212,7 +214,7 @@ namespace MWMechanics mTimerCombatMove = 0.1f + 0.1f * static_cast(rand())/RAND_MAX; mCombatMove = true; } - else if(actor.getClass().isNpc() && (!distantCombat || (distantCombat && rangeMelee/5))) + else if(!distantCombat || (distantCombat && rangeMelee/5)) { //apply sideway movement (kind of dodging) with some probability if(static_cast(rand())/RAND_MAX < 0.25) @@ -230,19 +232,13 @@ namespace MWMechanics mReadyToAttack = true; //only once got in melee combat, actor is allowed to use close-up shortcutting - mFollowTarget = true; + mCloseUp = true; } } else { - //target is at far distance: build path to target OR follow target (if previously actor had reached it once) - - /* - //apply when AIFOLLOW package implementation will be existent - if(mFollowTarget) - actor.getClass().getCreatureStats(actor).getAiSequence().stack(AiFollow(mTarget));*/ - - mFollowTarget = false; + //target is at far distance: build & follow the path + mCloseUp = false; buildNewPath(actor); @@ -344,8 +340,7 @@ namespace MWMechanics //maybe here is a mistake (?): PathFinder::getPathSize() returns number of grid points in the path, //not the actual path length. Here we should know if the new path is actually more effective. //if(pathFinder2.getPathSize() < mPathFinder.getPathSize()) - newPathFinder.syncStart(mPathFinder.getPath()); - mPathFinder = newPathFinder; + mPathFinder = newPathFinder; } } } diff --git a/apps/openmw/mwmechanics/aicombat.hpp b/apps/openmw/mwmechanics/aicombat.hpp index a24183c65e..ab9b9a8214 100644 --- a/apps/openmw/mwmechanics/aicombat.hpp +++ b/apps/openmw/mwmechanics/aicombat.hpp @@ -37,7 +37,7 @@ namespace MWMechanics float mTimerCombatMove; bool mReadyToAttack, mStrike; - bool mFollowTarget; + bool mCloseUp; bool mCombatMove; MWMechanics::Movement mMovement; diff --git a/apps/openmw/mwmechanics/pathfinding.cpp b/apps/openmw/mwmechanics/pathfinding.cpp index fd44fcc4ce..c8bc9b49cf 100644 --- a/apps/openmw/mwmechanics/pathfinding.cpp +++ b/apps/openmw/mwmechanics/pathfinding.cpp @@ -4,7 +4,6 @@ #include "../mwbase/environment.hpp" #include "OgreMath.h" -#include "OgreVector3.h" #include #include @@ -234,21 +233,5 @@ namespace MWMechanics return false; } - - void PathFinder::syncStart(const std::list &path) - { - std::list::const_iterator oldStart = path.begin(); - std::list::iterator iter = ++mPath.begin(); - - if( (*iter).mX == oldStart->mX - && (*iter).mY == oldStart->mY - && (*iter).mZ == oldStart->mZ - && (*iter).mAutogenerated == oldStart->mAutogenerated - && (*iter).mConnectionNum == oldStart->mConnectionNum ) - { - mPath.pop_front(); - } - - } } diff --git a/apps/openmw/mwmechanics/pathfinding.hpp b/apps/openmw/mwmechanics/pathfinding.hpp index de58f5db87..916df850b5 100644 --- a/apps/openmw/mwmechanics/pathfinding.hpp +++ b/apps/openmw/mwmechanics/pathfinding.hpp @@ -37,11 +37,6 @@ namespace MWMechanics return mPath; } - //When first point of newly created path is the nearest to actor point, then - //the cituation can occure when this point is undesirable (if the 2nd point of new path == the 1st point of old path) - //This functions deletes that point. - void syncStart(const std::list &path); - private: std::list mPath; bool mIsPathConstructed;