DragonNest/GameCommon/DnTargetStateChecker.cpp

95 lines
4.9 KiB
C++
Raw Normal View History

2024-12-20 16:56:44 +08:00
<EFBFBD><EFBFBD>#include "StdAfx.h"
#include "DnTargetStateChecker.h"
#include "DnActor.h"
#ifndef USE_BOOST_MEMPOOL
#ifdef _DEBUG
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
#endif
#endif
CDnTargetStateChecker::CDnTargetStateChecker( DnActorHandle hActor, CDnActorState::ActorStateEnum eRequiredState,
int iOperator, float fRadiusDistToSearch ) : IDnSkillUsableChecker( hActor ),
m_eRequiredState( eRequiredState ),
m_iOperator( iOperator ),
m_fRadiusDistToSearch( fRadiusDistToSearch )
{
m_iType = TARGET_STATE_CHECKER;
}
CDnTargetStateChecker::~CDnTargetStateChecker(void)
{
}
bool CDnTargetStateChecker::CanUse( void )
{
bool bResult = false;
if( m_hHasActor )
{
DNVector(DnActorHandle) vlhTargetActors;
CDnActor::ScanActor( ARG_STATIC_FUNC(m_hHasActor) *m_hHasActor->GetPosition(), m_hHasActor->GetUnitSize() + m_fRadiusDistToSearch, vlhTargetActors );
EtVector3 vDistance;
EtVector3 vDir;
int iNumTargetActors = (int)vlhTargetActors.size();
for( int i = 0; i < iNumTargetActors; ++i )
{
DnActorHandle hTargetActor = vlhTargetActors.at( i );
if( hTargetActor == m_hHasActor->GetMySmartPtr() )
continue;
if( hTargetActor->IsDie() )
continue;
vDistance = *hTargetActor->GetPosition() - *m_hHasActor->GetPosition();
float fLength = EtVec3Length( &vDistance );
EtVec3Normalize( &vDir, &vDistance );
if( EtToDegree( EtAcos( EtVec3Dot( &m_hHasActor->GetMatEx()->m_vZAxis, &vDir ) ) ) > 70.0f )
continue;
switch( m_iOperator )
{
// $<EFBFBD>\<EFBFBD><EFBFBD><EFBFBD> t<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>t<EFBFBD><EFBFBD>̹ <EFBFBD><EFBFBD>l<EFBFBD>\<EFBFBD><EFBFBD><EFBFBD>. <EFBFBD><EFBFBD>x<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><<EFBFBD>t<EFBFBD> D<EFBFBD><EFBFBD><EFBFBD> p<EFBFBD>i<EFBFBD>t<EFBFBD>0<EFBFBD> L<EFBFBD>8<EFBFBD><EFBFBD><EFBFBD>
// <EFBFBD>p<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> J<EFBFBD><EFBFBD><EFBFBD><EFBFBD> X<EFBFBD>ij<EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD><EFBFBD> J<EFBFBD>L<EFBFBD>.
case OP_EQUAL:
if( hTargetActor->GetState() == m_eRequiredState )
bResult = true;
break;
case OP_NOT_EQUAL:
if( hTargetActor->GetState() != m_eRequiredState )
bResult = true;
break;
////////////////////////////////////
case OP_AND:
if( hTargetActor->GetState() & m_eRequiredState )
bResult = true;
break;
case OP_NOT_AND:
if( !(hTargetActor->GetState() & m_eRequiredState) )
bResult = true;
break;
}
}
}
return bResult;
}
IDnSkillUsableChecker* CDnTargetStateChecker::Clone()
{
CDnTargetStateChecker* pNewChecker = new CDnTargetStateChecker(m_hHasActor, m_eRequiredState, m_iOperator, m_fRadiusDistToSearch);
return pNewChecker;
}