DragonNest/GameCommon/DnRangeSEProcessor.cpp

110 lines
6.7 KiB
C++
Raw Normal View History

2024-12-20 16:56:44 +08:00
<EFBFBD><EFBFBD>#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;
}
// 1<EFBFBD> \<EFBFBD> <EFBFBD><EFBFBD>̹ <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>t<EFBFBD><EFBFBD> #<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>.
void CDnRangeSEProcessor::Process( LOCAL_TIME LocalTime, float fDelta )
{
m_fTimeLength -= fDelta;
if( m_fTimeLength <= 0.0f )
m_fTimeLength = 0.0f;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>D<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>t<EFBFBD><EFBFBD> |<EFBFBD><EFBFBD> U<EFBFBD>`<EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ш<EFBFBD><EFBFBD><EFBFBD> #<EFBFBD><EFBFBD><EFBFBD> <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 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>t<EFBFBD> true x<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 )
{
// <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ш<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ѕ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0<EFBFBD>\<EFBFBD> <EFBFBD>¬<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ш<EFBFBD><EFBFBD><EFBFBD> ɩ̘̬<EFBFBD> X<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>.
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 t<EFBFBD><EFBFBD><EFBFBD>x<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ō<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ٳX<EFBFBD><EFBFBD><EFBFBD> J<EFBFBD>ij]<EFBFBD> $<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 )
{
}