DragonNest/GameCommon/DnRangeSEProcessor.cpp

110 lines
3.3 KiB
C++
Raw Permalink Normal View History

#include "StdAfx.h"
#include "DnRangeSEProcessor.h"
#include "DnStateBlow.h"
CDnRangeSEProcessor::CDnRangeSEProcessor( DnActorHandle hActor, float fRange, float fProbability, int iTargetEffectOutputID, int iDurationTime ) :
IDnSkillProcessor( hActor ),
m_fRange( fRange ), m_fProbability( fProbability ),
m_bFinished( false ),
m_iTargetEffectOutputID( iTargetEffectOutputID ),
m_iDurationTime( iDurationTime )
{
m_iType = RANGE_STATE_EFFECT;
}
CDnRangeSEProcessor::~CDnRangeSEProcessor(void)
{
}
void CDnRangeSEProcessor::OnBegin( LOCAL_TIME LocalTime, float fDelta, DnSkillHandle hParentSkill )
{
m_setAffectedActor.clear();
m_fTimeLength = (float)m_iDurationTime / 1000.0f;
}
// <20><> <20><> <20><><EFBFBD><EFBFBD> <20>ֺ<EFBFBD> <20>˻<EFBFBD><CBBB>ؼ<EFBFBD> <20>־<EFBFBD><D6BE><EFBFBD>.
void CDnRangeSEProcessor::Process( LOCAL_TIME LocalTime, float fDelta )
{
m_fTimeLength -= fDelta;
if( m_fTimeLength <= 0.0f )
m_fTimeLength = 0.0f;
// <20>ֺ<EFBFBD><D6BA><EFBFBD> <20>˻<EFBFBD><CBBB>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD> Ȯ<><C8AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20>־<EFBFBD><D6BE><EFBFBD>.
CDnSkill::TargetTypeEnum TargetType = m_hParentSkill->GetTargetType();
//_ASSERT( CDnSkill::Self != TargetType );
DNVector(DnActorHandle) vlhNearbyActors;
CDnActor::ScanActor( m_hHasActor->GetRoom(), *(m_hHasActor->GetPosition()), m_fRange, vlhNearbyActors );
int iNumActors = (int)vlhNearbyActors.size();
for( int iActor = 0; iActor < iNumActors; ++iActor )
{
DnActorHandle hActor = vlhNearbyActors.at( iActor );
if( m_hHasActor == hActor )
continue;
if( m_setAffectedActor.find( hActor->GetUniqueID() ) != m_setAffectedActor.end() )
continue;
// canhit <20>ñ׳<C3B1><D7B3><EFBFBD> true <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..
if( false == hActor->IsHittable( m_hHasActor, LocalTime ) )
continue;
switch( TargetType )
{
case CDnSkill::Enemy:
case CDnSkill::Self:
if( m_hHasActor->GetTeam() == hActor->GetTeam() )
continue;
break;
case CDnSkill::Friend:
case CDnSkill::Party:
if( m_hHasActor->GetTeam() != hActor->GetTeam() )
continue;
break;
}
if( _rand(m_hHasActor->GetRoom())%100 <= m_fProbability*100.0f )
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20>߰<EFBFBD> <20><><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8> <20><>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><>øó<C3B8><C3B3> <20><><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
map<int, bool> mapDuplicateResult;
CDnSkill::CanApply eResult = CDnSkill::CanApplySkillStateEffect( hActor, m_hParentSkill, mapDuplicateResult );
if( CDnSkill::Fail != eResult )
{
m_setAffectedActor.insert( hActor->GetUniqueID() );
DWORD dwNumStateEffect = m_hParentSkill->GetStateEffectCount();
for( DWORD dwStateEffect = 0; dwStateEffect < dwNumStateEffect; ++dwStateEffect )
{
const CDnSkill::StateEffectStruct* pSE = m_hParentSkill->GetStateEffectFromIndex( dwStateEffect );
if( CDnSkill::ApplyTarget == pSE->ApplyType )
{
CDnSkill::SkillInfo SkillInfo = *(m_hParentSkill->GetInfo());
char szBuff[128] = {0, };
_snprintf_s(szBuff, _countof(szBuff), _TRUNCATE, "%d", m_iTargetEffectOutputID );
SkillInfo.szEffectOutputIDToClient = szBuff;
if( !hActor->IsImmuned( (STATE_BLOW::emBLOW_INDEX)pSE->nID ) ) // #47379 <20><EFBFBD><E9BFAA> <20><><EFBFBD>󿡰Դ<F3BFA1B0> <20>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD> <20>ʵ<EFBFBD><CAB5><EFBFBD> <20><><EFBFBD><EFBFBD>.
{
int iBlowID = hActor->CmdAddStateEffect( &SkillInfo, (STATE_BLOW::emBLOW_INDEX)pSE->nID, pSE->nDurationTime, pSE->szValue.c_str() );
}
}
}
}
}
}
//m_bFinished = true;
}
void CDnRangeSEProcessor::OnEnd( LOCAL_TIME LocalTime, float fDelta )
{
}