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"
2017-04-16 17:26:06 +00:00
/*
Start of tes3mp addition
Include additional headers for multiplayer purposes
*/
2019-08-19 18:39:33 +00:00
# include <components/openmw-mp/TimedLog.hpp>
2017-04-16 17:26:06 +00:00
# include "../mwgui/windowmanagerimp.hpp"
2017-09-04 12:13:05 +00:00
# include "../mwmp/Main.hpp"
# include "../mwmp/LocalPlayer.hpp"
2017-04-16 17:26:06 +00:00
/*
End of tes3mp addition
*/
2014-04-02 04:18:22 +00:00
# include "movement.hpp"
# include "creaturestats.hpp"
2014-05-17 15:20:57 +00:00
namespace MWMechanics
{
AiPursue : : AiPursue ( const MWWorld : : Ptr & actor )
2014-04-02 04:18:22 +00:00
{
2017-11-21 16:00:51 +00:00
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 )
{
2017-11-21 16:00:51 +00:00
mTargetActorId = pursue - > mTargetActorId ;
2014-06-12 21:27:04 +00:00
}
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-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 ;
2017-04-16 17:26:06 +00:00
/*
Start of tes3mp addition
Because multiplayer does not pause the game , prevent infinite arrest loops by ignoring
players already engaged in dialogue
2018-02-25 19:33:04 +00:00
Additionally , do not arrest players who are currently jailed
2017-04-16 17:26:06 +00:00
*/
if ( target = = MWBase : : Environment : : get ( ) . getWorld ( ) - > getPlayerPtr ( ) )
{
2018-02-25 19:33:04 +00:00
if ( MWBase : : Environment : : get ( ) . getWindowManager ( ) - > containsMode ( MWGui : : GM_Dialogue ) | |
MWBase : : Environment : : get ( ) . getWindowManager ( ) - > containsMode ( MWGui : : GM_Jail ) )
2017-04-16 17:26:06 +00:00
{
return true ;
}
}
/*
End of tes3mp addition
*/
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 ;
2017-11-02 19:01:22 +00:00
ESM : : Position aPos = actor . getRefData ( ) . getPosition ( ) ;
2014-04-02 04:18:22 +00:00
2017-11-02 19:01:22 +00:00
float pathTolerance = 100.0 ;
2017-04-16 17:26:06 +00:00
2017-11-02 19:01:22 +00:00
if ( pathTo ( actor , dest , duration , pathTolerance ) & &
2017-11-13 20:36:55 +00:00
std : : abs ( dest . mZ - aPos . pos [ 2 ] ) < pathTolerance ) // check the true distance in case the target is far away in Z-direction
2017-11-02 19:01:22 +00:00
{
2017-09-04 12:13:05 +00:00
/*
Start of tes3mp addition
Record that the player has not died since the last attempt to arrest them
2017-12-16 05:21:02 +00:00
Close the player ' s inventory or open container and cancel any drag and drops
2017-09-04 12:13:05 +00:00
*/
2019-08-19 18:39:33 +00:00
LOG_MESSAGE_SIMPLE ( TimedLog : : LOG_INFO , " After being pursued by %s, diedSinceArrestAttempt is now false " , actor . getCellRef ( ) . getRefId ( ) . c_str ( ) ) ;
2017-09-04 12:13:05 +00:00
mwmp : : Main : : get ( ) . getLocalPlayer ( ) - > diedSinceArrestAttempt = false ;
2017-12-16 05:21:02 +00:00
mwmp : : Main : : get ( ) . getLocalPlayer ( ) - > closeInventoryWindows ( ) ;
2017-09-04 12:13:05 +00:00
/*
End of tes3mp addition
*/
2017-12-16 05:21:02 +00:00
target . getClass ( ) . activate ( target , actor ) . get ( ) - > execute ( actor ) ; //Arrest player when reached
2017-09-04 12:13:05 +00:00
2014-04-02 04:18:22 +00:00
return true ;
}
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
{
2017-04-28 15:30:26 +00:00
std : : unique_ptr < ESM : : AiSequence : : AiPursue > pursue ( new ESM : : AiSequence : : AiPursue ( ) ) ;
2014-06-12 21:27:04 +00:00
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