2024-12-21 10:04:04 +08:00
|
|
|
|
#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 )
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
}
|