2014-05-03 10:23:22 +00:00
# include "aipursue.hpp"
2014-04-02 04:18:22 +00:00
2014-06-12 21:27:04 +00:00
# include <components/esm/aisequence.hpp>
2015-07-25 02:14:22 +00:00
# include <components/esm/loadmgef.hpp>
2014-06-12 21:27:04 +00:00
2014-04-02 04:18:22 +00:00
# include "../mwbase/environment.hpp"
# include "../mwworld/class.hpp"
# include "../mwworld/action.hpp"
# include "movement.hpp"
# include "creaturestats.hpp"
2014-05-17 15:20:57 +00:00
namespace MWMechanics
{
AiPursue : : AiPursue ( const MWWorld : : Ptr & actor )
: mTargetActorId ( actor . getClass ( ) . getCreatureStats ( actor ) . getActorId ( ) )
2014-04-02 04:18:22 +00:00
{
}
2014-06-12 21:27:04 +00:00
AiPursue : : AiPursue ( const ESM : : AiSequence : : AiPursue * pursue )
: mTargetActorId ( pursue - > mTargetActorId )
{
}
2014-05-17 15:20:57 +00:00
AiPursue * MWMechanics : : AiPursue : : clone ( ) const
2014-04-02 04:18:22 +00:00
{
2014-05-03 10:23:22 +00:00
return new AiPursue ( * this ) ;
2014-04-02 04:18:22 +00:00
}
2015-06-26 15:47:04 +00:00
bool AiPursue : : execute ( const MWWorld : : Ptr & actor , CharacterController & characterController , AiState & state , float duration )
2014-04-02 04:18:22 +00:00
{
2014-08-23 20:55:32 +00:00
if ( actor . getClass ( ) . getCreatureStats ( actor ) . isDead ( ) )
return true ;
2014-05-13 01:05:32 +00:00
ESM : : Position pos = actor . getRefData ( ) . getPosition ( ) ; //position of the actor
2014-05-17 15:20:57 +00:00
const MWWorld : : Ptr target = MWBase : : Environment : : get ( ) . getWorld ( ) - > searchPtrViaActorId ( mTargetActorId ) ; //The target to follow
2014-04-02 04:18:22 +00:00
2014-09-14 08:49:33 +00:00
if ( target = = MWWorld : : Ptr ( ) | | ! target . getRefData ( ) . getCount ( ) | | ! target . getRefData ( ) . isEnabled ( ) // Really we should be checking whether the target is currently registered
// with the MechanicsManager
)
2014-05-17 15:20:57 +00:00
return true ; //Target doesn't exist
2014-05-03 15:14:59 +00:00
2015-08-09 02:20:55 +00:00
if ( isTargetMagicallyHidden ( target ) )
2014-12-21 16:34:34 +00:00
return true ;
2014-08-23 20:55:32 +00:00
if ( target . getClass ( ) . getCreatureStats ( target ) . isDead ( ) )
return true ;
2014-07-28 15:28:00 +00:00
actor . getClass ( ) . getCreatureStats ( actor ) . setDrawState ( DrawState_Nothing ) ;
2014-05-13 01:05:32 +00:00
//Set the target desition from the actor
ESM : : Pathgrid : : Point dest = target . getRefData ( ) . getPosition ( ) . pos ;
2014-04-02 04:18:22 +00:00
2014-05-13 01:05:32 +00:00
if ( distance ( dest , pos . pos [ 0 ] , pos . pos [ 1 ] , pos . pos [ 2 ] ) < 100 ) { //Stop when you get close
actor . getClass ( ) . getMovementSettings ( actor ) . mPosition [ 1 ] = 0 ;
2014-05-15 01:01:48 +00:00
target . getClass ( ) . activate ( target , actor ) . get ( ) - > execute ( actor ) ; //Arrest player
2014-04-02 04:18:22 +00:00
return true ;
}
2014-05-13 07:58:32 +00:00
else {
pathTo ( actor , dest , duration ) ; //Go to the destination
}
2014-04-02 04:18:22 +00:00
2014-05-13 01:05:32 +00:00
actor . getClass ( ) . getCreatureStats ( actor ) . setMovementFlag ( MWMechanics : : CreatureStats : : Flag_Run , true ) ; //Make NPC run
2014-04-02 04:18:22 +00:00
return false ;
}
2014-05-17 15:20:57 +00:00
int AiPursue : : getTypeId ( ) const
2014-04-02 04:18:22 +00:00
{
2014-05-03 10:23:22 +00:00
return TypeIdPursue ;
2014-04-02 04:18:22 +00:00
}
2014-05-12 20:05:30 +00:00
2014-05-17 15:20:57 +00:00
MWWorld : : Ptr AiPursue : : getTarget ( ) const
2014-05-12 20:05:30 +00:00
{
2014-05-17 15:20:57 +00:00
return MWBase : : Environment : : get ( ) . getWorld ( ) - > searchPtrViaActorId ( mTargetActorId ) ;
2014-05-12 20:05:30 +00:00
}
2014-05-17 15:20:57 +00:00
2014-06-12 21:27:04 +00:00
void AiPursue : : writeState ( ESM : : AiSequence : : AiSequence & sequence ) const
{
std : : auto_ptr < ESM : : AiSequence : : AiPursue > pursue ( new ESM : : AiSequence : : AiPursue ( ) ) ;
pursue - > mTargetActorId = mTargetActorId ;
ESM : : AiSequence : : AiPackageContainer package ;
package . mType = ESM : : AiSequence : : Ai_Pursue ;
package . mPackage = pursue . release ( ) ;
sequence . mPackages . push_back ( package ) ;
}
2014-05-17 15:20:57 +00:00
} // namespace MWMechanics