365 lines
12 KiB
C++
365 lines
12 KiB
C++
|
|
#include "StdAfx.h"
|
|||
|
|
#include "DnAuraProcessor.h"
|
|||
|
|
#include "DnActor.h"
|
|||
|
|
#include "TaskManager.h"
|
|||
|
|
#include "DnPartyTask.h"
|
|||
|
|
#include "DNUserSession.h"
|
|||
|
|
#include "DnGameRoom.h"
|
|||
|
|
#include "DnBlow.h"
|
|||
|
|
#include "DnGameTask.h"
|
|||
|
|
|
|||
|
|
|
|||
|
|
CDnAuraProcessor::CDnAuraProcessor( DnActorHandle hActor, float fRange ) : IDnSkillProcessor( hActor ),
|
|||
|
|
m_fRange( fRange ),
|
|||
|
|
m_fRangeSQ( fRange*fRange ),
|
|||
|
|
m_LastAuraCheckTime( 0 ),
|
|||
|
|
m_bAuraOff( false )
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CDnAuraProcessor::~CDnAuraProcessor(void)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
void CDnAuraProcessor::OnBegin( LOCAL_TIME LocalTime, float fDelta, DnSkillHandle hParentSkill )
|
|||
|
|
{
|
|||
|
|
m_LastAuraCheckTime = LocalTime;
|
|||
|
|
m_setPartyMemberInAura.clear();
|
|||
|
|
m_mapAuraMemberSEID.clear();
|
|||
|
|
m_bAuraOff = false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
void CDnAuraProcessor::Process( LOCAL_TIME LocalTime, float fDelta )
|
|||
|
|
{
|
|||
|
|
CDnGameTask *pGameTask = (CDnGameTask *)CTaskManager::GetInstance(m_hHasActor->GetRoom()).GetTask( "GameTask" );
|
|||
|
|
if( pGameTask && pGameTask->GetGameTaskType() == GameTaskType::Farm )
|
|||
|
|
return;
|
|||
|
|
|
|||
|
|
int nRefreshTime = 30;
|
|||
|
|
|
|||
|
|
#ifdef PRE_ADD_AURA_FOR_MONSTER
|
|||
|
|
if(m_hHasActor->IsMonsterActor()) // <20><><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD> <20><>ĵ<EFBFBD><C4B5><EFBFBD><EFBFBD> <20><><EFBFBD>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ÿ<>Ӱ<EFBFBD><D3B0><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ø<EFBFBD><C3B8><EFBFBD><EFBFBD><EFBFBD> <20>ϰڴ<CFB0>.
|
|||
|
|
nRefreshTime = 600;
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
// <20>ֺ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ƽ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>༮<EFBFBD><E0BCAE> ȿ<><C8BF><EFBFBD><EFBFBD> <20>༮<EFBFBD><E0BCAE> <20><><EFBFBD><EFBFBD>
|
|||
|
|
if( LocalTime - m_LastAuraCheckTime > nRefreshTime )
|
|||
|
|
{
|
|||
|
|
//assert( m_hHasActor->IsEnabledAuraSkill() && "<22><><EFBFBD><EFBFBD> <20><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߿<EFBFBD><DFBF><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų <20>ߵ<EFBFBD> <20><><EFBFBD>̾<EFBFBD><CCBE><EFBFBD> <20><>" );
|
|||
|
|
DnSkillHandle hAuraSkill = m_hHasActor->GetEnabledAuraSkill();
|
|||
|
|
|
|||
|
|
if( NULL == hAuraSkill )
|
|||
|
|
return;
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>쵵 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> <20>÷<EFBFBD><C3B7>̾<EFBFBD><CCBE><EFBFBD> <20><><EFBFBD>쿣 <20><>Ƽ<EFBFBD><C6BC> <20>ĺ<EFBFBD><C4BA><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ְ<EFBFBD>,
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ScanActor <20><> <20><> <20><> <20>ۿ<EFBFBD> <20><><EFBFBD><EFBFBD>.. (#15461)
|
|||
|
|
DNVector( DnActorHandle ) vlActors;
|
|||
|
|
if( m_hHasActor->IsPlayerActor() )
|
|||
|
|
{
|
|||
|
|
CDnPartyTask* pPartyTask = static_cast<CDnPartyTask*>(CTaskManager::GetInstancePtr(m_hHasActor->GetRoom())->GetTask( "PartyTask" ));
|
|||
|
|
if (pPartyTask)
|
|||
|
|
{
|
|||
|
|
vlActors.reserve( pPartyTask->GetUserCount() );
|
|||
|
|
for( int i = 0; i < (int)pPartyTask->GetUserCount(); ++i )
|
|||
|
|
{
|
|||
|
|
CDNGameRoom::PartyStruct* pPartyData = pPartyTask->GetPartyData( i );
|
|||
|
|
vlActors.push_back( pPartyData->pSession->GetActorHandle() );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
CDnActor::ScanActor( m_hHasActor->GetRoom(), *(m_hHasActor->GetPosition()), m_fRange, vlActors );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
set<DWORD> setPrevAuraMember = m_setPartyMemberInAura;
|
|||
|
|
m_setPartyMemberInAura.clear();
|
|||
|
|
|
|||
|
|
for( int i = 0; i < (int)vlActors.size(); ++i )
|
|||
|
|
{
|
|||
|
|
DnActorHandle hActor = vlActors.at( i );
|
|||
|
|
|
|||
|
|
// <20><>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD>.
|
|||
|
|
if( !hActor )
|
|||
|
|
continue;
|
|||
|
|
|
|||
|
|
// <20>ڱ<EFBFBD> <20>ڽ<EFBFBD><DABD><EFBFBD> <20>н<EFBFBD>..
|
|||
|
|
if( hActor != m_hHasActor )
|
|||
|
|
{
|
|||
|
|
#if defined(PRE_FIX_55383)
|
|||
|
|
bool bSkip = false;
|
|||
|
|
CDnSkill::TargetTypeEnum skillTargetType = hAuraSkill->GetTargetType();
|
|||
|
|
switch(skillTargetType)
|
|||
|
|
{
|
|||
|
|
case CDnSkill::TargetTypeEnum::Self: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڽ<EFBFBD><DABD><EFBFBD> <20><>ŵ <20>ϴµ<CFB4>. <20>ϴ<EFBFBD> <20>ڵ<EFBFBD><DAB5><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>س<EFBFBD><D8B3>´<EFBFBD>.
|
|||
|
|
{
|
|||
|
|
bSkip = hActor != m_hHasActor;
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case CDnSkill::TargetTypeEnum::Enemy: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD> <20>ִµ<D6B4>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD≯<EFBFBD> <20><>ŵ
|
|||
|
|
{
|
|||
|
|
int nMyTeam = m_hHasActor->GetTeam();
|
|||
|
|
if (m_hHasActor->IsAppliedThisStateBlow(STATE_BLOW::BLOW_149))
|
|||
|
|
nMyTeam = m_hHasActor->GetOriginalTeam();
|
|||
|
|
|
|||
|
|
int nTargetTeam = hActor->GetTeam();
|
|||
|
|
if (hActor->IsAppliedThisStateBlow(STATE_BLOW::BLOW_149))
|
|||
|
|
nTargetTeam = hActor->GetOriginalTeam();
|
|||
|
|
|
|||
|
|
bSkip = nMyTeam == nTargetTeam;
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case CDnSkill::TargetTypeEnum::Friend: //<2F>Ʊ<EFBFBD><C6B1><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD> <20>ִµ<D6B4> <20>ٸ<EFBFBD> <20><><EFBFBD≯<EFBFBD> <20><>ŵ
|
|||
|
|
{
|
|||
|
|
int nMyTeam = m_hHasActor->GetTeam();
|
|||
|
|
if (m_hHasActor->IsAppliedThisStateBlow(STATE_BLOW::BLOW_149))
|
|||
|
|
nMyTeam = m_hHasActor->GetOriginalTeam();
|
|||
|
|
|
|||
|
|
int nTargetTeam = hActor->GetTeam();
|
|||
|
|
if (hActor->IsAppliedThisStateBlow(STATE_BLOW::BLOW_149))
|
|||
|
|
nTargetTeam = hActor->GetOriginalTeam();
|
|||
|
|
|
|||
|
|
bSkip = nMyTeam != nTargetTeam;
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case CDnSkill::TargetTypeEnum::Party: //<2F>ϴ<EFBFBD> Friend<6E><64> <20><><EFBFBD><EFBFBD> <20>ϰ<EFBFBD> ó<><C3B3> <20>ϰ<EFBFBD>, <20><><EFBFBD>߿<EFBFBD> <20><>û<EFBFBD><C3BB> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ΰ<EFBFBD><CEB0><EFBFBD><EFBFBD><EFBFBD> Party<74><79> <20>ƴ<EFBFBD><C6B4><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3>?
|
|||
|
|
{
|
|||
|
|
int nMyTeam = m_hHasActor->GetTeam();
|
|||
|
|
if (m_hHasActor->IsAppliedThisStateBlow(STATE_BLOW::BLOW_149))
|
|||
|
|
nMyTeam = m_hHasActor->GetOriginalTeam();
|
|||
|
|
|
|||
|
|
int nTargetTeam = hActor->GetTeam();
|
|||
|
|
if (hActor->IsAppliedThisStateBlow(STATE_BLOW::BLOW_149))
|
|||
|
|
nTargetTeam = hActor->GetOriginalTeam();
|
|||
|
|
|
|||
|
|
bSkip = nMyTeam != nTargetTeam;
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case CDnSkill::TargetTypeEnum::All:
|
|||
|
|
bSkip = false;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (bSkip == true)
|
|||
|
|
continue;
|
|||
|
|
|
|||
|
|
#else
|
|||
|
|
// <20>÷<EFBFBD><C3B7>̾<EFBFBD><CCBE><EFBFBD> <20><><EFBFBD><EFBFBD>, pvp <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> PartyStruct <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʿ<EFBFBD><CABF>ϴ<EFBFBD>.
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>쿣 scanactor <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϹǷ<CFB9> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
if( hActor->GetTeam() != m_hHasActor->GetTeam()
|
|||
|
|
#ifdef PRE_ADD_AURA_FOR_MONSTER
|
|||
|
|
&& hAuraSkill->GetTargetType() != CDnSkill::TargetTypeEnum::Enemy
|
|||
|
|
|| (hAuraSkill->GetTargetType() == CDnSkill::TargetTypeEnum::Enemy && hActor->GetTeam() == m_hHasActor->GetTeam())
|
|||
|
|
#endif
|
|||
|
|
)
|
|||
|
|
continue;
|
|||
|
|
#endif // PRE_FIX_55383
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>ִ<EFBFBD> <20>༮<EFBFBD><E0BCAE> <20><><EFBFBD><EFBFBD>.
|
|||
|
|
DnSkillHandle hIfNewMemberAuraSkill = hActor->GetEnabledAuraSkill();
|
|||
|
|
if( hIfNewMemberAuraSkill &&
|
|||
|
|
hIfNewMemberAuraSkill->GetClassID() == hAuraSkill->GetClassID() )
|
|||
|
|
continue;
|
|||
|
|
|
|||
|
|
// <20>ٸ<EFBFBD> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> ȿ<><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. <20><><EFBFBD><EFBFBD> <20><>ų ȿ<><C8BF><EFBFBD><EFBFBD> <20><>ø<EFBFBD><C3B8> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
// ȿ<><C8BF><EFBFBD><EFBFBD> <20><>ü<EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> AuraProcessor <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD> <20><><EFBFBD>°<EFBFBD> <20>Ǿ<EFBFBD>
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ǯ<><C7AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ٸ<EFBFBD> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD><EFBFBD> ȿ<><C8BF> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵȴ<C8B5>.
|
|||
|
|
bool bSameAuraSkillsBlow = false;
|
|||
|
|
DNVector(DnBlowHandle) vlhAppliedBlow;
|
|||
|
|
hActor->GetAllAppliedStateBlow( vlhAppliedBlow );
|
|||
|
|
DNVector(DnBlowHandle)::iterator iter = vlhAppliedBlow.begin();
|
|||
|
|
for( iter; iter != vlhAppliedBlow.end(); ++iter )
|
|||
|
|
{
|
|||
|
|
const CDnSkill::SkillInfo* pParentSkillInfo = (*iter)->GetParentSkillInfo();
|
|||
|
|
if( m_hHasActor != pParentSkillInfo->hSkillUser &&
|
|||
|
|
pParentSkillInfo->iSkillID == hAuraSkill->GetClassID() )
|
|||
|
|
{
|
|||
|
|
bSameAuraSkillsBlow = true;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( bSameAuraSkillsBlow )
|
|||
|
|
continue;
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>쿣 ScanActor <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ȿ<EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD>鸸 <20>˻<EFBFBD><CBBB>Ǿ<EFBFBD>
|
|||
|
|
// <20><><EFBFBD><EFBFBD> <20>Ÿ<EFBFBD>üũ<C3BC><C5A9> <20><> <20>ʿ<EFBFBD> <20><><EFBFBD><EFBFBD>.
|
|||
|
|
bool bInRange = true;
|
|||
|
|
if( m_hHasActor->IsPlayerActor() )
|
|||
|
|
{
|
|||
|
|
bInRange = false;
|
|||
|
|
const EtVector3* pPos = hActor->GetPosition();
|
|||
|
|
const EtVector3* pMyPos = m_hHasActor->GetPosition();
|
|||
|
|
|
|||
|
|
EtVector3 vDist = *pPos - *pMyPos;
|
|||
|
|
float fDistSQ = EtVec3LengthSq( &vDist );
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD> <20>Ÿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ֵ<EFBFBD><D6B5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ְ<EFBFBD>,, <20>ϴ<EFBFBD> <20>Ÿ<EFBFBD><C5B8><EFBFBD> <20><><EFBFBD>Ǵ<EFBFBD><C7B4><EFBFBD> <20><><EFBFBD>س<EFBFBD><D8B3>´<EFBFBD>. (300)
|
|||
|
|
if( fDistSQ < m_fRangeSQ )
|
|||
|
|
bInRange = true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( bInRange )
|
|||
|
|
m_setPartyMemberInAura.insert( hActor->GetUniqueID() );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// set <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD> <20>༮<EFBFBD><E0BCAE> <20><><EFBFBD><EFBFBD> <20>༮<EFBFBD><E0BCAE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
vector<DWORD> vlNewMember;
|
|||
|
|
set_difference( m_setPartyMemberInAura.begin(), m_setPartyMemberInAura.end(), setPrevAuraMember.begin(), setPrevAuraMember.end(),
|
|||
|
|
back_inserter(vlNewMember) );
|
|||
|
|
|
|||
|
|
vector<DWORD> vlOutMember;
|
|||
|
|
set_difference( setPrevAuraMember.begin(), setPrevAuraMember.end(), m_setPartyMemberInAura.begin(), m_setPartyMemberInAura.end(),
|
|||
|
|
back_inserter(vlOutMember) );
|
|||
|
|
|
|||
|
|
int iNumNewMember = (int)vlNewMember.size();
|
|||
|
|
for( int iMember = 0; iMember < iNumNewMember; ++iMember )
|
|||
|
|
{
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> target <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20>߰<EFBFBD>.
|
|||
|
|
DnActorHandle hNewMember = CDnActor::FindActorFromUniqueID( m_hHasActor->GetRoom(), vlNewMember.at(iMember) );
|
|||
|
|
if( hNewMember )
|
|||
|
|
{
|
|||
|
|
DWORD dwNumStateEffect = hAuraSkill->GetStateEffectCount();
|
|||
|
|
for( DWORD dwStateEffect = 0; dwStateEffect < dwNumStateEffect; ++dwStateEffect )
|
|||
|
|
{
|
|||
|
|
const CDnSkill::StateEffectStruct* pSE = hAuraSkill->GetStateEffectFromIndex( dwStateEffect );
|
|||
|
|
#if defined(PRE_FIX_55383)
|
|||
|
|
bool bCanApply = false;
|
|||
|
|
switch(pSE->ApplyType)
|
|||
|
|
{
|
|||
|
|
case CDnSkill::ApplySelf: //Self<6C>ΰ<EFBFBD><CEB0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڽ<EFBFBD><DABD>̾<EFBFBD><CCBE><EFBFBD> <20>Ѵ<EFBFBD>.
|
|||
|
|
{
|
|||
|
|
bCanApply = m_hHasActor == hNewMember;
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case CDnSkill::ApplyTarget: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڽ<EFBFBD><DABD><EFBFBD> <20>ƴϸ<C6B4> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
bCanApply = m_hHasActor != hNewMember;
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case CDnSkill::ApplyAll: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
bCanApply = true;
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case CDnSkill::ApplyEnemy: //<2F><><EFBFBD><EFBFBD> <20>ٸ<EFBFBD> <20><><EFBFBD>츸
|
|||
|
|
{
|
|||
|
|
int nMyTeam = m_hHasActor->GetTeam();
|
|||
|
|
if (m_hHasActor->IsAppliedThisStateBlow(STATE_BLOW::BLOW_149))
|
|||
|
|
nMyTeam = m_hHasActor->GetOriginalTeam();
|
|||
|
|
|
|||
|
|
int nTargetTeam = hNewMember->GetTeam();
|
|||
|
|
if (hNewMember->IsAppliedThisStateBlow(STATE_BLOW::BLOW_149))
|
|||
|
|
nTargetTeam = hNewMember->GetOriginalTeam();
|
|||
|
|
|
|||
|
|
bCanApply = nMyTeam != nTargetTeam;
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case CDnSkill::ApplyFriend: //<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>츸..
|
|||
|
|
{
|
|||
|
|
int nMyTeam = m_hHasActor->GetTeam();
|
|||
|
|
if (m_hHasActor->IsAppliedThisStateBlow(STATE_BLOW::BLOW_149))
|
|||
|
|
nMyTeam = m_hHasActor->GetOriginalTeam();
|
|||
|
|
|
|||
|
|
int nTargetTeam = hNewMember->GetTeam();
|
|||
|
|
if (hNewMember->IsAppliedThisStateBlow(STATE_BLOW::BLOW_149))
|
|||
|
|
nTargetTeam = hNewMember->GetOriginalTeam();
|
|||
|
|
|
|||
|
|
bCanApply = nMyTeam == nTargetTeam;
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (bCanApply == true)
|
|||
|
|
{
|
|||
|
|
int iID = hNewMember->CmdAddStateEffect( /*m_hHasActor,*/ hAuraSkill->GetInfo(), (STATE_BLOW::emBLOW_INDEX)pSE->nID, -1/*SE.nDurationTime*/, pSE->szValue.c_str() );
|
|||
|
|
m_mapAuraMemberSEID[ hNewMember->GetUniqueID() ].push_back( iID );
|
|||
|
|
}
|
|||
|
|
#else
|
|||
|
|
if( CDnSkill::ApplyTarget == pSE->ApplyType )
|
|||
|
|
{
|
|||
|
|
int iID = hNewMember->CmdAddStateEffect( /*m_hHasActor,*/ hAuraSkill->GetInfo(), (STATE_BLOW::emBLOW_INDEX)pSE->nID, -1/*SE.nDurationTime*/, pSE->szValue.c_str() );
|
|||
|
|
m_mapAuraMemberSEID[ hNewMember->GetUniqueID() ].push_back( iID );
|
|||
|
|
}
|
|||
|
|
#endif // PRE_FIX_55383
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int iNumOutMember = (int)vlOutMember.size();
|
|||
|
|
for( int iMember = 0; iMember < iNumOutMember; ++iMember )
|
|||
|
|
{
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD>.
|
|||
|
|
DnActorHandle hOutMember = CDnActor::FindActorFromUniqueID( m_hHasActor->GetRoom(), vlOutMember.at(iMember) );
|
|||
|
|
if( hOutMember )
|
|||
|
|
{
|
|||
|
|
//// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>ִ<EFBFBD> <20>༮<EFBFBD><E0BCAE> <20>Ű澲<C5B0><E6BEB2> <20>ʴ´<CAB4>.
|
|||
|
|
//DnSkillHandle hIfOutMemberAuraSkill = hOutMember->GetEnabledAuraSkill();
|
|||
|
|
//if( hIfOutMemberAuraSkill &&
|
|||
|
|
// hIfOutMemberAuraSkill->GetClassID() == hAuraSkill->GetClassID() )
|
|||
|
|
// continue;
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD><EFBFBD> <20>ɷ<EFBFBD><C9B7>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɾ<EFBFBD><C9BE><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>
|
|||
|
|
// <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD> <20>ο<EFBFBD><CEBF><EFBFBD> <20><><EFBFBD>̵<EFBFBD><CCB5><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD>.
|
|||
|
|
//DWORD dwNumStateEffect = hAuraSkill->GetStateEffectCount();
|
|||
|
|
//for( DWORD dwStateEffect = 0; dwStateEffect < dwNumStateEffect; ++dwStateEffect )
|
|||
|
|
//{
|
|||
|
|
// const CDnSkill::StateEffectStruct* pSE = hAuraSkill->GetStateEffectFromIndex( dwStateEffect );
|
|||
|
|
// if( CDnSkill::ApplyTarget == pSE->ApplyType )
|
|||
|
|
// hOutMember->CmdRemoveStateEffect( (STATE_BLOW::emBLOW_INDEX)pSE->nID );
|
|||
|
|
//}
|
|||
|
|
|
|||
|
|
vector<int>& vlBlowIDsToRemove = m_mapAuraMemberSEID[ hOutMember->GetUniqueID() ];
|
|||
|
|
for( int i = 0; i < (int)vlBlowIDsToRemove.size(); ++i )
|
|||
|
|
hOutMember->CmdRemoveStateEffectFromID( vlBlowIDsToRemove.at(i) );
|
|||
|
|
|
|||
|
|
m_mapAuraMemberSEID.erase( hOutMember->GetUniqueID() );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
m_LastAuraCheckTime = LocalTime;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
void CDnAuraProcessor::OnEnd( LOCAL_TIME LocalTime, float fDelta )
|
|||
|
|
{
|
|||
|
|
if( m_setPartyMemberInAura.empty() )
|
|||
|
|
return;
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD>̶<EFBFBD><CCB6><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD>.
|
|||
|
|
set<DWORD>::iterator iter = m_setPartyMemberInAura.begin();
|
|||
|
|
|
|||
|
|
//assert( m_hHasActor->IsEnabledAuraSkill() && "<22><><EFBFBD><EFBFBD> <20><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߿<EFBFBD><DFBF><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų <20>ߵ<EFBFBD> <20><><EFBFBD>̾<EFBFBD><CCBE><EFBFBD> <20><>" );
|
|||
|
|
DnSkillHandle hAuraSkill = m_hHasActor->GetEnabledAuraSkill();
|
|||
|
|
|
|||
|
|
if( hAuraSkill )
|
|||
|
|
{
|
|||
|
|
for( iter; iter != m_setPartyMemberInAura.end(); ++iter )
|
|||
|
|
{
|
|||
|
|
DnActorHandle hMember = CDnActor::FindActorFromUniqueID( m_hHasActor->GetRoom(), *iter );
|
|||
|
|
|
|||
|
|
if( hMember )
|
|||
|
|
{
|
|||
|
|
vector<int>& vlBlowIDsToRemove = m_mapAuraMemberSEID[ hMember->GetUniqueID() ];
|
|||
|
|
for( int i = 0; i < (int)vlBlowIDsToRemove.size(); ++i )
|
|||
|
|
hMember->CmdRemoveStateEffectFromID( vlBlowIDsToRemove.at(i) );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
m_setPartyMemberInAura.clear();
|
|||
|
|
m_mapAuraMemberSEID.clear();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
m_bAuraOff = true;
|
|||
|
|
}
|