1
0
Fork 1
mirror of https://github.com/TES3MP/openmw-tes3mp.git synced 2025-01-20 10:23:51 +00:00

bug fix/logic fix/future suggestion

This commit is contained in:
mrcheko 2014-01-19 22:09:51 +02:00
parent 969340d61b
commit 339399f8b1
5 changed files with 40 additions and 13 deletions

View file

@ -1,4 +1,5 @@
#include "aicombat.hpp" #include "aicombat.hpp"
#include "aifollow.hpp"
#include "movement.hpp" #include "movement.hpp"
@ -39,7 +40,7 @@ namespace MWMechanics
mTimerAttack(0), mTimerAttack(0),
mTimerReact(0), mTimerReact(0),
mTimerCombatMove(0), mTimerCombatMove(0),
mCloseUp(false), mFollowTarget(false),
mReadyToAttack(false), mReadyToAttack(false),
mStrike(false), mStrike(false),
mCombatMove(false), mCombatMove(false),
@ -184,7 +185,7 @@ namespace MWMechanics
Ogre::Vector3 vDir = vDest - vStart; Ogre::Vector3 vDir = vDest - vStart;
float distBetween = vDir.length(); float distBetween = vDir.length();
if(distBetween < rangeMelee || (distBetween <= rangeCloseUp && mCloseUp) ) if(distBetween < rangeMelee || (distBetween <= rangeCloseUp && mFollowTarget) )
{ {
//Melee and Close-up combat //Melee and Close-up combat
vDir.z = 0; vDir.z = 0;
@ -194,13 +195,10 @@ namespace MWMechanics
// TODO: use movement settings instead of rotating directly // TODO: use movement settings instead of rotating directly
MWBase::Environment::get().getWorld()->rotateObject(actor, 0, 0, zAngle, false); MWBase::Environment::get().getWorld()->rotateObject(actor, 0, 0, zAngle, false);
if(mPathFinder.isPathConstructed())
mPathFinder.clearPath();
//MWWorld::Class::get(actor).getMovementSettings(actor).mPosition[1] = 0; //MWWorld::Class::get(actor).getMovementSettings(actor).mPosition[1] = 0;
//bool LOS = MWBase::Environment::get().getWorld()->getLOS(actor, mTarget); //bool LOS = MWBase::Environment::get().getWorld()->getLOS(actor, mTarget);
if (mCloseUp && distBetween > rangeMelee) if (mFollowTarget && distBetween > rangeMelee)
{ {
//Close-up combat: just run up on target //Close-up combat: just run up on target
mMovement.mPosition[1] = 1; mMovement.mPosition[1] = 1;
@ -216,7 +214,7 @@ namespace MWMechanics
mTimerCombatMove = 0.1f + 0.1f * static_cast<float>(rand())/RAND_MAX; mTimerCombatMove = 0.1f + 0.1f * static_cast<float>(rand())/RAND_MAX;
mCombatMove = true; mCombatMove = true;
} }
else if(!distantCombat || (distantCombat && rangeMelee/5)) else if(actor.getClass().isNpc() && (!distantCombat || (distantCombat && rangeMelee/5)))
{ {
//apply sideway movement (kind of dodging) with some probability //apply sideway movement (kind of dodging) with some probability
if(static_cast<float>(rand())/RAND_MAX < 0.25) if(static_cast<float>(rand())/RAND_MAX < 0.25)
@ -234,13 +232,19 @@ namespace MWMechanics
mReadyToAttack = true; mReadyToAttack = true;
//only once got in melee combat, actor is allowed to use close-up shortcutting //only once got in melee combat, actor is allowed to use close-up shortcutting
mCloseUp = true; mFollowTarget = true;
} }
} }
else else
{ {
//target is at far distance: build & follow the path //target is at far distance: build path to target OR follow target (if previously actor had reached it once)
mCloseUp = false;
/*
//apply when AIFOLLOW package implementation will be existent
if(mFollowTarget)
actor.getClass().getCreatureStats(actor).getAiSequence().stack(AiFollow(mTarget));*/
mFollowTarget = false;
buildNewPath(actor); buildNewPath(actor);
@ -342,6 +346,7 @@ namespace MWMechanics
//maybe here is a mistake (?): PathFinder::getPathSize() returns number of grid points in the path, //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. //not the actual path length. Here we should know if the new path is actually more effective.
//if(pathFinder2.getPathSize() < mPathFinder.getPathSize()) //if(pathFinder2.getPathSize() < mPathFinder.getPathSize())
newPathFinder.syncStart(mPathFinder.getPath());
mPathFinder = newPathFinder; mPathFinder = newPathFinder;
} }
} }

View file

@ -37,7 +37,7 @@ namespace MWMechanics
float mTimerCombatMove; float mTimerCombatMove;
bool mReadyToAttack, mStrike; bool mReadyToAttack, mStrike;
bool mCloseUp; bool mFollowTarget;
bool mCombatMove; bool mCombatMove;
MWMechanics::Movement mMovement; MWMechanics::Movement mMovement;

View file

@ -504,7 +504,7 @@ bool CharacterController::updateCreatureState()
} }
mAnimation->play(mCurrentWeapon, Priority_Weapon, mAnimation->play(mCurrentWeapon, Priority_Weapon,
MWRender::Animation::Group_UpperBody, true, MWRender::Animation::Group_All, true,
1, "start", "stop", 1, "start", "stop",
0.0f, 0); 0.0f, 0);
mUpperBodyState = UpperCharState_StartToMinAttack; mUpperBodyState = UpperCharState_StartToMinAttack;

View file

@ -4,6 +4,7 @@
#include "../mwbase/environment.hpp" #include "../mwbase/environment.hpp"
#include "OgreMath.h" #include "OgreMath.h"
#include "OgreVector3.h"
#include <boost/graph/dijkstra_shortest_paths.hpp> #include <boost/graph/dijkstra_shortest_paths.hpp>
#include <boost/graph/adjacency_list.hpp> #include <boost/graph/adjacency_list.hpp>
@ -233,5 +234,21 @@ namespace MWMechanics
return false; return false;
} }
void PathFinder::syncStart(const std::list<ESM::Pathgrid::Point> &path)
{
std::list<ESM::Pathgrid::Point>::const_iterator oldStart = path.begin();
std::list<ESM::Pathgrid::Point>::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();
}
}
} }

View file

@ -37,6 +37,11 @@ namespace MWMechanics
return mPath; 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<ESM::Pathgrid::Point> &path);
private: private:
std::list<ESM::Pathgrid::Point> mPath; std::list<ESM::Pathgrid::Point> mPath;
bool mIsPathConstructed; bool mIsPathConstructed;