#include "StdAfx.h" #include "DnBuffPropComponent.h" #include "DnActor.h" #include "SMScanActor.h" #include "boost/shared_ptr.hpp" #include "DnMonsterActor.h" CDnBuffPropComponent::CDnBuffPropComponent(void) : m_iTargetTeamType( -1 ), m_iMyTeam( -1 ), m_pGameRoom(NULL) { } CDnBuffPropComponent::~CDnBuffPropComponent(void) { // ¹öÇÁ °É·ÁÀÖ´Â ¾×ÅÍµé ¸ðµÎ ³¯·ÁÁÜ. set::iterator iter = m_setAffectingActors.begin(); for( iter; iter != m_setAffectingActors.end(); ++iter ) { DnActorHandle hActor = CDnActor::FindActorFromUniqueID( m_pGameRoom, *iter ); if( hActor ) { map >::iterator iterMap = m_mapAppliedStateEffect.find( hActor->GetUniqueID() ); if( m_mapAppliedStateEffect.end() != iterMap ) { const vector& vlThisPropSEIDs = iterMap->second; int iNumIDs = (int)vlThisPropSEIDs.size(); for( int i = 0; i < iNumIDs; ++i ) hActor->CmdRemoveStateEffectFromID( vlThisPropSEIDs.at(i) ); } } } } void CDnBuffPropComponent::Initialize( CMultiRoom* pRoom, int iTargetTeamType, int iSkillID, int iSkillLevel, const set* pSetTargetActorIDs/* = NULL*/ ) { m_SkillComponent.Initialize( iSkillID, iSkillLevel ); m_pGameRoom = pRoom; m_iTargetTeamType = iTargetTeamType; // ´ë»ó ÆÀ ÁöÁ¤ÀÌ Æ¯Á¤ ¾×ÅÍ ID ´ë»óÀÏ ¶§¸¸ À¯È¿ÇÔ. if( pSetTargetActorIDs ) { _ASSERT( 3 == m_iTargetTeamType ); m_setTargetActorIDs = *pSetTargetActorIDs; } } void CDnBuffPropComponent::OnMessage( const boost::shared_ptr& pMessage ) { const boost::shared_ptr pScanActorMsg = boost::static_pointer_cast(pMessage); set setScanActor = pScanActorMsg->GetScanActorSet(); // »õ·Î Ãß°¡µÈ ¾×ÅÍ. vector vlhNewActors; set_difference( setScanActor.begin(), setScanActor.end(), m_setAffectingActors.begin(), m_setAffectingActors.end(), back_inserter(vlhNewActors) ); // ¹Ù±ùÀ¸·Î ³ª°£ ¾×ÅÍ. vector vlhOutActors; set_difference( m_setAffectingActors.begin(), m_setAffectingActors.end(), setScanActor.begin(), setScanActor.end(), back_inserter(vlhOutActors) ); // Ãß°¡µÈ ¾×ÅÍ¿¡°Ô È¿°ú Ãß°¡. bool bUpdated = false; if( false == vlhNewActors.empty() ) { vector::iterator iter = vlhNewActors.begin(); for( iter; iter != vlhNewActors.end(); ++iter ) { // Ÿ°Ù ŸÀÔ º°·Î ó¸®ÇÔ. Áö¼Ó½Ã°£Àº ¿µ±¸ÀûÀ¸·Î ÇØ³õ°í ¹Ù±ùÀ¸·Î ¹þ¾î³ª¸é »èÁ¦½ÃÄÑÁÜ. // npc ´Â Á¦¿Ü DnActorHandle hActor = CDnActor::FindActorFromUniqueID( m_pGameRoom, *iter ); if( hActor && hActor->GetActorType() < CDnActorState::Npc ) { // ƯÁ¤ ¾×ÅÍ ´ë»óÀÏ ¶© ID ¸Â´Â ¾Öµé¸¸ ó¸®ÇÑ´Ù. bool bTargetActor = false; if( 3 == m_iTargetTeamType ) { if( m_setTargetActorIDs.end() != m_setTargetActorIDs.find(hActor->GetClassID()) ) { bTargetActor = true; } } else { bTargetActor = true; } if( false == bTargetActor ) continue; // »óÅÂÀÌ»ó Add ½Ã¿¡ Áö¼Ó ±¸ºÐ À妽º ó¸® ÇÊ¿ä. // ÇØ´ç ActorÀÇ Áö¼ÓÈ¿°ú ±¸ºÐ À妽º¸¦ ±¸ºÐÇÏ¿© ¼º°øÇÑ °æ¿ì¿¡ »óÅÂÀÌ»ó Ãß°¡ ½ÃÅ´. map mapDuplicateResult; const CDnSkill::SkillInfo& HasSkillInfo = m_SkillComponent.GetSkillInfo(); CDnSkill::CanApply eResult = CDnSkill::CanApplySkillStateEffect( &HasSkillInfo, hActor, HasSkillInfo.iSkillID, HasSkillInfo.iLevel, HasSkillInfo.iSkillDuplicateMethod, HasSkillInfo.iDuplicateCount, mapDuplicateResult ); if( CDnSkill::CanApply::Fail != eResult ) { vector vlAddedSEIDs; int iNumStateEffect = m_SkillComponent.GetNumStateEffect(); for( int iStateEffect = 0; iStateEffect < iNumStateEffect; ++iStateEffect ) { int iActorType = hActor->GetActorType(); const CDnSkill::StateEffectStruct* pStateEffectInfo = m_SkillComponent.GetStateEffectInfo( iStateEffect ); bool bCheckTeam = false; if( 3 != m_iTargetTeamType ) // ƯÁ¤ ¾×ÅÍ ID ´ë»óÀÌ ¾Æ´Ò ¶§. { if( -1 != m_iMyTeam ) { bCheckTeam = (2 == m_iTargetTeamType) || // all (m_iTargetTeamType == 0 && (m_iMyTeam == hActor->GetTeam()) ) || // friend (m_iTargetTeamType == 1 && (m_iMyTeam != hActor->GetTeam()) ); // enemy } else { // #45096 Ç÷¹À̾ ¼ÒȯÇÑ ¸ó½ºÅÍ´Â Ç÷¹ÀÌ¾î ÆÀÀ¸·Î ÆÇ´Ü. if( hActor->IsMonsterActor() ) { CDnMonsterActor* pMonsterActor = static_cast(hActor.GetPointer()); DnActorHandle hSummonerPlayer = pMonsterActor->GetSummonerPlayerActor(); if( hSummonerPlayer ) iActorType = hSummonerPlayer->GetActorType(); } bCheckTeam = (2 == m_iTargetTeamType) || // all (m_iTargetTeamType == 0 && iActorType <= CDnActorState::Reserved6 || iActorType == CDnActorState::Vehicle ) || // player (m_iTargetTeamType == 1 && iActorType > CDnActorState::Reserved6 ); // monster } } else { bCheckTeam = true; } if( bCheckTeam ) { // °°Àº ½ºÅ³ ÁßøÀÏ °æ¿ì¿£ ½ºÅ³ È¿°ú Áß¿¡ È®·ü üũÇÏ´Â °ÍµéÀº ÀÌ¹Ì CanApplySkillStateEffect ¿¡¼­ È®·üüũµÇ°í // Åë°úµÈ »óÅÂÀÌ´Ù. µû¶ó¼­ ¿©±â¼± È®·ü üũ µÈ°ÇÁö È®ÀÎÇÏ°í µÈ°Å¶ó¸é ´Ù½Ã È®·ü üũ ¾ÈÇϵµ·Ï ÇÔ¼ö È£Ãâ ÇØÁØ´Ù. bool bAllowAddThisSE = true; bool bCheckCanBegin = true; if( CDnSkill::CanApply::ApplyDuplicateSameSkill == eResult ) { map::iterator iter = mapDuplicateResult.find( pStateEffectInfo->nID ); // ¸Ê¿¡ ¾ø´Â °æ¿ì ÇöÀç ¾×ÅͰ¡ »óÅÂÈ¿°ú¿¡ °É·ÁÀÖÁö ¾ÊÀ¸¹Ç·Î ±×³É Á¤»óÀûÀ¸·Î »óÅÂÈ¿°ú Ãß°¡ ·çƾ ½ÇÇà. if( mapDuplicateResult.end() != iter ) { // °°Àº ½ºÅ³ÀÇ È®·üÀÖ´Â »óÅÂÈ¿°ú°¡ ÇöÀç °É·ÁÀ־ CanAdd ¸¦ È£ÃâÇØº¸¾ÒÀ¸³ª ½ÇÆÐÇßÀ½. // ÀÌ·± °æ¿ì¿£ »óÅÂÈ¿°ú Ãß°¡ÇÏÁö ¾Ê´Â´Ù. if( false == (iter->second) ) bAllowAddThisSE = false; else // ÀÌ¹Ì CanAdd ¸¦ Åë°úÇÑ »óÅÂÀ̹ǷΠCmdAddStateEffect È£Ã⠽à µû·Î üũÇÏÁö ¾Êµµ·Ï ÇØÁØ´Ù. bCheckCanBegin = false; } } int iID = hActor->CmdAddStateEffect( &m_SkillComponent.GetSkillInfo(), (STATE_BLOW::emBLOW_INDEX)pStateEffectInfo->nID, -1, pStateEffectInfo->szValue.c_str(), false, bCheckCanBegin ); if( -1 != iID ) vlAddedSEIDs.push_back( iID ); } } if( false == vlAddedSEIDs.empty() ) m_mapAppliedStateEffect.insert( make_pair(hActor->GetUniqueID(), vlAddedSEIDs) ); } } } bUpdated = true; } // ¹Ù±ùÀ¸·Î ³ª°£ ¾×ÅÍ¿¡°Ô È¿°ú Á¦°Å. if( false == vlhOutActors.empty() ) { vector::iterator iter = vlhOutActors.begin(); for( iter; iter != vlhOutActors.end(); ++iter ) { DnActorHandle hActor = CDnActor::FindActorFromUniqueID( m_pGameRoom, *iter ); if( hActor && hActor->GetActorType() < CDnActorState::Npc ) { map >::iterator iterMap = m_mapAppliedStateEffect.find( hActor->GetUniqueID() ); if( m_mapAppliedStateEffect.end() != iterMap ) { const vector& vlThisPropSEIDs = iterMap->second; int iNumIDs = (int)vlThisPropSEIDs.size(); for( int i = 0; i < iNumIDs; ++i ) hActor->CmdRemoveStateEffectFromID( vlThisPropSEIDs.at(i) ); m_mapAppliedStateEffect.erase( iterMap ); } } } bUpdated = true; } if( bUpdated ) m_setAffectingActors = setScanActor; } void CDnBuffPropComponent::RemoveAffectedStateEffects( void ) { set::iterator iter = m_setAffectingActors.begin(); for( iter; iter != m_setAffectingActors.end(); ++iter ) { map >::iterator iterMap = m_mapAppliedStateEffect.find( *iter ); if( m_mapAppliedStateEffect.end() != iterMap ) { DnActorHandle hActor = CDnActor::FindActorFromUniqueID( m_pGameRoom, *iter ); if( hActor ) { vector& vlBlowsToRemove = iterMap->second; for( int i = 0; i < (int)vlBlowsToRemove.size(); ++i ) { int iBlowID = vlBlowsToRemove.at( i ); hActor->CmdRemoveStateEffectFromID( iBlowID ); } } } } m_setAffectingActors.clear(); m_mapAppliedStateEffect.clear(); }