DragonNest/GameCommon/DnRangeChecker.cpp
Cussrro 47f7895977 Revert "修复编码问题"
This reverts commit 9e69c01767.
2024-12-21 10:04:04 +08:00

92 lines
2.1 KiB
C++

#include "StdAfx.h"
#include "DnRangeChecker.h"
#include "DnActor.h"
#ifdef _CLIENT
#include "DnHideMonsterActor.h"
#include "DnPetActor.h"
#ifdef PRE_FIX_GUIDEDARROW_ON_PVPTOURNAMENT
#include "DnStateBlow.h"
#endif
#endif
#ifndef USE_BOOST_MEMPOOL
#ifdef _DEBUG
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
#endif
#endif
CDnRangeChecker::CDnRangeChecker( DnActorHandle hActor ) : IDnSkillUsableChecker( hActor ),
m_iRange( 0 )
{
m_iType = RANGE_CHECKER;
}
CDnRangeChecker::~CDnRangeChecker(void)
{
}
bool CDnRangeChecker::CanUse( void )
{
#ifdef _GAMESERVER
return true;
#else
bool bResult = false;
DNVector(DnActorHandle) vlActors;
CDnActor::ScanActor( (*m_hHasActor->GetPosition()), (float)m_iRange, vlActors );
int iNumActors = (int)vlActors.size();
for( int iActor = 0; iActor < iNumActors; ++iActor )
{
DnActorHandle hTargetActor = vlActors.at( iActor );
// #32115 특정 목적으로 안보이는 몬스터로 생성한 액터는 패스.
if( hTargetActor->IsMonsterActor() )
{
if( NULL != dynamic_cast<CDnHideMonsterActor*>(hTargetActor.GetPointer()) )
continue;
if( hTargetActor->GetActorType() == CDnActor::NoAggroTrap )
continue;
}
if ( NULL != dynamic_cast<CDnPetActor*>(hTargetActor.GetPointer()))
continue;
// 자신과 다른 팀의 액터들을 NPC 를 제외하고 체크한다.
if( hTargetActor->GetTeam() != m_hHasActor->GetTeam() )
{
#ifdef PRE_FIX_GUIDEDARROW_ON_PVPTOURNAMENT
CDnStateBlow* pTargetStateBlow = hTargetActor->GetStateBlow();
if (pTargetStateBlow && pTargetStateBlow->IsApplied( STATE_BLOW::BLOW_230 ))
continue;
#endif
// 죽은 애들과 npc 들은 제외
if( (hTargetActor->GetActorType() != CDnActorState::Npc) &&
(hTargetActor->GetActorType() != CDnActorState::Vehicle) &&
(false == hTargetActor->IsDie()) && hTargetActor->CDnActorState::IsHittable() )
{
bResult = true;
break;
}
}
}
return bResult;
#endif
}
IDnSkillUsableChecker* CDnRangeChecker::Clone()
{
CDnRangeChecker* pNewChecker = new CDnRangeChecker(m_hHasActor);
if (pNewChecker)
pNewChecker->SetRange(GetRange());
return pNewChecker;
}