#include "StdAfx.h" #include "DnTargetStateEffectChecker.h" #include "DnActor.h" #include "DnBlow.h" #ifndef USE_BOOST_MEMPOOL #ifdef _DEBUG #define new new(_NORMAL_BLOCK,__FILE__,__LINE__) #endif #endif CDnTargetStateEffectChecker::CDnTargetStateEffectChecker( DnActorHandle hActor, STATE_BLOW::emBLOW_INDEX targetStateIndex, float fRadiusDistToSearch, bool bCheckSkillUser ) : IDnSkillUsableChecker( hActor ), m_targetStateIndex( targetStateIndex ), m_fRadiusDistToSearch( fRadiusDistToSearch ), m_bCheckSkillUser(bCheckSkillUser) { m_iType = TARGET_STATEEFECT_CHECKER; } CDnTargetStateEffectChecker::~CDnTargetStateEffectChecker(void) { } bool CDnTargetStateEffectChecker::CanUse( void ) { int nCheckCount = 0; if( m_hHasActor && m_targetStateIndex != STATE_BLOW::BLOW_NONE) { DNVector(DnActorHandle) vlhTargetActors; CDnActor::ScanActorByActorSize( ARG_STATIC_FUNC(m_hHasActor) *m_hHasActor->GetPosition(), m_hHasActor->GetUnitSize() + m_fRadiusDistToSearch, vlhTargetActors, false, true ); 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; //Ÿ°Ù ¾×ÅͰ¡ ¼³Á¤µÈ »óÅÂÈ¿°ú°¡ Àû¿ë µÇ¾î ÀÖ´ÂÁö È®ÀÎ if (hTargetActor->IsAppliedThisStateBlow(m_targetStateIndex) == true) { //½ºÅ³À¯Àú üũ Àΰæ¿ì if (m_bCheckSkillUser == true) { DNVector( DnBlowHandle ) vlhBlows; hTargetActor->GatherAppliedStateBlowByBlowIndex(m_targetStateIndex, vlhBlows); int nBlowCount = (int)vlhBlows.size(); for (int i = 0; i < nBlowCount; ++i) { DnBlowHandle hBlow = vlhBlows[i]; if (!hBlow || hBlow->IsEnd()) continue; CDnSkill::SkillInfo* pSkillInfo = const_cast(hBlow->GetParentSkillInfo()); if (pSkillInfo && pSkillInfo->hSkillUser == m_hHasActor) nCheckCount++; } } //½ºÅ³À¯Àú üũ ¾Æ´Ñ°æ¿ì else nCheckCount++; } } } return (nCheckCount > 0); } IDnSkillUsableChecker* CDnTargetStateEffectChecker::Clone() { CDnTargetStateEffectChecker* pNewChecker = new CDnTargetStateEffectChecker(m_hHasActor, m_targetStateIndex, m_fRadiusDistToSearch, m_bCheckSkillUser); return pNewChecker; }