#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()) // ¸ó½ºÅÍ´Â ½ºÄµ¿¢ÅÍ ¾²´Ï±ñ ¸®ÇÁ·¡½¬ ŸÀÓ°¸À» Á»´õ ¸¹ÀÌ ´Ã¸®µµ·Ï ÇϰڴÙ. nRefreshTime = 600; #endif // ÁÖº¯ µ¿·áµéÀ» ¸ð¾Æ¼­ »õ·Î µé¾î¿Â ³à¼®Àº È¿°úÁÙ ³à¼®µé ¼ÂÆÃ if( LocalTime - m_LastAuraCheckTime > nRefreshTime ) { //assert( m_hHasActor->IsEnabledAuraSkill() && "¿À¶ó ÇÁ·Î¼¼¼­ ½ÇÇàÁß¿¡´Â ¿À¶ó ½ºÅ³ ¹ßµ¿ ÁßÀ̾î¾ß ÇÔ" ); DnSkillHandle hAuraSkill = m_hHasActor->GetEnabledAuraSkill(); if( NULL == hAuraSkill ) return; // ¸ó½ºÅͰ¡ ¿À¶ó ½ºÅ³À» ¾²´Â °æ¿ìµµ »ý°åÀ¸¹Ç·Î Ç÷¹À̾îÀÎ °æ¿ì¿£ ÆÄƼ·Î È帵éÀ» ¸ð¾ÆÁÖ°í, // ¸ó½ºÅÍÀÎ °æ¿ì´Â ScanActor ¸¦ ¾µ ¼ö ¹Û¿¡ ¾ø´Ù.. (#15461) DNVector( DnActorHandle ) vlActors; if( m_hHasActor->IsPlayerActor() ) { CDnPartyTask* pPartyTask = static_cast(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 setPrevAuraMember = m_setPartyMemberInAura; m_setPartyMemberInAura.clear(); for( int i = 0; i < (int)vlActors.size(); ++i ) { DnActorHandle hActor = vlActors.at( i ); // À¯È¿ÇÏÁö ¾ÊÀº °´Ã¼´Â ¹«½Ã. if( !hActor ) continue; // ÀÚ±â ÀÚ½ÅÀº ÆÐ½º.. if( hActor != m_hHasActor ) { #if defined(PRE_FIX_55383) bool bSkip = false; CDnSkill::TargetTypeEnum skillTargetType = hAuraSkill->GetTargetType(); switch(skillTargetType) { case CDnSkill::TargetTypeEnum::Self: //À§¿¡¼­ ÀÚ½ÅÀº ½ºÅµ Çϴµ¥. ÀÏ´Ü ÄÚµå´Â ¿©±â Àû¿ë ÇØ³õ´Â´Ù. { bSkip = hActor != m_hHasActor; } break; case CDnSkill::TargetTypeEnum::Enemy: //ÀûÀ¸·Î ¼³Á¤ µÇ¾î Àִµ¥, °°Àº ÆÀÀÌ¸é ½ºÅµ { 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: //¾Æ±ºÀ¸·Î ¼³Á¤ µÇ¾î Àִµ¥ ´Ù¸¥ ÆÀÀÌ¸é ½ºÅµ { 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: //ÀÏ´Ü Friend¿Í µ¿ÀÏ ÇÏ°Ô Ã³¸® Çϰí, ³ªÁß¿¡ ¿äûÀÌ ÀÖÀ¸¸é ¼Òȯ ¸ó½ºÅÍ Àΰæ¿ì´Â Party°¡ ¾Æ´ÔÀ¸·Î ó¸®? { 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 // Ç÷¹À̾îÀÎ °æ¿ì, pvp ¿¡¼­´Â ¸ðµÎ PartyStruct ¿¡ ÀÖÀ¸¹Ç·Î ÆÀ ±¸ºÐÀÌ ÇÊ¿äÇÏ´Ù. // ¸ó½ºÅÍÀÎ °æ¿ì¿£ scanactor ¸¦ »ç¿ëÇϹǷΠ¸¶Âù°¡Áö. 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 // °°Àº ¿À¶ó ½ºÅ³À» ½ÃÀüÇϰí ÀÖ´Â ³à¼®Àº Á¦¿Ü. DnSkillHandle hIfNewMemberAuraSkill = hActor->GetEnabledAuraSkill(); if( hIfNewMemberAuraSkill && hIfNewMemberAuraSkill->GetClassID() == hAuraSkill->GetClassID() ) continue; // ´Ù¸¥ ij¸¯ÅÍÀÇ °°Àº ¿À¶ó ½ºÅ³ÀÇ È¿°ú°¡ Àû¿ëµÈ ´ë»óÀº Á¦¿ÜÇÑ´Ù. ¿À¶ó ½ºÅ³ È¿°úÀÇ ÁßøÀ» Çã¿ëÇÒ °æ¿ì // È¿°ú°¡ ´ëüµÇ¾î¹ö¸° °æ¿ì ´Ù¸¥ ¾×ÅÍÀÇ AuraProcessor ¿£ ´ë»óÀÌ ³²¾ÆÀÖ´Â »óŰ¡ µÇ¾î // ¿À¶ó¸¦ Ç®¾î¹ö¸± °æ¿ì ´Ù¸¥ ij¸¯ÅÍÀÇ ¿À¶ó ¿µ¿ª¿¡ ÀÖ´õ¶óµµ È¿°ú Àû¿ëÀÌ ¾ÈµÈ´Ù. 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; // ¸ó½ºÅÍÀÎ °æ¿ì¿£ ScanActor ¸¦ »ç¿ëÇϱ⠶§¹®¿¡ ¹üÀ§ ¾È¿¡ ÀÖ´Â ³ðµé¸¸ °Ë»öµÇ¾î // µû·Î °Å¸®Ã¼Å©¸¦ ÇÒ ÇÊ¿ä ¾ø´Ù. 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 ); // ÀÏÁ¤ °Å¸® ÀÌÇÏÀÎ ¾ÖµéÀº Áý¾î³Ö°í,, ÀÏ´Ü °Å¸®´Â ÀÓÀÇ´ë·Î Á¤Çسõ´Â´Ù. (300) if( fDistSQ < m_fRangeSQ ) bInRange = true; } if( bInRange ) m_setPartyMemberInAura.insert( hActor->GetUniqueID() ); } } // set ÀÇ Â÷ÁýÇÕÀ¸·Î »õ·Î µé¾î°£ ³à¼®°ú ºüÁø ³à¼®µéÀ» °ñ¶ó³¿. vector vlNewMember; set_difference( m_setPartyMemberInAura.begin(), m_setPartyMemberInAura.end(), setPrevAuraMember.begin(), setPrevAuraMember.end(), back_inserter(vlNewMember) ); vector 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 ) { // ¿À¶ó°¡ °®°í ÀÖ´Â target »óÅÂÈ¿°ú Ãß°¡. 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Àΰæ¿ì ´ë»óÀÌ ÀÚ½ÅÀ̾î¾ß ÇÑ´Ù. { bCanApply = m_hHasActor == hNewMember; } break; case CDnSkill::ApplyTarget: //´ë»óÀÌ ÀÚ½ÅÀÌ ¾Æ´Ï¸é ÆÀ »ó°ü ¾øÀÌ { bCanApply = m_hHasActor != hNewMember; } break; case CDnSkill::ApplyAll: //¹«Á¶°Ç { bCanApply = true; } break; case CDnSkill::ApplyEnemy: //ÆÀÀÌ ´Ù¸¥ °æ¿ì¸¸ { 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: //ÆÀÀÌ °°Àº °æ¿ì¸¸.. { 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 ) { // ¿À¶ó°¡ °®°í ÀÖ´Â »óÅÂÈ¿°ú Á¦°Å. DnActorHandle hOutMember = CDnActor::FindActorFromUniqueID( m_hHasActor->GetRoom(), vlOutMember.at(iMember) ); if( hOutMember ) { //// °°Àº ¿À¶ó ½ºÅ³À» ½ÃÀüÇϰí ÀÖ´Â ³à¼®Àº ½Å°æ¾²Áö ¾Ê´Â´Ù. //DnSkillHandle hIfOutMemberAuraSkill = hOutMember->GetEnabledAuraSkill(); //if( hIfOutMemberAuraSkill && // hIfOutMemberAuraSkill->GetClassID() == hAuraSkill->GetClassID() ) // continue; // °°Àº ¿À¶ó ½ºÅ³À» ½ÃÀüÇϰí ÀÖ´õ¶óµµ °É·ÁÀÖ´Â ¹öÇÁ´Â ³» ¿À¶ó·Î °É¾îÁØ °ÍÀÏ ¼öµµ ÀÖÀ¸¹Ç·Î // »óÅÂÈ¿°ú »ý¼º½Ã¿¡ ºÎ¿©µÈ ¾ÆÀ̵ð·Î »óÅÂÈ¿°ú Á¦°Å. //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& 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; // ¿À¶ó ½ºÅ³À̶ó¸é ¿À¶ó°¡ °®°í ÀÖ´Â »óÅÂÈ¿°ú Á¦°Å. set::iterator iter = m_setPartyMemberInAura.begin(); //assert( m_hHasActor->IsEnabledAuraSkill() && "¿À¶ó ÇÁ·Î¼¼¼­ ½ÇÇàÁß¿¡´Â ¿À¶ó ½ºÅ³ ¹ßµ¿ ÁßÀ̾î¾ß ÇÔ" ); 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& 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; }