#include "StdAfx.h" #include "MASkillUser.h" #include "DnSkill.h" #include "IDnSkillUsableChecker.h" #include "IDnSkillProcessor.h" #include "InputReceiver.h" #include "DnProjectile.h" #include "DnPlayerActor.h" #include "DnChangeProjectileProcessor.h" #include "DnChangeActionStrProcessor.h" #include "DnBlow.h" #include "DnSkillTask.h" #include "DnStateBlow.h" #ifndef _GAMESERVER #include "DnCantUseActiveSkillBlow.h" #include "DnWorld.h" #include "TaskManager.h" #include "DnItemTask.h" #include "DnInterface.h" #else #include "DNUserSession.h" #include "DnApplySEWhenTargetNormalHitProcessor.h" #endif #if defined(_GAMESERVER) #include "DnProbabilityChecker.h" #endif #include "DnCreateBlow.h" #include "SmartPtrDef.h" #if defined(PRE_ADD_TOTAL_LEVEL_SKILL) #include "TotalLevelSkillSystem.h" #endif // PRE_ADD_TOTAL_LEVEL_SKILL #ifdef _DEBUG #define new new(_NORMAL_BLOCK,__FILE__,__LINE__) #endif MASkillUser::MASkillUser() //: m_vSkillTargetPos( 0.f, 0.f, 0.f ) { m_LocalTime = 0; m_pActor = NULL; m_bIsValidActor = true; //m_fAdjustCoolTime = 1.0f; #ifdef _GAMESERVER m_bIgnoreCoolTime = false; #else m_bSkillExecutedThisFrame = false; #endif m_fCoolTimeDeltaAdjustValue = 1.0f; //ZeroMemory( m_aEternityItemApplyStat, sizeof(m_aEternityItemApplyStat) ); } MASkillUser::~MASkillUser() { #ifndef PRE_FIX_SKILLLIST for( DWORD i=0; isecond.hSkill) SAFE_RELEASE_SPTR(iter->second.hSkill); } SAFE_DELETE_MAP(m_prefixSystemDefenceSkills); //°ø°Ý¿ë ½ºÅ³ ÃʱâÈ­ iter = m_prefixSystemOffenceSkills.begin(); endIter = m_prefixSystemOffenceSkills.end(); for (; iter != endIter; ++iter) { if (iter->second.hSkill) SAFE_RELEASE_SPTR(iter->second.hSkill); } SAFE_DELETE_MAP(m_prefixSystemOffenceSkills); #endif // _GAMESERVER #if defined(PRE_ADD_PREFIX_SYSTE_RENEW) #if defined(_GAMESERVER) { //Á¢µÎ»ç ¹æ¾î¿ë ½ºÅ³ PREFIX_SKILL_INFO::iterator iter = m_PrefixDefenceSkills.begin(); PREFIX_SKILL_INFO::iterator endIter = m_PrefixDefenceSkills.end(); for (; iter != endIter; ++iter) { if(iter->second) SAFE_DELETE(iter->second); } m_PrefixDefenceSkills.clear(); //Á¢µÎ»ç °ø°Ý¿ë ½ºÅ³ iter = m_PrefixOffenceSkills.begin(); endIter = m_PrefixOffenceSkills.end(); for (; iter != endIter; ++iter) { if(iter->second) SAFE_DELETE(iter->second); } m_PrefixOffenceSkills.clear(); //»ç¿ëÁßÀÎ Á¢µÎ»ç °ø°Ý¿ë ½ºÅ³ ¸®½ºÆ® m_ProcessPrefixOffenceSkills.clear(); } #endif // _GAMESERVER #endif // PRE_ADD_PREFIX_SYSTE_RENEW } bool MASkillUser::IsValidActor() { if( m_pActor ) return true; else { if( !m_bIsValidActor ) return false; m_pActor = dynamic_cast(this); if( !m_pActor ) m_bIsValidActor = false; } return true; } void MASkillUser::OnAddSkill( DnSkillHandle hSkill, bool isInitialize/* = false*/ ) { // ÆÐ½Ãºê À̸鼭 ¹öÇÁ°í »óÅÂÈ¿°ú Self ·Î ºÙ¾îÀÖ´Â ½ºÅ³Àº °ð¹Ù·Î Àû¿ë½ÃÄÑ ÁÜ.. if( !IsValidActor() ) return; bool bPassiveBuff = false; bPassiveBuff = ApplyPassiveSkill( hSkill, isInitialize ); #ifdef _GAMESERVER if( CDnSkill::AutoPassive == hSkill->GetSkillType() ) m_listAutoPassiveSkills.push_back( hSkill ); #else const set& setUseAction = hSkill->GetUseActionSet(); set::const_iterator iter = setUseAction.begin(); for( iter; iter != setUseAction.end(); ++iter ) m_setUseActionNames.insert( *iter ); #endif if( bPassiveBuff ) m_vlhSelfPassiveBlowSkill.push_back( hSkill ); } bool MASkillUser::AddSkill( int nSkillTableID, int nLevel/* = 1*/, int iSkillLevelApplyType/* = CDnSkill::PVE*/ ) { if( IsExistSkill( nSkillTableID, nLevel ) ) return false; if( !IsValidActor() ) return false; #ifdef _GAMESERVER if( m_pActor == NULL || m_pActor->GetRoom() == NULL ) return false; #endif //·¹º§¾÷ Á¤º¸°¡ ÀÖÀ¸¸é Ãß°¡ ÇÑ´Ù. int nLevelUp = GetSkillLevelUpValue(nSkillTableID); nLevel += nLevelUp; DnSkillHandle hSkill = CDnSkill::CreateSkill( m_pActor->GetMySmartPtr(), nSkillTableID, nLevel ); //·¹º§¾÷À» ½Ãµµ Çߴµ¥ ½ºÅ³ »ý¼ºÀÌ ¾ÈµÆ´Ù¸é if (nLevelUp != 0 && !hSkill) { OutputDebug("½ºÅ³ (%d) ·¹º§ (%d) »ý¼º ½ÇÆÐ.. ½ºÅ³ ·¹º§ Å×À̺í È®ÀÎ ¿ä¸Á!!!!!!\n", nSkillTableID, nLevel); _ASSERT( hSkill && "½ºÅ³ ·¹º§¾÷ ½Ãµµ ½ÇÆÐ.. ·¹º§ Å×À̺í È®ÀÎ" ); //´Ù½Ã ¿ø·¡ ·¹º§·Î »ý¼º ½Ãµµ.. nLevel -= nLevelUp; hSkill = CDnSkill::CreateSkill(m_pActor->GetMySmartPtr(), nSkillTableID, nLevel); nLevelUp = 0; } if( !hSkill ) return false; //Ãß°¡µÈ ·¹º§¾÷ Á¤º¸¸¦ ¼³Á¤ ÇÑ´Ù. hSkill->SetLevelUpValue(nLevelUp); // ½ºÅ³·¹º§ Å×À̺í Àû¿ëŸÀÔ ¼ÂÆÃ if( m_pActor->IsPlayerActor() ) hSkill->SelectLevelDataType( iSkillLevelApplyType ); #ifndef PRE_FIX_SKILLLIST m_vlhSkillList.push_back( hSkill ); m_vbSelfAllocList.push_back( true ); #else m_vlSkillObjects.push_back( S_SKILL_OBJECT(hSkill, true) ); #endif // #ifndef PRE_FIX_SKILLLIST // Åä±Û, ¿À¶ó ½ºÅ³Àº µû·Î ¸®½ºÆ®¿¡ ´ã¾ÆµÒ CDnSkill::DurationTypeEnum eDurationType = hSkill->GetDurationType(); switch(eDurationType) { case CDnSkill::ActiveToggle: case CDnSkill::TimeToggle: case CDnSkill::ActiveToggleForSummon: m_vlhToggleSkills.push_back(hSkill); case CDnSkill::Aura: m_vlhAuraSkills.push_back(hSkill); } if( hSkill->GetActor() ) hSkill->SetHasActor( m_pActor->GetMySmartPtr() ); OnAddSkill( hSkill ); return true; } #if defined(PRE_FIX_62052) void MASkillUser::ApplyGlobalSkillCoolTime(DnSkillHandle hSkill) { int nGlobalSkillGroupID = hSkill ? hSkill->GetGlobalSkillGroupID() : 0; //GlobalSkillGroupID°¡ ¼³Á¤µÈ ½ºÅ³ÀÌ Ãß°¡ µÉ¶§ ±âÁ¸¿¡ °°Àº ID¸¦ »ç¿ëÇÏ´À ½ºÅ³ÀÇ ÄðŸÀÓÀ» Ãß°¡ µÇ´Â ½ºÅ³¿¡µµ ¼³Á¤ ÇØÁØ´Ù. if (nGlobalSkillGroupID != 0) { for( DWORD i = 0; i < GetSkillCount(); ++i ) { // m_vlGroupedSkillIDs ÀÇ °ªµéÀº Å×ÀÌºí¿¡¼­ ±×³É ²ôÁý¾î ³½ °ÍÀ̱⠶§¹®¿¡ // ½ÇÁ¦ ½ºÅ³À» ½ÀµæÇß´ÂÁö ¿©ºÎ°¡ È®ÀεǾî¾ß ÇÑ´Ù. DnSkillHandle hExistSkill = GetSkillFromIndex( i ); float fElapsedDelayTime = hExistSkill->GetElapsedDelayTime(); if( hExistSkill && hExistSkill->GetGlobalSkillGroupID() == nGlobalSkillGroupID && fElapsedDelayTime > 0.0f) { DnSkillHandle hOrigSkill = FindSkill(hExistSkill->GetAnotherGlobalSkillID()); hSkill->OnAnotherGlobalSkillBeginCoolTime( hOrigSkill ); hSkill->SetElapsedDelayTime(fElapsedDelayTime); } } } } #endif // PRE_FIX_62052 bool MASkillUser::AddSkill( DnSkillHandle hSkill ) { #ifdef _GAMESERVER // °×¼­¹ö¿¡¼­´Â ¸ó½ºÅÍ¿¡¼­¸¸ ½ºÅ³ °´Ã¼·Î Á÷Á¢ addskill ÇÕ´Ï´Ù. // Ç÷¹ÀÌ¾î ¾×ÅÍ¿¡°Ô´Â ½ºÅ³ Æ®¸® °ü¸®°¡ Áß°£¿¡ µé¾î°¡±â ¶§¹®¿¡ ¼­¹ö¿¡¼­ °¡»óÇÔ¼ö·Î // playeractor °¡ ¿À¹ö¶óÀ̵åÇÏ¿© »ç¿ëÇÏÁö ¾Ê´Â ÀÌ ÇÔ¼ö »ç¿ëÇÏ¸é ¾ÈµË´Ï´Ù. // ÃßÈÄ¿¡ »ç¿ëÇÏ°Ô µÈ´Ù¸é ±â¾ïÇϱâ À§Çؼ­ assert °É¾î³õ½À´Ï´Ù. //_ASSERT( IsValidActor() ); //_ASSERT( m_pActor->IsMonsterActor() ); #endif if( IsExistSkill( hSkill->GetClassID(), hSkill->GetLevel() ) ) return false; #if defined(PRE_FIX_62052) ApplyGlobalSkillCoolTime(hSkill); #endif // PRE_FIX_62052 #ifndef PRE_FIX_SKILLLIST m_vlhSkillList.push_back( hSkill ); m_vbSelfAllocList.push_back( false ); #else m_vlSkillObjects.push_back( S_SKILL_OBJECT(hSkill, false) ); #endif // #ifndef PRE_FIX_SKILLLIST // Åä±Û, ¿À¶ó ½ºÅ³Àº µû·Î ¸®½ºÆ®¿¡ ´ã¾ÆµÒ CDnSkill::DurationTypeEnum eDurationType = hSkill->GetDurationType(); switch(eDurationType) { case CDnSkill::ActiveToggle: case CDnSkill::TimeToggle: case CDnSkill::ActiveToggleForSummon: m_vlhToggleSkills.push_back(hSkill); case CDnSkill::Aura: m_vlhAuraSkills.push_back(hSkill); } OnAddSkill( hSkill ); return true; } bool MASkillUser::bIsPassiveSkill( DnBlowHandle hBlow ) { int iNumSkill = (int)m_vlhSelfPassiveBlowSkill.size(); for( int iSkill = 0; iSkill < iNumSkill; ++iSkill ) { DnSkillHandle hSkill = m_vlhSelfPassiveBlowSkill.at( iSkill ); _ASSERT( CDnSkill::Passive == hSkill->GetSkillType() ); const CDnSkill::SkillInfo* pSkillInfo = hBlow->GetParentSkillInfo(); if( pSkillInfo && (pSkillInfo->iSkillID == hSkill->GetClassID()) ) return true; //if( CDnSkill::Passive == hSkill->GetSkillType() ) //{ // int iNumStateEffect = hSkill->GetStateEffectCount(); // for( int i = 0; i < iNumStateEffect; ++i ) // { // CDnSkill::StateEffectStruct* pSE = hSkill->GetStateEffectFromIndex( i ); // if( CDnSkill::StateEffectApplyType::ApplySelf == pSE->ApplyType ) // { // if( CDnSkill::DurationTypeEnum::Buff == hSkill->GetDurationType() ) // { // if( hBlow->GetBlowIndex() == pSE->nID ) // return true; // } // } // } //} } return false; } bool MASkillUser::ApplyPassiveSkill( DnSkillHandle hSkill, bool isInitialize/* = false*/ ) { bool bPassiveBuf = false; // #24143 ÀÚ±âÀÚ½ÅÀÇ ½ºÅ³µéÀ» ÃʱâÈ­ÇÒ¶© CDnSkillTask ÂÊ¿¡¼­ ½ÇÁ¦ ȹµæÇÑ ½ºÅ³¸®½ºÆ®¸¦ ±âÁØÀ¸·Î AddSkill() ÇÔ¼ö¸¦ // È£ÃâÇØÁֱ⠶§¹®¿¡ ¹®Á¦ ¾øÁö¸¸ ´Ù¸¥ Ç÷¹À̾îÀÇ °æ¿ì¿£ ±×³É ¼­¹ö¿¡¼­ ¹Ð¾îÁÖ´Â ½ºÅ³¸®½ºÆ®(¸®¼ÂµÈ ·¹º§ 0Â¥¸® ½ºÅ³ Æ÷ÇÔ) // ±×´ë·Î AddSkill() ÇÔ¼ö¸¦ È£ÃâÇØÁֱ⠶§¹®¿¡ ¸®¼ÂµÈ ÆÐ½Ãºê ½ºÅ³µµ Àû¿ë½ÃÄÑÁà¹ö¸®´Â ¹®Á¦°¡ ÀÖ´Ù. // µû¶ó¼­ ¿©±â¼­ ȹµæ »óŰ¡ ¾Æ´Ï¸é ÆÐ½Ãºê ¹öÇÁ ½ºÅ³À» ¹ßµ¿½ÃÄÑÁÖÁö ¾Êµµ·Ï ÇÑ´Ù. (hp/mp ÃÖ´ëÄ¡ Áõ°¡ ½ºÅ³µîµî..) // °ÔÀÓ¼­¹öÂÊ¿¡¼­´Â Ŭ¶óÀÌ¾ðÆ®¿Í ´Ù¸£°Ô °¢ CDnPlayerActor °´Ã¼µéÀÌ ½ÇÁ¦ º¸À¯ÇÑ ½ºÅ³¸¸ °®°í ÀÖ´Ù. // Ŭ¶óÀ̾ðÆ®ÂÊ¿¡¼­´Â LocalPlayerActor ÀÎ °æ¿ì¿¡ ¸®¼ÂµÈ ½ºÅ³ÀÇ Á¤º¸µµ ÇÊ¿äÇϹǷΠPlayerActor ¸¦ µû·Î ±¸ºÐ ¾ÈÇÏ°í ½ºÅ³¸®½ºÆ® ¸ðµÎ ³Ö¾îÁØ´Ù.. #ifndef _GAMESERVER if( false == hSkill->IsAcquired() ) return false; #endif // #ifndef _GAMESERVER if( CDnSkill::Passive == hSkill->GetSkillType() ) { #if defined(PRE_ADD_TOTAL_LEVEL_SKILL) bool isTotalLevelSkill = false; if (m_pActor && m_pActor->IsPlayerActor()) { CDnPlayerActor* pPlayerActor = static_cast(m_pActor); CDnTotalLevelSkillSystem* pTotalLevelSystem = pPlayerActor ? pPlayerActor->GetTotalLevelSkillSystem() : NULL; if (pTotalLevelSystem) isTotalLevelSkill = pTotalLevelSystem->IsTotalLevelSkill(hSkill->GetClassID()); } #endif // PRE_ADD_TOTAL_LEVEL_SKILL int iNumStateEffect = hSkill->GetStateEffectCount(); for( int i = 0; i < iNumStateEffect; ++i ) { CDnSkill::StateEffectStruct* pSE = hSkill->GetStateEffectFromIndex( i ); if( CDnSkill::StateEffectApplyType::ApplySelf == pSE->ApplyType ) { if( CDnSkill::DurationTypeEnum::Buff == hSkill->GetDurationType() ) { bPassiveBuf = true; if( hSkill->IsSatisfyWeapon() ) { int iBlowID = -1; DnBlowHandle hBlow; #ifdef _GAMESERVER if(m_pActor) { iBlowID = m_pActor->CDnActor::CmdAddStateEffect( hSkill->GetInfo(), (STATE_BLOW::emBLOW_INDEX)pSE->nID, -1, pSE->szValue.c_str(), true ); // Duration TimeÀÌ -1 ÀÌ¸é ¹«ÇÑ Àû¿ëÀÓ OnApplyPassiveSkillBlow( iBlowID ); hBlow = m_pActor->GetStateBlowFromID(iBlowID); } #else if(m_pActor) hBlow = m_pActor->CDnActor::CmdAddStateEffect( hSkill->GetInfo(), (STATE_BLOW::emBLOW_INDEX)pSE->nID, -1, pSE->szValue.c_str(), true ); // Duration TimeÀÌ -1 ÀÌ¸é ¹«ÇÑ Àû¿ëÀÓ #endif #if defined(PRE_ADD_TOTAL_LEVEL_SKILL) if (isTotalLevelSkill == true && isInitialize == true && hBlow) hBlow->FromSourceItem(); #endif // PRE_ADD_TOTAL_LEVEL_SKILL hSkill->SetAppliedPassiveBlows( true ); #ifndef _FINAL_BUILD char szTemp[256] = { 0, }; WideCharToMultiByte( CP_ACP, 0, hSkill->GetName(), -1, szTemp, _countof(szTemp), NULL, NULL ); OutputDebug( "[ÆÐ½Ãºê ¹öÇÁ ½ºÅ³ Àû¿ëµÊ: %d] \"%s\" »óÅÂÈ¿°úIndex: %d, Value:%s\n", hSkill->GetClassID(), szTemp, pSE->nID, pSE->szValue.c_str() ); #endif // #ifndef _FINAL_BUILD } #ifndef _FINAL_BUILD else { char szTemp[256] = { 0, }; WideCharToMultiByte( CP_ACP, 0, hSkill->GetName(), -1, szTemp, _countof(szTemp), NULL, NULL ); OutputDebug( "[ÆÐ½Ãºê ¹öÇÁ ½ºÅ³ Àû¿ë¾ÈµÊ: %d] \"%s\" ½ºÅ³¿¡ ÁöÁ¤µÈ ÇÊ¿ä ¹«±â ŸÀÔÀÌ ¸ÂÁö ¾Ê½À´Ï´Ù.\n", hSkill->GetClassID(), szTemp ); } #endif // #ifndef _FINAL_BUILD } #ifndef _FINAL_BUILD else { char szTemp[256] = { 0, }; WideCharToMultiByte( CP_ACP, 0, hSkill->GetName(), -1, szTemp, _countof(szTemp), NULL, NULL ); OutputDebug( "[½ºÅ³ µ¥ÀÌÅÍ È®ÀÎ ¿ä¸Á: %d] \"%s\" ÆÐ½Ãºê ¹öÇÁ ½ºÅ³·Î »ý°¢µÇ³ª Buff ·Î ¼³Á¤µÇ¾îÀÖÁö ¾Ê¾Æ¼­ Àû¿ë ¾ÈµÊ\n", hSkill->GetClassID(), szTemp ); } #endif // #ifndef _FINAL_BUILD } } } return bPassiveBuf; } void MASkillUser::ApplyPassiveSkills( void ) { if( !IsValidActor() ) return; int iNumSkill = (int)m_vlhSelfPassiveBlowSkill.size(); for( int iSkill = 0; iSkill < iNumSkill; ++iSkill ) { DnSkillHandle hSkill = m_vlhSelfPassiveBlowSkill.at( iSkill ); ApplyPassiveSkill(hSkill); } } void MASkillUser::OnRemoveSkill( DnSkillHandle hSkill ) { #ifndef _GAMESERVER const set& setUseAction = hSkill->GetUseActionSet(); set::const_iterator iter = setUseAction.begin(); for( iter; iter != setUseAction.end(); ++iter ) m_setUseActionNames.erase( *iter ); #endif } bool MASkillUser::RemoveSkillAll() { if( !IsValidActor() ) return false; #ifndef PRE_FIX_SKILLLIST int nSkillSize = (int)m_vlhSkillList.size(); for( int i=0 ; iGetClassID() ); _ASSERT( bRet ); } #else int nSkillSize = (int)m_vlSkillObjects.size(); for( int i=0 ; iGetClassID() ); _ASSERT( bRet ); } #endif // #ifndef PRE_FIX_SKILLLIST return true; } bool MASkillUser::EndStateEffectSkill(int nSkillTableID) { DNVector(DnBlowHandle) vlBlows; m_pActor->GetAllAppliedStateBlow(vlBlows); for (int i = 0; i < (int)vlBlows.size(); ++i) { DnBlowHandle hBlow = vlBlows.at(i); const CDnSkill::SkillInfo * skillInfo = hBlow->GetParentSkillInfo(); if (skillInfo->iSkillID == nSkillTableID) { hBlow->OnEnd(0, 0); m_pActor->OnEndStateBlow(hBlow); m_pActor->RemoveStateBlowFromID(hBlow->GetBlowID()); //? need test. } } /* DnSkillHandle hSkill = FindSkill(nSkillTableID); if (m_pActor && m_pActor->GetStateBlow()) { std::vector vecRemoveBlowID; DNVector(DnBlowHandle) vlBlows; m_pActor->GetAllAppliedStateBlowBySkillID(nSkillTableID, vlBlows); int iStateEffectCount = hSkill->GetStateEffectCount(); for (int iStateEffect = 0; iStateEffect < iStateEffectCount; ++iStateEffect) { const CDnSkill::StateEffectStruct* pSE = hSkill->GetStateEffectFromIndex(iStateEffect); if (pSE && CDnSkill::StateEffectApplyType::ApplySelf == pSE->ApplyType) { for (DWORD BLOW_COUNT = 0; BLOW_COUNT < vlBlows.size(); BLOW_COUNT++) { if (vlBlows[BLOW_COUNT] && (vlBlows[BLOW_COUNT]->GetBlowIndex() == (STATE_BLOW::emBLOW_INDEX)pSE->nID)) { vecRemoveBlowID.push_back(vlBlows[BLOW_COUNT]->GetBlowID()); } } } } for (DWORD Index = 0; Index < vecRemoveBlowID.size(); Index++) { m_pActor->GetStateBlow()->RemoveImediatlyStateEffectFromID(vecRemoveBlowID[Index]); } } */ return true; } bool MASkillUser::RemoveSkill( int nSkillTableID ) { if( !IsValidActor() ) return false; int iNumPassiveBlowSkill = (int)m_vlhSelfPassiveBlowSkill.size(); for( int iPassiveBlowSkill = 0; iPassiveBlowSkill < iNumPassiveBlowSkill; ++iPassiveBlowSkill ) { DnSkillHandle hSkill = m_vlhSelfPassiveBlowSkill.at( iPassiveBlowSkill ); if( hSkill && hSkill->GetClassID() == nSkillTableID ) { if( m_pActor && m_pActor->GetStateBlow() ) { std::vector vecRemoveBlowID; DNVector(DnBlowHandle) vlBlows; m_pActor->GetAllAppliedStateBlowBySkillID( nSkillTableID , vlBlows ); int iStateEffectCount = hSkill->GetStateEffectCount(); for( int iStateEffect = 0; iStateEffect < iStateEffectCount; ++iStateEffect ) { const CDnSkill::StateEffectStruct* pSE = hSkill->GetStateEffectFromIndex( iStateEffect ); if( pSE && CDnSkill::StateEffectApplyType::ApplySelf == pSE->ApplyType ) { for( DWORD BLOW_COUNT=0; BLOW_COUNT < vlBlows.size(); BLOW_COUNT++ ) { if( vlBlows[BLOW_COUNT] && ( vlBlows[BLOW_COUNT]->GetBlowIndex() == (STATE_BLOW::emBLOW_INDEX)pSE->nID ) ) { vecRemoveBlowID.push_back( vlBlows[BLOW_COUNT]->GetBlowID() ); } } } } for( DWORD Index=0; IndexGetStateBlow()->RemoveImediatlyStateEffectFromID( vecRemoveBlowID[Index] ); } } // 2009.03.16 ±è¹ä m_vlhSelfPassiveBlowSkill.erase( m_vlhSelfPassiveBlowSkill.begin()+iPassiveBlowSkill ); break; } } #if defined(PRE_ADD_TOTAL_LEVEL_SKILL) //ÅëÇÕ·¹º§ ½ºÅ³ÀÎ °æ¿ì ¾Æ·§ÂÊ ·çƾÀ» Å» Çʿ䰡 ¾øÀ½... if (m_pActor && m_pActor->IsPlayerActor()) { CDnPlayerActor* pPlayerActor = static_cast(m_pActor); CDnTotalLevelSkillSystem *pTotalLevelSystem = pPlayerActor ? pPlayerActor->GetTotalLevelSkillSystem(): NULL; if (pTotalLevelSystem && pTotalLevelSystem->IsTotalLevelSkill(nSkillTableID)) return true; } #endif // PRE_ADD_TOTAL_LEVEL_SKILL #ifdef _GAMESERVER list::iterator iter = m_listAutoPassiveSkills.begin(); for( iter; m_listAutoPassiveSkills.end() != iter; ++iter ) { if( (*iter)->GetClassID() == nSkillTableID ) { m_listAutoPassiveSkills.erase( iter ); break; } } #endif #ifndef PRE_FIX_SKILLLIST for( DWORD i=0; iGetClassID() == nSkillTableID ) { // Åä±ÛÀ̳ª ¿À¶ó ½ºÅ³À̶ó¸é º°µµÀÇ ¸®½ºÆ®¿¡¼­ »èÁ¦ DnSkillHandle hSkill = m_vlhSkillList.at(i); #else for( DWORD i = 0; i < m_vlSkillObjects.size(); ++i ) { S_SKILL_OBJECT& SkillObject = m_vlSkillObjects.at( i ); if( SkillObject.hSkill && SkillObject.hSkill->GetClassID() == nSkillTableID ) { // Åä±ÛÀ̳ª ¿À¶ó ½ºÅ³À̶ó¸é º°µµÀÇ ¸®½ºÆ®¿¡¼­ »èÁ¦ DnSkillHandle hSkill = SkillObject.hSkill; #endif // #ifndef PRE_FIX_SKILLLIST if( CDnSkill::ActiveToggle == hSkill->GetDurationType() || CDnSkill::TimeToggle == hSkill->GetDurationType() || CDnSkill::ActiveToggleForSummon == hSkill->GetDurationType() ) { DNVector(DnSkillHandle)::iterator Localiter = find( m_vlhToggleSkills.begin(), m_vlhToggleSkills.end(), hSkill ); m_vlhToggleSkills.erase( Localiter ); } else if( CDnSkill::Aura == hSkill->GetDurationType() ) { if (m_hAuraSkill && m_hAuraSkill->GetClassID() == nSkillTableID && m_hAuraSkill->IsAuraOn()) { if (m_hAuraSkill == m_hProcessSkill) m_hProcessSkill.Identity(); m_hAuraSkill->EnableAura( false ); OnSkillAura(m_hAuraSkill, false); m_hAuraSkill.Identity(); } DNVector(DnSkillHandle)::iterator Localiter = find( m_vlhAuraSkills.begin(), m_vlhAuraSkills.end(), hSkill ); m_vlhAuraSkills.erase( Localiter ); } #ifndef PRE_FIX_SKILLLIST OnRemoveSkill( m_vlhSkillList[i] ); if( m_vbSelfAllocList[i] == true ) SAFE_RELEASE_SPTR( m_vlhSkillList[i] ); m_vlhSkillList.erase( m_vlhSkillList.begin() + i ); m_vbSelfAllocList.erase( m_vbSelfAllocList.begin() + i ); #else OnRemoveSkill( SkillObject.hSkill ); if( SkillObject.bSelfAlloc ) SAFE_RELEASE_SPTR( SkillObject.hSkill ); m_vlSkillObjects.erase( m_vlSkillObjects.begin()+i ); #endif // #ifndef PRE_FIX_SKILLLIST return true; } } return true; } #ifndef _GAMESERVER bool MASkillUser::ReplacementSkill( int nSkillTableID, int nLevel ) { if( !IsValidActor() ) return false; DnSkillHandle hSkill = CDnSkill::CreateSkill( m_pActor->GetMySmartPtr(), nSkillTableID, nLevel ); if( !hSkill ) return false; return ReplacementSkill( hSkill ); } bool MASkillUser::ReplacementSkill( DnSkillHandle hNewSkill ) { #ifndef PRE_FIX_SKILLLIST int iSkillID = hNewSkill->GetClassID(); for( DWORD i=0; iGetClassID() == iSkillID ) { // ÆÐ½Ãºê ºí·Î¿ì ½ºÅ³Àΰ¡. ±×·¸´Ù¸é ±âÁ¸ »óÅÂÈ¿°ú ¸ðµÎ ¾ø¾Ö°í »õ·Î Àû¿ë½ÃÄÑ ÁØ´Ù. DNVector(DnSkillHandle)::iterator iter = find( m_vlhSelfPassiveBlowSkill.begin(), m_vlhSelfPassiveBlowSkill.end(), m_vlhSkillList[ i ] ); if( m_vlhSelfPassiveBlowSkill.end() != iter ) { // Àû¿ëµÇ¾î ÀÖ´Â »óÅÂÈ¿°ú¸¦ Á¦°ÅÇÑ´Ù. // ºÎ¸ð½ºÅ³ÀÌ ÀÏÄ¡ÇÏ´Â »óÅÂÈ¿°ú¸¦ ã¾Æ³»¼­ »èÁ¦ÇÑ´Ù. if( !IsValidActor() ) continue; // HP, SP ¿Ã·ÁÁÖ´Â ÆÐ½Ãºê ½ºÅ³Àº »èÁ¦µÇ¸é ¿ø·¡ ½ºÅ³ ¾ø´Â »óÅÂÀÇ ¼ø¼ö HP SP ·Î ÇöÀç HP/SP°¡ // Ŭ¸®ÇÎ µÇ°Ô ¶§¹®¿¡ ¹Ì¸® ¹Þ¾Æµ×´Ù°¡ ¼ÂÆÃÇØÁØ´Ù.. INT64 iHP = m_pActor->GetHP(); int iSP = m_pActor->GetSP(); DNVector(DnBlowHandle) vlhAppliedSE; DNVector(DnBlowHandle) vlhSEToRemove; m_pActor->GetAllAppliedStateBlow( vlhAppliedSE ); int iNumAppliedSE = (int)vlhAppliedSE.size(); for( int iSE = 0; iSE < iNumAppliedSE; ++iSE ) { DnBlowHandle hAppliedBlow = vlhAppliedSE.at( iSE ); const CDnSkill::SkillInfo* pSkillInfo = hAppliedBlow->GetParentSkillInfo(); if( pSkillInfo->iSkillID == (*iter)->GetClassID() ) vlhSEToRemove.push_back( hAppliedBlow ); } int iNumSEToRemove = (int)vlhSEToRemove.size(); for( int iSE = 0; iSE < iNumSEToRemove; ++iSE ) { DnBlowHandle hBlow = vlhSEToRemove.at(iSE); int iID = hBlow->GetBlowID(); OutputDebug( "[ÆÐ½Ãºê ¹öÇÁ ½ºÅ³ »èÁ¦µÊ: %d] %s »óÅÂÈ¿°úIndex: %d, Value:%s\n", (*iter)->GetClassID(), (*iter)->GetName(), hBlow->GetBlowIndex(), hBlow->GetValue() ); m_pActor->RemoveStateBlowFromID( iID ); } m_vlhSelfPassiveBlowSkill.erase( iter ); ApplyPassiveSkill( hNewSkill ); m_vlhSelfPassiveBlowSkill.push_back( hNewSkill ); m_pActor->SetHP( iHP ); m_pActor->SetSP( iSP ); } if (m_hAuraSkill && m_hAuraSkill->GetClassID() == iSkillID && m_hAuraSkill->IsAuraOn()) { if (m_hAuraSkill == m_hProcessSkill) m_hProcessSkill.Identity(); m_hAuraSkill->EnableAura( false ); OnSkillAura(m_hAuraSkill, false); m_hAuraSkill.Identity(); } if( m_vbSelfAllocList[ i ] ) { // ÀÚ½ÅÀÌ »ý¼ºÇÑ ½ºÅ³Àº ÀÚ½ÅÀÌ Áö¿ö¾ß ÇϹǷÎ. DnSkillHandle hSkillToRelease = m_vlhSkillList[ i ]; // ¿À¶ó, Åä±Û ½ºÅ³ ¸®½ºÆ®¿¡¼­µµ °Ë»öÇØ¼­ ´ëü ½ÃÅ´ DNVector(DnSkillHandle)::iterator iterToggle = find( m_vlhToggleSkills.begin(), m_vlhToggleSkills.end(), hSkillToRelease ); if( m_vlhToggleSkills.end() != iterToggle ) *iterToggle = hNewSkill; DNVector(DnSkillHandle)::iterator iterAura = find( m_vlhAuraSkills.begin(), m_vlhAuraSkills.end(), hSkillToRelease ); if( m_vlhAuraSkills.end() != iterAura ) *iterAura = hNewSkill; OnRemoveSkill( hSkillToRelease ); SAFE_RELEASE_SPTR( hSkillToRelease ); } else { // ½ºÅ³ ŽºÅ©¿¡¼­ »ý¼ºÇÑ ½ºÅ³ °´Ã¼´Â ¿©±â¼­ Áö¿ìÁö ¾Ê´Â´Ù. DnSkillHandle hPrevLevelSkill = m_vlhSkillList[ i ]; // ¿À¶ó, Åä±Û ½ºÅ³ ¸®½ºÆ®¿¡¼­µµ °Ë»öÇØ¼­ ´ëü ½ÃÅ´ DNVector(DnSkillHandle)::iterator iterToggle = find( m_vlhToggleSkills.begin(), m_vlhToggleSkills.end(), hPrevLevelSkill ); if( m_vlhToggleSkills.end() != iterToggle ) *iterToggle = hNewSkill; DNVector(DnSkillHandle)::iterator iterAura = find( m_vlhAuraSkills.begin(), m_vlhAuraSkills.end(), hPrevLevelSkill ); if( m_vlhAuraSkills.end() != iterAura ) *iterAura = hNewSkill; } OnReplacementSkill( m_vlhSkillList[ i ], hNewSkill ); m_vlhSkillList[ i ] = hNewSkill; return true; } } return false; #else int iSkillID = hNewSkill->GetClassID(); for( DWORD i = 0; i < m_vlSkillObjects.size(); i++ ) { S_SKILL_OBJECT& SkillObject = m_vlSkillObjects.at( i ); DnSkillHandle hSkill = SkillObject.hSkill; if( hSkill->GetClassID() == iSkillID ) { // ÆÐ½Ãºê ºí·Î¿ì ½ºÅ³Àΰ¡. ±×·¸´Ù¸é ±âÁ¸ »óÅÂÈ¿°ú ¸ðµÎ ¾ø¾Ö°í »õ·Î Àû¿ë½ÃÄÑ ÁØ´Ù. DNVector(DnSkillHandle)::iterator iter = find( m_vlhSelfPassiveBlowSkill.begin(), m_vlhSelfPassiveBlowSkill.end(), hSkill ); if( m_vlhSelfPassiveBlowSkill.end() != iter ) { // Àû¿ëµÇ¾î ÀÖ´Â »óÅÂÈ¿°ú¸¦ Á¦°ÅÇÑ´Ù. // ºÎ¸ð½ºÅ³ÀÌ ÀÏÄ¡ÇÏ´Â »óÅÂÈ¿°ú¸¦ ã¾Æ³»¼­ »èÁ¦ÇÑ´Ù. if( !IsValidActor() ) continue; // HP, SP ¿Ã·ÁÁÖ´Â ÆÐ½Ãºê ½ºÅ³Àº »èÁ¦µÇ¸é ¿ø·¡ ½ºÅ³ ¾ø´Â »óÅÂÀÇ ¼ø¼ö HP SP ·Î ÇöÀç HP/SP°¡ // Ŭ¸®ÇÎ µÇ°Ô ¶§¹®¿¡ ¹Ì¸® ¹Þ¾Æµ×´Ù°¡ ¼ÂÆÃÇØÁØ´Ù.. INT64 iHP = m_pActor->GetHP(); int iSP = m_pActor->GetSP(); DNVector(DnBlowHandle) vlhAppliedSE; DNVector(DnBlowHandle) vlhSEToRemove; m_pActor->GetAllAppliedStateBlow( vlhAppliedSE ); int iNumAppliedSE = (int)vlhAppliedSE.size(); for( int iSE = 0; iSE < iNumAppliedSE; ++iSE ) { DnBlowHandle hAppliedBlow = vlhAppliedSE.at( iSE ); const CDnSkill::SkillInfo* pSkillInfo = hAppliedBlow->GetParentSkillInfo(); if( pSkillInfo->iSkillID == (*iter)->GetClassID() ) vlhSEToRemove.push_back( hAppliedBlow ); } int iNumSEToRemove = (int)vlhSEToRemove.size(); for( int iSE = 0; iSE < iNumSEToRemove; ++iSE ) { DnBlowHandle hBlow = vlhSEToRemove.at(iSE); int iID = hBlow->GetBlowID(); OutputDebug( "[ÆÐ½Ãºê ¹öÇÁ ½ºÅ³ »èÁ¦µÊ: %d] %s »óÅÂÈ¿°úIndex: %d, Value:%s\n", (*iter)->GetClassID(), (*iter)->GetName(), hBlow->GetBlowIndex(), hBlow->GetValue() ); m_pActor->RemoveStateBlowFromID( iID ); } m_vlhSelfPassiveBlowSkill.erase( iter ); ApplyPassiveSkill( hNewSkill ); m_vlhSelfPassiveBlowSkill.push_back( hNewSkill ); m_pActor->SetHP( iHP ); m_pActor->SetSP( iSP ); } if (m_hAuraSkill && m_hAuraSkill->GetClassID() == iSkillID && m_hAuraSkill->IsAuraOn()) { if (m_hAuraSkill == m_hProcessSkill) m_hProcessSkill.Identity(); m_hAuraSkill->EnableAura( false ); OnSkillAura(m_hAuraSkill, false); m_hAuraSkill.Identity(); } if( true == SkillObject.bSelfAlloc ) { // ÀÚ½ÅÀÌ »ý¼ºÇÑ ½ºÅ³Àº ÀÚ½ÅÀÌ Áö¿ö¾ß ÇϹǷÎ. DnSkillHandle hSkillToRelease = hSkill; // ¿À¶ó, Åä±Û ½ºÅ³ ¸®½ºÆ®¿¡¼­µµ °Ë»öÇØ¼­ ´ëü ½ÃÅ´ DNVector(DnSkillHandle)::iterator iterToggle = find( m_vlhToggleSkills.begin(), m_vlhToggleSkills.end(), hSkillToRelease ); if( m_vlhToggleSkills.end() != iterToggle ) *iterToggle = hNewSkill; DNVector(DnSkillHandle)::iterator iterAura = find( m_vlhAuraSkills.begin(), m_vlhAuraSkills.end(), hSkillToRelease ); if( m_vlhAuraSkills.end() != iterAura ) *iterAura = hNewSkill; OnRemoveSkill( hSkillToRelease ); SAFE_RELEASE_SPTR( hSkillToRelease ); } else { // ½ºÅ³ ŽºÅ©¿¡¼­ »ý¼ºÇÑ ½ºÅ³ °´Ã¼´Â ¿©±â¼­ Áö¿ìÁö ¾Ê´Â´Ù. DnSkillHandle hPrevLevelSkill = hSkill; // ¿À¶ó, Åä±Û ½ºÅ³ ¸®½ºÆ®¿¡¼­µµ °Ë»öÇØ¼­ ´ëü ½ÃÅ´ DNVector(DnSkillHandle)::iterator iterToggle = find( m_vlhToggleSkills.begin(), m_vlhToggleSkills.end(), hPrevLevelSkill ); if( m_vlhToggleSkills.end() != iterToggle ) *iterToggle = hNewSkill; DNVector(DnSkillHandle)::iterator iterAura = find( m_vlhAuraSkills.begin(), m_vlhAuraSkills.end(), hPrevLevelSkill ); if( m_vlhAuraSkills.end() != iterAura ) *iterAura = hNewSkill; } OnReplacementSkill( hSkill, hNewSkill ); SkillObject.hSkill = hNewSkill; return true; } } return false; #endif // #ifndef PRE_FIX_SKILLLIST } #endif bool MASkillUser::IsExistSkill( int nSkillTableID, int nLevel ) { #ifndef PRE_FIX_SKILLLIST for( DWORD i=0; iGetClassID() == nSkillTableID ) ) { if( nLevel == -1 ) return true; if( m_vlhSkillList[i]->GetLevel() == nLevel ) return true; } } return false; #else for( DWORD i = 0; i < m_vlSkillObjects.size(); ++i ) { S_SKILL_OBJECT& SkillObject = m_vlSkillObjects.at( i ); DnSkillHandle hSkill = SkillObject.hSkill; if( hSkill) { if( hSkill->GetClassID() == nSkillTableID ) { if( -1 == nLevel ) return true; if( hSkill->GetLevel() == nLevel ) return true; } } } return false; #endif // #ifndef PRE_FIX_SKILLLIST } bool MASkillUser::IsSelfAllocSkill( int nSkillTableID ) { #ifndef PRE_FIX_SKILLLIST for( DWORD i=0; iGetClassID() == nSkillTableID ) return m_vbSelfAllocList[i]; } return false; #else for( DWORD i = 0; i < m_vlSkillObjects.size(); ++i ) { if( m_vlSkillObjects.at( i ).hSkill->GetClassID() == nSkillTableID ) return m_vlSkillObjects.at( i ).bSelfAlloc; } return false; #endif // #ifndef PRE_FIX_SKILLLIST } void MASkillUser::SetSkillLevel( int nSkillTableID, int nValue ) { if( !IsSelfAllocSkill( nSkillTableID ) ) return; DnSkillHandle hSkill = FindSkill( nSkillTableID ); if( !hSkill ) return; if( hSkill->GetLevel() == nValue ) return; float fElapsedDelayTime = hSkill->GetElapsedDelayTime(); RemoveSkill( nSkillTableID ); AddSkill( nSkillTableID, nValue ); hSkill = FindSkill( nSkillTableID ); hSkill->SetElapsedDelayTime( fElapsedDelayTime ); } DnSkillHandle MASkillUser::FindSkill( int nSkillTableID ) { #ifndef PRE_FIX_SKILLLIST for( DWORD i=0; iGetClassID() == nSkillTableID ) return m_vlhSkillList[i]; } return CDnSkill::Identity(); #else for( DWORD i = 0; i < m_vlSkillObjects.size(); ++i ) { if( m_vlSkillObjects.at( i ).hSkill && m_vlSkillObjects.at( i ).hSkill->GetClassID() == nSkillTableID ) return m_vlSkillObjects.at( i ).hSkill; } return CDnSkill::Identity(); #endif // #ifndef PRE_FIX_SKILLLIST } DnSkillHandle MASkillUser::GetProcessSkill() { return m_hProcessSkill; } CDnSkill::UsingResult MASkillUser::CanExecuteSkill( DnSkillHandle hSkill ) { _ASSERT( hSkill && "MASkillUser::CanExecuteSkill() -> Invalid hSkill" ); #ifndef _GAMESERVER // °°Àº ÇÁ·¹ÀÓ¿¡ ¾×Ƽºê ½ºÅ³ ¿©·¯°³ »ç¿ë ºÒ°¡. if( m_hProcessSkill && m_hProcessSkill->GetSkillType() == CDnSkill::Active && hSkill->GetSkillType() == CDnSkill::Active ) if( m_bSkillExecutedThisFrame ) return CDnSkill::UsingResult::Failed; #endif // [2011/02/22 semozz] // ¾Ö´Ï¸ÞÀÌ¼Ç Àüȯ °¡´É üũ´Â Ŭ¶óÀÌ¾ðÆ®¸¸ ÇÏ¸é µÉµí... #if !defined(_GAMESERVER) if (!hSkill->CheckAnimation()) return CDnSkill::UsingResult::Failed; #endif // _GAMESERVER #if !defined(_GAMESERVER) if( hSkill->GetGlyphActiveSkillDisable() ) return CDnSkill::UsingResult::Failed; #endif // _GAMESERVER return hSkill->CanExecute(); } #ifdef _GAMESERVER bool MASkillUser::ExecuteSkill( DnSkillHandle hSkill, LOCAL_TIME LocalTime, float fDelta ) #else bool MASkillUser::ExecuteSkill( DnSkillHandle hSkill, LOCAL_TIME LocalTime, float fDelta, bool bCheckValid /*= true*/, bool bAutoUsedFromServer /*= false*/, bool bSendPacketToServer /*= true */ ) #endif { _ASSERT( hSkill && "Invalid hSkill" ); if( !IsValidActor() ) return false; if( m_hProcessSkill ) { // #25154 ¿À¶ó ½ºÅ³Àº ¿À¶ó¸¦ ²°À» ¶§ onend µÈ´Ù. if( false == m_hProcessSkill->IsAuraOn() ) m_hProcessSkill->OnEnd( m_LocalTime, 0 ); m_hProcessSkill.Identity(); } m_hProcessSkill = hSkill; switch( m_hProcessSkill->GetDurationType() ) { case CDnSkill::Instantly: case CDnSkill::Buff: case CDnSkill::Debuff: case CDnSkill::SummonOnOff: case CDnSkill::StanceChange: // ¸¶À»¿¡¼­´Â SP ¾È ±ïÀ̵µ·Ï #ifndef _GAMESERVER if( CDnWorld::MapTypeVillage != CDnWorld::GetInstance().GetMapType() ) #endif m_pActor->UseMP( -m_hProcessSkill->GetDecreaseMP() ); // Compile Error. Moved by kalliste //m_pActor->SetSP( m_pActor->GetSP() - m_hProcessSkill->GetDecreaseMP() ); // Excute ÇÔ¼ö´Â OnBegin À¸·Î À̸§ÀÌ ¹Ù²î¾ú´Ù. //m_hProcessSkill->Execute( LocalTime, fDelta ); m_hProcessSkill->OnBegin( LocalTime, fDelta ); // ±Û·Î¹ú ÄðŸÀÓÀÌ ¼³Á¤µÇ¾îÀÖ´Ù¸é °°Àº ±×·ìÀÇ ½ºÅ³µéµµ ÄðŸÀÓ ½ÃÀÛ.. if( m_hProcessSkill && 0 < m_hProcessSkill->GetGlobalSkillGroupID() ) { for( DWORD i = 0; i < GetSkillCount(); ++i ) { // m_vlGroupedSkillIDs ÀÇ °ªµéÀº Å×ÀÌºí¿¡¼­ ±×³É ²ôÁý¾î ³½ °ÍÀ̱⠶§¹®¿¡ // ½ÇÁ¦ ½ºÅ³À» ½ÀµæÇß´ÂÁö ¿©ºÎ°¡ È®ÀεǾî¾ß ÇÑ´Ù. DnSkillHandle hExistSkill = GetSkillFromIndex( i ); if( hExistSkill && hExistSkill != m_hProcessSkill && hExistSkill->GetGlobalSkillGroupID() == m_hProcessSkill->GetGlobalSkillGroupID() ) { // ±Û·Î¹ú ÄðŸÀÓÀ¸·Î °°ÀÌ µµ´Â ½ºÅ³µéÀº »ç¿ëµÈ ½ºÅ³ÀÇ ÄðŸÀÓÀ¸·Î ¹Ù²ãÁØ´Ù. hExistSkill->ResetCoolTime(); hExistSkill->OnAnotherGlobalSkillBeginCoolTime( hSkill ); hExistSkill->OnBeginCoolTime(); } } } break; case CDnSkill::TimeToggle: case CDnSkill::ActiveToggle: case CDnSkill::ActiveToggleForSummon: { bool bToggleEnable = !hSkill->IsToggleOn(); hSkill->EnableToggle(bToggleEnable); OnSkillToggle(hSkill, bToggleEnable); #ifdef _GAMESERVER // NOTE: Åä±ÛÀÌ ÄÑÁú ´ç½ÃÀÇ °ø°Ý·ÂÀ» ÀúÀåÇØµÐ´Ù. ÃßÈÄ¿¡ °ø°Ý·Â ¸»°í ´Ù¸¥ °ÍµéÀÌ Ãß°¡µÉ ¼öµµ ÀÖ´Ù. if( hSkill && hSkill->IsToggleOn() ) { m_ActorStateSnapshotForToggleProjectile.ResetState(); hSkill->CheckAndAddSelfStateEffect(); static_cast(this)->GetStateBlow()->Process( 0, 0.0f ); CDnActor* pActor = static_cast(this); m_ActorStateSnapshotForToggleProjectile = *(static_cast(pActor)); hSkill->CheckAndRemoveInstantApplySelfStateEffect(); } #endif } break;; case CDnSkill::Aura: { // ¿À¶ó ½ºÅ³µé³¢¸® Åä±Û¸µ ÇØÁÜ. ´Ù¸¥ ¿À¶ó ½ºÅ³ÀÌ ÄÑÁö¸é ²¨Áö°í, ÇöÀç ½ÃÀüÁßÀÎ ¿À¶ó ½ºÅ³ÀÌ¸é ²¨ÁØ´Ù. // ¿À¶ó ½ºÅ³µéÀ» ¸ÕÀú Á¾·á½ÃŰ°í »õ·Î ÄÑÁö´Â ¿À¶ó¸¦ ½ÇÇàÇØ¾ß »õ·Î ½ÇÇàµÉ ¿À¶ó¿¡¼­ self blow Å¥¿¡ ½×ÀÎ °ÍµéÀÌ // Ŭ¸®¾î µÇÁö ¾Ê°í Á¦´ë·Î Àû¿ëµÈ´Ù. bool bProcessingAuraOff = false; // °°Àº ¿À¶ó ½ºÅ³ÀÌ execute µÇ¸é ¿À¶ó°¡ ²¨Áö´Â °ÍÀÓ. int iNumAuraSkill = (int)m_vlhAuraSkills.size(); for( int iAuraSkill = 0; iAuraSkill < iNumAuraSkill; ++iAuraSkill ) { DnSkillHandle hAuraSkill = m_vlhAuraSkills.at( iAuraSkill ); _ASSERT( hAuraSkill->GetDurationType() == CDnSkill::Aura ); if( hAuraSkill->IsAuraOn() ) { if( m_hProcessSkill == hAuraSkill ) bProcessingAuraOff = true; hAuraSkill->EnableAura( false ); OnSkillAura( hAuraSkill, false ); break; } } // ´Ù¸¥ ¿À¶ó½ºÅ³À» »ç¿ëÇØ¼­ ±âÁ¸ÀÇ ¿À¶ó°¡ ²¨Áö°í »õ·Î ¹ßµ¿µÊ. if( false == bProcessingAuraOff ) { for( int iAuraSkill = 0; iAuraSkill < iNumAuraSkill; ++iAuraSkill ) { DnSkillHandle hAuraSkill = m_vlhAuraSkills.at( iAuraSkill ); if( hAuraSkill == m_hProcessSkill ) { m_hProcessSkill->EnableAura( true ); OnSkillAura( m_hProcessSkill, true ); break; // Note Çѱâ: m_hProcessSkill ½º¸¶Æ® Æ÷ÀÎÅÍ´Â ¿À¶ó ½ºÅ³ »ç¿ëÇÏ´Â ¾×¼ÇÀÌ Àç»ýµÇ´Â µ¿¾ÈÀº À¯È¿ÇØ¾ß // °ÔÀÓ ¼­¹ö¿¡¼­ CDnPlayerActor::CmdStop() ÂÊ¿¡¼­ °É·¯Áö±â ¶§¹®¿¡ °× ¼­¹ö¿¡¼­ ÇØ´ç ¾×¼Ç ½Ã±×³ÎÀÌ ³¡±îÁö // 󸮵Ê. µû¶ó¼­ CDnActor::OnChangeAction ÂÊ¿¡¼­ ProcessSkill À» Identity ½ÃÅ´. } } } else { // ÄÑÁ® ÀÖ´ø ¿À¶ó°¡ ²¨Áü. m_hAuraSkill.Identity(); m_hProcessSkill.Identity(); } } break; } #ifndef _GAMESERVER m_bSkillExecutedThisFrame = true; #endif return true; } #ifdef _GAMESERVER void MASkillUser::UseAutoPassiveSkill( LOCAL_TIME LocalTime, float fDelta ) { list::iterator iter = m_listAutoPassiveSkills.begin(); for( iter; m_listAutoPassiveSkills.end() != iter; ++iter ) { DnSkillHandle hSkill = *iter; if( CDnSkill::UsingResult::Success == CanExecuteSkill( hSkill ) ) { BYTE pBuffer[128] = {0,}; CPacketCompressStream Stream( pBuffer, 128 ); int iSkillID = hSkill->GetClassID(); int iEnchantSkillID = hSkill->GetEnchantedSkillID(); char cLevel = hSkill->GetLevel(); EtVector2 vLook, vZVec; bool bUseApplySkillItem = false; char cUseSignalSkill = -1; bool bAutoUseFromServer = true; bool abSignalSkillCheck[ 3 ] = { false }; vLook = EtVec3toVec2( *m_pActor->GetLookDir() ); vZVec = EtVec3toVec2( *m_pActor->GetMoveVectorZ() ); Stream.Write( &iSkillID, sizeof(int) ); Stream.Write( &cLevel, sizeof(char) ); Stream.Write( &bUseApplySkillItem, sizeof(bool) ); Stream.Write( abSignalSkillCheck, sizeof(abSignalSkillCheck) ); Stream.Write( &vZVec, sizeof(EtVector2), CPacketCompressStream::VECTOR2_SHORT ); Stream.Write( &vLook, sizeof(EtVector2), CPacketCompressStream::VECTOR2_SHORT ); Stream.Write( &bAutoUseFromServer, sizeof(bool) ); Stream.Write( &iEnchantSkillID, sizeof(int) ); #ifdef PRE_ADD_POSITION_SYNC_BY_SKILL_USAGE Stream.Write( m_pActor->GetPosition(), sizeof(EtVector3), CPacketCompressStream::VECTOR3_BIT ); #endif m_pActor->Send( eActor::SC_USESKILL, &Stream ); ExecuteSkill( hSkill, LocalTime, fDelta ); // ¹ßµ¿µÈ ¸®½ºÆ®¿¡ ³Ö¾îµÐ´Ù. process µ¹·Á¾ß Çϱ⠶§¹®¿¡, m_listProcessAutoPassiveSkills.push_back( hSkill ); // »ç¿ëµÈ ¿ÀÅä ÆÐ½Ãºê ½ºÅ³Àº ¸Ç µÚ¿¡ ºÙÀδÙ. ½ÇÇà ¿ì¼±¼øÀ§¸¦ ³·Ãã. m_listAutoPassiveSkills.erase( iter ); m_listAutoPassiveSkills.push_back( hSkill ); // ProcessSkill Àº ¾Æ´Ï¹Ç·Î ÃʱâÈ­ ½ÃÅ´. ProcessSkill ÀÌ ÀÖÀ¸¸é CmdStop ÀÌ ¸ÔÁö ¾Ê´Â´Ù. m_hProcessSkill.Identity(); break; } } } bool MASkillUser::IsProcessingAutoPassive( int iSkillID ) { list::iterator iter = m_listProcessAutoPassiveSkills.begin(); for( iter; iter != m_listProcessAutoPassiveSkills.end(); ++iter ) { DnSkillHandle hAutoPassive = *iter; if( hAutoPassive->GetClassID() == iSkillID ) return true; } return false; } void MASkillUser::EndAutoPassiveSkill( LOCAL_TIME LocalTime, float fDelta ) { list::iterator iter = m_listProcessAutoPassiveSkills.begin(); for( iter; iter != m_listProcessAutoPassiveSkills.end(); ++iter ) { DnSkillHandle hAutoPassive = *iter; hAutoPassive->OnEnd( LocalTime, fDelta ); } } #endif bool MASkillUser::HavePassiveSkill(int iSkillID) { int iNumSkill = (int)m_vlhSelfPassiveBlowSkill.size(); for (int iSkill = 0; iSkill < iNumSkill; ++iSkill) { DnSkillHandle hSkill = m_vlhSelfPassiveBlowSkill.at(iSkill); if (iSkillID == hSkill->GetClassID()) return true; } return false; } void MASkillUser::OnSkillProcess( LOCAL_TIME LocalTime, float fDelta ) { if( m_hAuraSkill ) { //°ÔÀÓ ¼­¹ö¿¡¼­¸¸ ÆÇ´ÜÇØ¼­ ¼­¹öÂÊ Á¾·á ½Ã۰í/Ŭ¶óÀÌ¾ðÆ®·Î ÆÐŶ Àü¼Û... #if defined(_GAMESERVER) if( m_hAuraSkill->IsFinished() ) { if (m_pActor) m_pActor->CmdFinishAuraSkill(m_hAuraSkill->GetClassID()); // [2011/03/22 semozz] // ÇöÀç ½ºÅ³ÀÌ ¿À¶ó ½ºÅ³°ú °°Àº ½ºÅ³À̸é ÇöÀç ½ºÅ³µµ ÃʱâÈ­. if (m_hProcessSkill == m_hAuraSkill) m_hProcessSkill.Identity(); OnSkillAura( m_hAuraSkill, false ); } else #endif // _GAMESERVER m_hAuraSkill->ProcessExecute( LocalTime, fDelta ); } #ifdef _GAMESERVER if( m_pActor && m_pActor->IsPlayerActor() ) { list::iterator iter = m_listProcessAutoPassiveSkills.begin(); for( iter; m_listProcessAutoPassiveSkills.end() != iter; ) { DnSkillHandle hSkill = *iter; //½ºÅ³ ÇÚµé À¯È¿¼º üũ Ãß°¡ if (!hSkill) { iter = m_listProcessAutoPassiveSkills.erase( iter ); } else { if( hSkill->IsFinished() ) { iter = m_listProcessAutoPassiveSkills.erase( iter ); } else { hSkill->ProcessExecute( LocalTime, fDelta ); ++iter; } } } m_PrefixSkillCoolTimeManager.Process(LocalTime, fDelta); iter = m_listProcessPreFixDefenceSkills.begin(); for( iter; m_listProcessPreFixDefenceSkills.end() != iter; ) { DnSkillHandle hSkill = *iter; //½ºÅ³ ÇÚµé À¯È¿¼º üũ Ãß°¡ if (!hSkill) { iter = m_listProcessPreFixDefenceSkills.erase( iter ); } else { if( hSkill->IsFinished() ) { hSkill->OnEnd( LocalTime, fDelta ); iter = m_listProcessPreFixDefenceSkills.erase( iter ); } else { hSkill->ProcessExecute( LocalTime, fDelta ); ++iter; } } } iter = m_listProcessPreFixOffenceSkills.begin(); for( iter; m_listProcessPreFixOffenceSkills.end() != iter; ) { DnSkillHandle hSkill = *iter; if (!hSkill) { iter = m_listProcessPreFixOffenceSkills.erase( iter ); } else { if( hSkill->IsFinished() ) { hSkill->OnEnd( LocalTime, fDelta ); iter = m_listProcessPreFixOffenceSkills.erase( iter ); } else { hSkill->ProcessExecute( LocalTime, fDelta ); ++iter; } } } if (!m_prefixSystemDefenceSkills.empty()) { PREFIX_SYSTEM_SKILL_LIST::iterator iter = m_prefixSystemDefenceSkills.begin(); PREFIX_SYSTEM_SKILL_LIST::iterator enditer = m_prefixSystemDefenceSkills.end(); for (; iter != enditer; ++iter) { if (iter->second.hSkill) iter->second.hSkill->Process(LocalTime, fDelta); } } if (!m_prefixSystemOffenceSkills.empty()) { PREFIX_SYSTEM_SKILL_LIST::iterator iter = m_prefixSystemOffenceSkills.begin(); PREFIX_SYSTEM_SKILL_LIST::iterator enditer = m_prefixSystemOffenceSkills.end(); for (; iter != enditer; ++iter) { if (iter->second.hSkill) iter->second.hSkill->Process(LocalTime, fDelta); } } } #else m_bSkillExecutedThisFrame = false; #endif if( m_hProcessSkill ) { if( m_hProcessSkill->IsFinished() ) { m_hProcessSkill->OnEnd( LocalTime, fDelta ); m_hProcessSkill.Identity(); } else m_hProcessSkill->ProcessExecute( LocalTime, fDelta ); } // ÄðŸÀÓ °¨¼Ò »óÅÂÈ¿°ú°¡ ÀÖ´Ù¸é µ¨Å¸°ª¿¡ ¿µÇâÀ» ÁÙ °ªÀ» °è»êÇÑ´Ù. if( m_pActor && m_pActor->IsAppliedThisStateBlow( STATE_BLOW::BLOW_096 ) ) { DNVector(DnBlowHandle) vlhCoolTimeBlows; m_pActor->GetStateBlow()->GetStateBlowFromBlowIndex( STATE_BLOW::BLOW_096, vlhCoolTimeBlows ); // ÄðŸÀÓ °¨¼Ò »óÅÂÈ¿°ú´Â - ±âÁØÀ̱⶧¹®¿¡ ÁßøµÇ¸é »©ÁØ´Ù. float fCoolTimeDeltaAdjust = 1.0f; int iNumBlow = (int)vlhCoolTimeBlows.size(); for( int i = 0; i < iNumBlow; ++i ) { fCoolTimeDeltaAdjust -= (1.0f - vlhCoolTimeBlows.at( i )->GetFloatValue()); } // #40670 ½ºÇǸ´ ºÎ½ºÆ®µµ ÄðŸÀÓ °¨¼Ò »óÅÂÈ¿°ú¸¦ »ç¿ëÇÏ°Ô µÊ. // Áßø½Ã WeightTable ¿¡¼­ Á¦ÇÑÀ» ¹Þ°Ô µÈ´Ù. float fCoolTimeAccelMax = CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::CoolTimeAccellSE_Max ); if( fCoolTimeDeltaAdjust < 1.0f - fCoolTimeAccelMax ) fCoolTimeDeltaAdjust = 1.0f - fCoolTimeAccelMax; // 1.0f À» Á¤»ó¼öÄ¡ ±âÁØÀ¸·Î »óÅÂÈ¿°ú ÀÎÀÚ°ªÀ» Àüü ÄðŸÀÓ¿¡ ±×´ë·Î Àû¿ëÇÑ °á°ú°ªÀÌ ÇöÀç ÃÖÁ¾ ÄðŸÀÓ ±âÁØÀ̹ǷΠ// ¸Å ÇÁ·¹ÀÓ Ã³¸®ÇØÁÖ´Â µ¨Å¸ °ª¿¡ ºñÀ²ÀÇ ¿ª¼ö¸¦ °öÇÑ´Ù. // °á°ú·Î ³ª¿Â °ªÀº °¢ ½ºÅ³¿¡¼­ ·çÇÁ¸¦ µ¹ ¶§ ¾×ÅÍ¿¡¼­ ¾ò¾î¿Í¼­ Á÷Á¢ Àû¿ëÇÑ´Ù. 2415ÀÇ Å¸ÀÓ ¿¢¼¿·¯·¹ÀÌ¼Ç ½ºÅ³¸¸ Á¦¿ÜÇϰí. m_fCoolTimeDeltaAdjustValue = 1.0f / fCoolTimeDeltaAdjust; } else m_fCoolTimeDeltaAdjustValue = 1.0f; #ifdef _GAMESERVER #ifndef PRE_FIX_SKILLLIST #ifdef PRE_FIX_GAMESERVER_PERFOMANCE // ÄðŸÀÓ Ã³¸®. ÃßÈÄ¿¡ Äð ŸÀÓ »Ó¸¸ ¾Æ´Ï¶ó ±âŸµîµîÀÇ ¿©·¯°¡Áö Áö¼ÓÀûÀÎ Processing À» ÇÏ°Ô µÉ °ÍÀÓ. if( m_pActor && m_pActor->IsPlayerActor() /*&& m_pActor->IsAllowCallSkillProcess( fDelta )*/ ) { #endif // #ifdef PRE_FIX_GAMESERVER_PERFOMANCE for( DWORD i = 0; i < m_vlhSkillList.size(); i++ ) { if( m_vlhSkillList.at( i ) ) m_vlhSkillList[i]->Process( LocalTime, fDelta ); } #ifdef PRE_FIX_GAMESERVER_PERFOMANCE } #endif // #ifdef PRE_FIX_GAMESERVER_PERFOMANCE #else #ifdef PRE_FIX_GAMESERVER_PERFOMANCE if( m_pActor && m_pActor->IsPlayerActor() /*&& m_pActor->IsAllowCallSkillProcess( fDelta )*/ ) { #endif // #ifdef PRE_FIX_GAMESERVER_PERFOMANCE PROFILE_TIME_TEST_BLOCK_START( "OnSkillProcess() - SkillHandleLoop" ); // ÄðŸÀÓ Ã³¸®. ÃßÈÄ¿¡ Äð ŸÀÓ »Ó¸¸ ¾Æ´Ï¶ó ±âŸµîµîÀÇ ¿©·¯°¡Áö Áö¼ÓÀûÀÎ Processing À» ÇÏ°Ô µÉ °ÍÀÓ. for( DWORD i = 0; i < m_vlSkillObjects.size(); i++ ) { // Ŭ¶óÀ̾ðÆ®ÀÎ °æ¿ì¿£ ½ºÅ³ °´Ã¼ °ü¸®¸¦ ÇÏ´Â SkillTask °¡ ¸ÕÀú ¼Ò¸êµÇ¾î valid üũ¸¦ ÇØ¾ß ÇÔ. if( m_vlSkillObjects.at( i ).hSkill ) m_vlSkillObjects.at( i ).hSkill->Process( LocalTime, fDelta ); } PROFILE_TIME_TEST_BLOCK_END(); #ifdef PRE_FIX_GAMESERVER_PERFOMANCE } #endif // #ifdef PRE_FIX_GAMESERVER_PERFOMANCE #endif // #ifndef PRE_FIX_SKILLLIST #else #ifndef PRE_FIX_SKILLLIST for( DWORD i = 0; i < m_vlhSkillList.size(); i++ ) { if( m_vlhSkillList.at( i ) ) m_vlhSkillList[i]->Process( LocalTime, fDelta ); } #else // ÄðŸÀÓ Ã³¸®. ÃßÈÄ¿¡ Äð ŸÀÓ »Ó¸¸ ¾Æ´Ï¶ó ±âŸµîµîÀÇ ¿©·¯°¡Áö Áö¼ÓÀûÀÎ Processing À» ÇÏ°Ô µÉ °ÍÀÓ. for( DWORD i = 0; i < m_vlSkillObjects.size(); i++ ) { // Ŭ¶óÀ̾ðÆ®ÀÎ °æ¿ì¿£ ½ºÅ³ °´Ã¼ °ü¸®¸¦ ÇÏ´Â SkillTask °¡ ¸ÕÀú ¼Ò¸êµÇ¾î valid üũ¸¦ ÇØ¾ß ÇÔ. if( m_vlSkillObjects.at( i ).hSkill ) m_vlSkillObjects.at( i ).hSkill->Process( LocalTime, fDelta ); } #endif // #ifndef PRE_FIX_SKILLLIST #endif // #ifdef _GAMESERVER // ¾ÆÀÌÅÛ¿¡ ºÙÀº ½ºÅ³ÀÌ ÀÖ´Ù¸é Process if( m_hItemSkill ) { if( m_hItemSkill->IsFinished() ) { m_hItemSkill->OnEnd( LocalTime, fDelta ); deque::iterator iter = find( m_dqhItemSkillList.begin(), m_dqhItemSkillList.end(), m_hItemSkill ); _ASSERT( m_dqhItemSkillList.end() != iter ); m_dqhItemSkillList.erase( iter ); SAFE_RELEASE_SPTR( m_hItemSkill ); } else m_hItemSkill->ProcessExecute( LocalTime, fDelta ); } for( DWORD i = 0; i < m_dqhItemSkillList.size(); ++i ) { m_dqhItemSkillList.at( i )->Process( LocalTime, fDelta ); } // Á¾·á ¿¹¾àµÈ ½ºÅ³µé Á¾·á ½ÃÅ´. int iNumReservedFinishSkill = (int)m_vlhReservedFinishSkill.size(); for( int iSkill = 0; iSkill < iNumReservedFinishSkill; ++iSkill ) { DnSkillHandle hSkill = m_vlhReservedFinishSkill.at( iSkill ); if( hSkill == m_hProcessSkill ) { m_hProcessSkill->OnEnd( LocalTime, fDelta ); m_hProcessSkill.Identity(); } else if( hSkill == m_hToggleSkill ) { _ASSERT( m_hToggleSkill->IsToggleOn() ); if( m_hToggleSkill->IsToggleOn() ) OnSkillToggle( m_hToggleSkill, false ); } else if( hSkill == m_hAuraSkill ) { _ASSERT( m_hAuraSkill->IsAuraOn() ); if( m_hAuraSkill->IsAuraOn() ) OnSkillAura( m_hAuraSkill, false ); } } if( false == m_vlhReservedFinishSkill.empty() ) m_vlhReservedFinishSkill.clear(); } // ÀÌ ÇÔ¼ö´Â ¸ó½ºÅ͵ç Ç÷¹À̾îµç ¹«±âµç OnSignal ¿¡¼­ Projectile ÀÌ °É¸®¸é Ç×»ó È£ÃâµÈ´Ù!! void MASkillUser::OnSkillProjectile( CDnProjectile *pProjectile ) { if( !IsValidActor() ) return; // Projectile ÀÇ °Ñ¸ð½ÀÀ» ½ÇÁ¦·Î ¹Ù²ãÁØ´Ù. bool bClientSide = false; #if defined( _GAMESERVER ) if( m_pActor->GetClassID() <= CDnActor::Reserved6 && m_pActor->IsPlayerActor() && ((CDnPlayerActor*)m_pActor)->IsLocalActor() ) bClientSide = true; #endif // #if defined( _GAMESERVER ) if( m_hToggleSkill && m_hToggleSkill->IsToggleOn() ) { // ÇöÀç Åä±Û Enable µÉ »óÅÂÀÎ ½ºÅ³À» ó¸®ÇÏ´Â °ÍÀÓ. _ASSERT( m_hToggleSkill->IsToggleOn() ); CDnChangeProjectileProcessor* pChangeProj = static_cast(m_hToggleSkill->GetProcessor( IDnSkillProcessor::CHANGE_PROJECTILE )); if( pChangeProj ) { int iCheckProjectileID = ( bClientSide ) ? pChangeProj->GetSourceWeaponID() : pChangeProj->GetChangeWeaponID(); if( pProjectile->GetClassID() == iCheckProjectileID ) { if( m_hToggleSkill->GetDurationType() == CDnSkill::ActiveToggle ) { if( !(m_hToggleSkill->GetDecreaseMP() > 0 && m_pActor->GetSP() < m_hToggleSkill->GetDecreaseMP()) ) { // ¸¶À»¿¡¼­´Â SP ¾È ±ïÀ̵µ·Ï #ifndef _GAMESERVER if( CDnWorld::MapTypeVillage != CDnWorld::GetInstance().GetMapType() ) #endif m_pActor->UseMP( -m_hToggleSkill->GetDecreaseMP() ); //m_pActor->SetSP( m_pActor->GetSP() - m_hToggleSkill->GetDecreaseMP() ); if( bClientSide ) { int iWeaponLength = pProjectile->GetWeaponLength() - pProjectile->GetOriginalWeaponLength(); *(CDnWeapon*)pProjectile = *pChangeProj->GetProjectile(); pProjectile->SetWeaponLength( iWeaponLength + pProjectile->GetOriginalWeaponLength() ); } OnSkillToggleProjectile( m_hToggleSkill, pProjectile ); if( m_pActor->GetSP() < m_hToggleSkill->GetDecreaseMP() ) { OnSkillToggle( m_hToggleSkill, false ); } } } } } else { // ChangeAction À̶ó°í ÁöÈ£¾¾°¡ Ãß°¡ÇÑ °Å ÀÖÀ½ CDnChangeActionStrProcessor* pChangeAction = static_cast(m_hToggleSkill->GetProcessor( IDnSkillProcessor::CHANGE_ACTIONSTR )); if( pChangeAction ) { if( m_hToggleSkill->GetDurationType() == CDnSkill::ActiveToggle ) { if( !(m_hToggleSkill->GetDecreaseMP() > 0 && m_pActor->GetSP() < m_hToggleSkill->GetDecreaseMP()) ) { // ¸¶À»¿¡¼­´Â SP ¾È ±ïÀ̵µ·Ï #ifndef _GAMESERVER if( CDnWorld::MapTypeVillage != CDnWorld::GetInstance().GetMapType() ) #endif m_pActor->UseMP( -m_hToggleSkill->GetDecreaseMP() ); //m_pActor->SetSP( m_pActor->GetSP() - m_hToggleSkill->GetDecreaseMP() ); OnSkillToggleProjectile( m_hToggleSkill, pProjectile ); if( m_pActor->GetSP() < m_hToggleSkill->GetDecreaseMP() ) { OnSkillToggle( m_hToggleSkill, false ); } } } } } } #ifdef _GAMESERVER if( pProjectile && !bClientSide ) { // Note Çѱâ: Á÷Á¢ µ¥¹ÌÁö °è»ê¿¡ ÇÊ¿äÇÑ ActorState ¸¦ Projectile ¿¡ ½Ç¾î¼­ ³¯¸®´Â ¹æ¹ýÀ¸·Î º¯°æ. // Åä±Û ½ºÅ³ÀÌ ¾Æ´Ñ ÇÁ·ÎÁ§Å¸ÀÏÀ» ½î´Â ½ºÅ³ÀÎ °æ¿ì¿£ ¿©±â¼­ °ø°Ý·Â Àû¿ë½ÃÄÑÁÜ if( !m_hToggleSkill && m_hProcessSkill ) { static_cast(this)->GetStateBlow()->Process( 0, 0.0f ); CDnActor* pActor = static_cast(this); // üÀÎ ½ºÅ³ »óÅÂÈ¿°ú¸¦ ¾²´Â ¹ß»çü´Â // CDnState º¹»ç°¡ ¸Å¿ì ºó¹øÇÏ°Ô ÀϾ ¼ö ÀÖÀ¸¹Ç·Î shaared_ptr »ç¿ë. boost::shared_ptr pActorStateSnapshot = boost::shared_ptr(new CDnState); *pActorStateSnapshot = *(static_cast(pActor)); // ½ºÅ³ÀÎ °æ¿ì¿¡¸¸ ¿©±â¼­ pProjectile->FromSkill( true ); pProjectile->SetShooterStateSnapshot( pActorStateSnapshot ); #if defined(PRE_FIX_65287) float fFinalDamageRate = 0.0f; if (pActor && pActor->IsAppliedThisStateBlow(STATE_BLOW::BLOW_050)) { DNVector(DnBlowHandle) vlhBlows; pActor->GatherAppliedStateBlowByBlowIndex( STATE_BLOW::BLOW_050, vlhBlows ); int iNumBlow = (int)vlhBlows.size(); for( int i = 0; i < iNumBlow; ++i ) { fFinalDamageRate += vlhBlows[i]->GetFloatValue(); } } pProjectile->SetShooterFinalDamageRate(fFinalDamageRate); #endif // PRE_FIX_65287 } else if( m_hToggleSkill && m_hToggleSkill->IsToggleOn() ) { // ÇöÀç Åä±Û ½ºÅ³Àº »ç¿ëµÇÁö ¾ÊÁö¸¸ ÃßÈÄ ¾îÂîµÉÁö ¸ô¶ó ÄÚµå ³²°ÜµÒ. 2011.03.15 // Åä±ÛÀ» ÄÒ ´ç½ÃÀÇ ´É·ÂÄ¡·Î ÇÁ·ÎÁ§Å¸ÀÏ¿¡ ¼ÂÆÃÇØ ÁÜ. boost::shared_ptr pActorStatesnapshot = boost::shared_ptr( new CDnState ); *pActorStatesnapshot = m_ActorStateSnapshotForToggleProjectile; pProjectile->SetShooterStateSnapshot( pActorStatesnapshot ); pProjectile->FromSkill( true ); #if defined(PRE_FIX_65287) CDnActor* pActor = static_cast(this); float fFinalDamageRate = 0.0f; if (pActor && pActor->IsAppliedThisStateBlow(STATE_BLOW::BLOW_050)) { DNVector(DnBlowHandle) vlhBlows; pActor->GatherAppliedStateBlowByBlowIndex( STATE_BLOW::BLOW_050, vlhBlows ); int iNumBlow = (int)vlhBlows.size(); for( int i = 0; i < iNumBlow; ++i ) { fFinalDamageRate += vlhBlows[i]->GetFloatValue(); } } pProjectile->SetShooterFinalDamageRate(fFinalDamageRate); #endif // PRE_FIX_65287 } else if( m_pActor->IsAppliedThisStateBlow( STATE_BLOW::BLOW_121 ) || m_pActor->IsAppliedThisStateBlow( STATE_BLOW::BLOW_129 ) ) { // #30362 ½ºÅÄµå ¾×¼Ç º¯°æ »óÅÂÈ¿°ú¿¡¼­ ¹ß»çü¸¦ ½î´Â °æ¿ì¿¡µµ ½ºÅ³ ¹ß»çü·Î ó¸® ÇÔ. pProjectile->FromSkill( true ); } } #endif } void MASkillUser::OnSkillToggleProjectile( DnSkillHandle hSkill, CDnProjectile *pProjectile ) { } void MASkillUser::OnSkillToggle( DnSkillHandle hSkill, bool bEnable ) { if( !IsValidActor() ) return; if( bEnable ) { switch( hSkill->GetDurationType() ) { case CDnSkill::ActiveToggle: case CDnSkill::ActiveToggleForSummon: // ¸¶À»¿¡¼­´Â SP ¾È ±ïÀ̵µ·Ï #ifndef _GAMESERVER if( CDnWorld::MapTypeVillage != CDnWorld::GetInstance().GetMapType() ) #endif // Åä±Û¸µÇÒ¶© ±ïÀÌÁö ¾Ê´Â´Ù. ¾µ ¶§ ±ïÀÓ //m_pActor->SetSP( m_pActor->GetSP() - hSkill->GetDecreaseSP() ); hSkill->OnBegin( m_LocalTime, 0.0f ); break; case CDnSkill::TimeToggle: hSkill->OnBegin( m_LocalTime, 0.0f ); break; } SkillToggle(hSkill, true); } else { SkillToggle(hSkill, false); hSkill->OnEnd( m_LocalTime, 0.0f ); hSkill->EnableToggle( false ); } //if( bEnable ) { // switch( hSkill->GetDurationType() ) { // case CDnSkillBase::TimeToggle: // pActor->SetSP( pActor->GetSP() - hSkill->GetDecreaseSP() ); // hSkill->Execute( m_LocalTime, 0.f ); // break; // case CDnSkillBase::ActiveToggle: // hSkill->Execute( m_LocalTime, 0.f ); // break; // case CDnSkillBase::Aura: // pActor->SetSP( pActor->GetSP() - hSkill->GetDecreaseSP() ); // hSkill->Execute( m_LocalTime, 0.f ); // break; // } //} //else { // hSkill->Finish( m_LocalTime, 0.f ); //} } void MASkillUser::OnSkillAura( DnSkillHandle hSkill, bool bEnable ) { if( !IsValidActor() ) return; if( bEnable ) { switch( hSkill->GetDurationType() ) { case CDnSkill::Aura: // ¸¶À»¿¡¼­´Â SP ¾È ±ïÀ̵µ·Ï #ifndef _GAMESERVER if( CDnWorld::MapTypeVillage != CDnWorld::GetInstance().GetMapType() ) #endif m_pActor->UseMP( -hSkill->GetDecreaseMP() ); //m_pActor->SetSP( m_pActor->GetSP() - hSkill->GetDecreaseMP() ); hSkill->OnBegin( m_LocalTime, 0.0f ); break; } m_hAuraSkill = hSkill; } else { hSkill->OnEnd( m_LocalTime, 0.0f ); hSkill->EnableAura( false ); if( m_hAuraSkill == hSkill ) m_hAuraSkill.Identity(); } } void MASkillUser::ResetToggleSkill() { //if( m_hToggleSkill ) // m_hToggleSkill.Identity(); //int iNumToggle = (int)m_vlhToggleSkills.size(); //for( int i = 0; i < iNumToggle; ++i ) //{ // if( m_vlhToggleSkills.at(i)->IsToggleOn() ) // OnSkillToggle( m_vlhToggleSkills.at(i), false ); //} } void MASkillUser::ResetAuraSkill() { //if( m_hAuraSkill ) // m_hAuraSkill.Identity(); //int iNumAura = (int)m_vlhAuraSkills.size(); //for( int i = 0; i < iNumAura; ++i ) //{ // if( m_vlhAuraSkills.at(i)->IsAuraOn() ) // OnSkillAura( m_vlhAuraSkills.at(i), false ); //} } bool MASkillUser::IsProcessSkill() { if( !m_hProcessSkill ) return false; return !m_hProcessSkill->IsFinished(); return true; } DWORD MASkillUser::GetSkillCount() { #ifndef PRE_FIX_SKILLLIST return (DWORD)m_vlhSkillList.size(); #else return (DWORD)m_vlSkillObjects.size(); #endif // #ifndef PRE_FIX_SKILLLIST } DnSkillHandle MASkillUser::GetSkillFromIndex( DWORD dwIndex ) { #ifndef PRE_FIX_SKILLLIST if( dwIndex < 0 || dwIndex >= m_vlhSkillList.size() ) return CDnSkill::Identity(); return m_vlhSkillList[dwIndex]; #else if( dwIndex < 0 || dwIndex >= m_vlSkillObjects.size() ) return CDnSkill::Identity(); return m_vlSkillObjects.at( dwIndex ).hSkill; #endif // #ifndef PRE_FIX_SKILLLIST } CDnSkill::UsingResult MASkillUser::UseSkill( int nSkillTableID, bool bCheckValid, bool bAutoUseFromServer/* = false*/, int nLuaSkillIndex/*=-1*/ ) { CDnSkill::UsingResult eResult = CDnSkill::UsingResult::Failed; DnSkillHandle hSkill = FindSkill( nSkillTableID ); if( hSkill ) { if( m_pActor && m_pActor->IsPlayerActor() ) { if( hSkill->GetSkillType() == CDnSkill::SkillTypeEnum::EnchantPassive ) return CDnSkill::UsingResult::Hack; } #ifdef _GAMESERVER // ¼­¹öÀÇ ÄðŸÀÓ ¿ÀÂ÷¸¦ °¨¾ÈÇØ¼­ 0.5ÃÊÀÇ ¿©À¯¸¦ µÎ°í ÀÖÁö¸¸, // Á¸À̵¿ÇÒ¶§³ª ±âŸ 0.5ÃÊ ÀÌ»ó Ŭ¶óÀÌ¾ðÆ®¿Í ¹ú¾îÁö´Â ´Ù¸¥ »õ·Î¿î °æ¿ìµéÀÌ »ý±æ ¼ö ÀÖÀ¸¹Ç·Î // ÃÖÁ¾ ½ºÅ³ »ç¿ëÇÑ Å¸ÀÓ ½ºÅÆÇÁ¸¦ Âï¾îµÎ¾î µ¥ÀÌÅÍ¿¡ ÁöÁ¤µÈ ½ºÅ³ÀÇ ÄðŸÀÓº¸Å¸ °£°ÝÀÌ Å©´Ù¸é // ¼­¹öÀÇ ½ºÅ³ °´Ã¼¿¡ ÀúÀåµÇ¾îÀÖ´Â ÄðŸÀÓÀ» ÃʱâÈ­ ½ÃÄÑÁÖµµ·Ï ÇÑ´Ù. (#19737) hSkill->UpdateSkillCoolTimeExactly(); #endif eResult = CanExecuteSkill( hSkill ); if( !bCheckValid || CDnSkill::UsingResult::Success == eResult ) { #if defined(_CLIENT) //½ºÅ³ »ç¿ëÀÌ ¼º°øÀÌ¶óµµ ¼Òȯ ¸ó½ºÅͰ¡ ÀÖ´Ù¸é ¼Òȯ ¸ó½ºÅ͸¦ ¼Òȯ ÇØÁ¦¸¸ ÇÏ°í ½ÇÁ¦ ½ºÅ³ »ç¿ëÀº ¾ÈµÊ.. if (hSkill->GetDurationType() == CDnSkill::DurationTypeEnum::SummonOnOff) { if (hSkill->SummonMonsterOff()) return eResult; } #endif // _CLIENT #ifdef _GAMESERVER ExecuteSkill( hSkill, m_LocalTime, 0.f ); #else ExecuteSkill( hSkill, m_LocalTime, 0.f, bCheckValid, bAutoUseFromServer ); #endif } #if defined(_CLIENT) else { // ½ºÅ³ »ç¿ëÀÌ ½ÇÆÐ Çß´õ¶óµµ ¼Òȯ ¸ó½ºÅͰ¡ ÀÖ´Ù¸é ¼Òȯ ¸ó½ºÅÍ ¼Òȯ ÇØÁ¦ ½ÃÅ´. if (hSkill->GetDurationType() == CDnSkill::DurationTypeEnum::SummonOnOff) hSkill->SummonMonsterOff(); } #endif // _CLIENT } return eResult; } bool MASkillUser::UseItemSkill( int nSkillTableID, int nSkillLevelTableID, CDnItem::ItemSkillApplyType ItemSkillApplyType, int nItemID/* = -1*/ ) { if( !IsValidActor() ) return false; bool bResult = true; switch( ItemSkillApplyType ) { case CDnItem::ApplySkill: { // ¿©±â¼­ »ý¼ºµÈ ¾ÆÀÌÅÛ ½ºÅ³Àº OnProcessSkill ÇÔ¼ö¿¡¼­ Finish üũ¸¦ ÇÏ¿© ¸®½ºÆ®¿¡¼­ ¾Ë¾Æ¼­ »èÁ¦ÇØÁØ´Ù. DnSkillHandle hSkill = CDnSkill::CreateSkill( m_pActor->GetMySmartPtr(), nSkillTableID, nSkillLevelTableID ); if( !hSkill ) { bResult = false; break; } // ¾ÆÀÌÅÛ¿¡ ºÙÀº ½ºÅ³·Î ¼ÂÆÃÇØÁÜ. hSkill->AsItemSkill(); #if defined(_GAMESERVER) hSkill->SetItemID(nItemID); #endif // _GAMESERVER m_dqhItemSkillList.push_back( hSkill ); ExecuteSkill( hSkill, m_LocalTime, 0.f ); m_hItemSkill = hSkill; } break; // »èÁ¦ ¿¹Á¤. case CDnItem::ApplyStateBlow: { //// ¿©±â¿¡ µé¾î¿À´Â Instant ¾ÆÀÌÅÛÀÎ °æ¿ì CDnItemTask ¿¡¼­ ¾ÆÀÌÅÛ »ý¼ºÇÏ°í °ð¹Ù·Î »èÁ¦ÇÔ. //DnSkillHandle hSkill = CDnSkill::CreateSkill( m_pActor->GetMySmartPtr(), nSkillTableID, nSkillLevelTableID ); // //if( !hSkill ) // bResult = false; //hSkill->AsItemSkill(); //// °­Á¦·Î »óÅÂÈ¿°ú µ¿±â¸¦ ¸ÂÃçÁÖ´Â ÇÔ¼ö. //hSkill->OnBeginForceSync( m_LocalTime, 0.0f ); //hSkill->Release(); } break; } return bResult; } void MASkillUser::ResetSkillCoolTime( void ) { #ifndef PRE_FIX_SKILLLIST int iNumSkill = (int)m_vlhSkillList.size(); for( int iSkill = 0; iSkill < iNumSkill; ++iSkill ) { DnSkillHandle hSkill = m_vlhSkillList.at( iSkill ); if( hSkill ) hSkill->ResetCoolTime(); } #else for( DWORD i = 0; i < m_vlSkillObjects.size(); ++i ) { DnSkillHandle hSkill = m_vlSkillObjects.at( i ).hSkill; if (hSkill) hSkill->ResetCoolTime(); } #endif // #ifndef PRE_FIX_SKILLLIST #if defined(_GAMESERVER) m_listProcessPreFixDefenceSkills.clear(); m_listProcessPreFixOffenceSkills.clear(); if (!m_prefixSystemDefenceSkills.empty()) { PREFIX_SYSTEM_SKILL_LIST::iterator iter = m_prefixSystemDefenceSkills.begin(); PREFIX_SYSTEM_SKILL_LIST::iterator enditer = m_prefixSystemDefenceSkills.end(); for (; iter != enditer; ++iter) { if (iter->second.hSkill) iter->second.hSkill->ResetCoolTime(); } } if (!m_prefixSystemOffenceSkills.empty()) { PREFIX_SYSTEM_SKILL_LIST::iterator iter = m_prefixSystemOffenceSkills.begin(); PREFIX_SYSTEM_SKILL_LIST::iterator enditer = m_prefixSystemOffenceSkills.end(); for (; iter != enditer; ++iter) { if (iter->second.hSkill) iter->second.hSkill->ResetCoolTime(); } } m_PrefixSkillCoolTimeManager.InitList(); #endif // _GAMESERVER } void MASkillUser::ResetPvPSkillCoolTime() { #ifndef PRE_FIX_SKILLLIST int iNumSkill = (int)m_vlhSkillList.size(); for( int iSkill = 0; iSkill < iNumSkill; ++iSkill ) { DnSkillHandle hSkill = m_vlhSkillList.at( iSkill ); if( hSkill->GetSkillType() == CDnSkill::SkillTypeEnum::Active ) { hSkill->OnBeginCoolTime(); } } #else for( DWORD i = 0; i < m_vlSkillObjects.size(); ++i ) { DnSkillHandle hSkill = m_vlSkillObjects.at( i ).hSkill; if( hSkill->GetSkillType() == CDnSkill::SkillTypeEnum::Active ) { hSkill->OnBeginCoolTime(); } } #endif // #ifndef PRE_FIX_SKILLLIST } void MASkillUser::ResetLadderSkillCoolTime() { #ifndef PRE_FIX_SKILLLIST ResetSkillCoolTime(); int iNumSkill = (int)m_vlhSkillList.size(); for( int iSkill = 0; iSkill < iNumSkill; ++iSkill ) { DnSkillHandle hSkill = m_vlhSkillList.at( iSkill ); hSkill->SetElapsedDelayTime( hSkill->GetDelayTime()/2 ); } #else ResetSkillCoolTime(); for( DWORD i = 0; i < m_vlSkillObjects.size(); ++i ) { DnSkillHandle hSkill = m_vlSkillObjects.at( i ).hSkill; hSkill->SetElapsedDelayTime( hSkill->GetDelayTime()/2 ); } #endif // #ifndef PRE_FIX_SKILLLIST } #ifdef _GAMESERVER void MASkillUser::IgnoreSkillCoolTime( void ) { #ifndef PRE_FIX_SKILLLIST int iNumSkill = (int)m_vlhSkillList.size(); for( int iSkill = 0; iSkill < iNumSkill; ++iSkill ) { DnSkillHandle hSkill = m_vlhSkillList.at( iSkill ); hSkill->IgnoreCoolTime(); } m_bIgnoreCoolTime = true; #else for( DWORD i = 0; i < m_vlSkillObjects.size(); ++i ) { DnSkillHandle hSkill = m_vlSkillObjects.at( i ).hSkill; hSkill->IgnoreCoolTime(); } m_bIgnoreCoolTime = true; #endif // #ifndef PRE_FIX_SKILLLIST } #endif void MASkillUser::ReserveFinishSkill( DnSkillHandle hSkill ) { if( hSkill ) { m_vlhReservedFinishSkill.push_back( hSkill ); } } void MASkillUser::CancelUsingSkill( void ) { if( m_hProcessSkill ) { m_hProcessSkill->OnEnd( 0, 0.0f ); m_hProcessSkill.Identity(); } }; void MASkillUser::OnAttachWeapon( DnWeaponHandle hWeapon, int iChangedWeaponIndex ) { // ÆÐ½Ãºê ½ºÅ³µé Áß¿¡ »ç¿ë°¡´É ¹«±â¸¦ Á¤ÀÇÇÑ °ÍµéÀÌ ÀÖ³ª üũ. // ´Ù¸¥ ¹«±â¸¦ Â÷°í À־ ÆÐ½Ãºê »óÅÂÈ¿°úµéÀÌ Àû¿ëµÈ »óŰ¡ ¾Æ´Ï¶ó¸é Ȱ¼ºÈ­ ½ÃÄÑÁØ´Ù. int iNumSelfBlowPassiveSkills = (int)m_vlhSelfPassiveBlowSkill.size(); for( int i = 0; i < iNumSelfBlowPassiveSkills; ++i ) { DnSkillHandle hSkill = m_vlhSelfPassiveBlowSkill.at( i ); if( false == hSkill->IsAppliedPassiveBlows() ) { // ³»ºÎ¿¡¼­ »ç¿ë°¡´É ¹«±â üũ ÇÔ. ApplyPassiveSkill( hSkill ); } } // rangechecker ÀÖ´Â ½ºÅ³µéÀº ¹«±â áÀ» ¶§ ¾÷µ¥ÀÌÆ® ÇØÁØ´Ù. #ifndef _GAMESERVER #ifndef PRE_FIX_SKILLLIST int iNumSkill = (int)m_vlhSkillList.size(); for( int i = 0; i < iNumSkill; ++i ) { DnSkillHandle hSkill = m_vlhSkillList.at( i ); hSkill->UpdateRangeChecker( hSkill->GetSelectedLevelDataType() ); } #else for( DWORD i = 0; i < m_vlSkillObjects.size(); ++i ) { DnSkillHandle hSkill = m_vlSkillObjects.at( i ).hSkill; hSkill->UpdateRangeChecker( hSkill->GetSelectedLevelDataType() ); } #endif // #ifndef PRE_FIX_SKILLLIST #endif } void MASkillUser::OnDetachWeapon( DnWeaponHandle hWeapon, int iDetachedWeaponIndex ) { // ÆÐ½Ãºê ½ºÅ³µé Áß¿¡ »ç¿ë°¡´É ¹«±â¸¦ Á¤ÀÇÇÑ °ÍµéÀÌ ÀÖ³ª üũ. // ¿ä±¸ÇÏ´Â ¹«±â¿Í ¸ÂÁö ¾Ê´Â´Ù¸é ÆÐ½Ãºê ½ºÅ³¿¡ µþ¸° »óÅÂÈ¿°úµéÀ» Á¦°ÅÇÑ´Ù. int iNumSelfBlowPassiveSkills = (int)m_vlhSelfPassiveBlowSkill.size(); for( int i = 0; i < iNumSelfBlowPassiveSkills; ++i ) { DnSkillHandle hSkill = m_vlhSelfPassiveBlowSkill.at( i ); if( hSkill->IsAppliedPassiveBlows() ) { if( false == hSkill->IsSatisfyWeapon() ) { int iNumStateBlow = hSkill->GetStateEffectCount(); for( int iBlow = 0; iBlow < iNumStateBlow; ++iBlow ) { const CDnSkill::StateEffectStruct* pSE = hSkill->GetStateEffectFromIndex( iBlow ); DNVector(DnBlowHandle) vlAppliedBlows; m_pActor->GatherAppliedStateBlowByBlowIndex( (STATE_BLOW::emBLOW_INDEX)pSE->nID, vlAppliedBlows ); int iNumAppliedBlow = (int)vlAppliedBlows.size(); for( int iAppliedBlow = 0; iAppliedBlow < iNumAppliedBlow; ++iAppliedBlow ) { DnBlowHandle hBlow = vlAppliedBlows.at( iAppliedBlow ); if( hBlow->GetParentSkillInfo()->iSkillID == hSkill->GetClassID() ) { // Çö½ÃÁ¡¿¡¼­ °ð¹Ù·Î »èÁ¦ //m_pActor->GetStateBlow()->RemoveImediatlyStateEffectFromID( hBlow->GetBlowID() ); //RebirthBlow¿¡¼­ OnBegin¿¡¼­ Ÿ°í µé¾î¿Í¼­ »èÁ¦°¡ µÇ´Â °æ¿ì°¡ ¹ß»ý. //Áï½Ã Áö¿ìÁö ¾Ê°í Áö¿ò ¸®½ºÆ®¿¡ Ãß°¡ Çϵµ·Ï ¼öÁ¤ m_pActor->GetStateBlow()->RemoveStateBlowFromID(hBlow->GetBlowID()); } } } hSkill->SetAppliedPassiveBlows( false ); } } } // rangechecker ÀÖ´Â ½ºÅ³µéÀº ¹«±â áÀ» ¶§ ¾÷µ¥ÀÌÆ® ÇØÁØ´Ù. #ifndef _GAMESERVER #ifndef PRE_FIX_SKILLLIST int iNumSkill = (int)m_vlhSkillList.size(); for( int i = 0; i < iNumSkill; ++i ) { DnSkillHandle hSkill = m_vlhSkillList.at( i ); hSkill->UpdateRangeChecker( hSkill->GetSelectedLevelDataType() ); } #else for( DWORD i = 0; i < m_vlSkillObjects.size(); ++i ) { DnSkillHandle hSkill = m_vlSkillObjects.at( i ).hSkill; hSkill->UpdateRangeChecker( hSkill->GetSelectedLevelDataType() ); } #endif // #ifndef PRE_FIX_SKILLLIST #endif } #ifdef _GAMESERVER void MASkillUser::SelectSkillLevelDataType( int iLevelDataType, bool bPlayerSummonedMonster/* = false*/ ) { #ifndef PRE_FIX_SKILLLIST for( int i = 0; i < (int)m_vlhSkillList.size(); ++i ) { DnSkillHandle hSkill = m_vlhSkillList.at( i ); hSkill->SelectLevelDataType( iLevelDataType, bPlayerSummonedMonster ); } #else for( DWORD i = 0; i < m_vlSkillObjects.size(); ++i ) { DnSkillHandle hSkill = m_vlSkillObjects.at( i ).hSkill; hSkill->SelectLevelDataType( iLevelDataType, bPlayerSummonedMonster ); } #endif // #ifndef PRE_FIX_SKILLLIST } int MASkillUser::GetSelectedSkillLevelDataType( void ) { #ifndef PRE_FIX_SKILLLIST if( m_vlhSkillList.empty() ) return CDnSkill::NUM_SKILLLEVEL_APPLY_TYPE; else return m_vlhSkillList.front()->GetSelectedLevelDataType(); #else if( m_vlSkillObjects.empty() ) return CDnSkill::NUM_SKILLLEVEL_APPLY_TYPE; else return m_vlSkillObjects.front().hSkill->GetSelectedLevelDataType(); #endif // #ifndef PRE_FIX_SKILLLIST } #endif #ifndef _GAMESERVER bool MASkillUser::IsUsingSkillAction( const char *szAction ) { if( m_setUseActionNames.find( szAction ) != m_setUseActionNames.end() ) return true; return false; } #endif void MASkillUser::AddStateBlowIDToRemove(int blowID) { m_vlStateBlowIDToRemove.insert(std::map::value_type(blowID, blowID)); } void MASkillUser::InitStateBlowIDToRemove() { m_vlStateBlowIDToRemove.clear(); } #ifdef _GAMESERVER void MASkillUser::RemoveApplySEWhenTargetNormalHitProcessor( IDnSkillProcessor* pProcessor ) { DNVector( IDnSkillProcessor* )::iterator iter = find( m_vlpApplySEWhenNormalHitProcessor.begin(), m_vlpApplySEWhenNormalHitProcessor.end(), pProcessor ); if( m_vlpApplySEWhenNormalHitProcessor.end() != iter ) m_vlpApplySEWhenNormalHitProcessor.erase( iter ); } #endif #if defined(_GAMESERVER) bool MASkillUser::AddPreFixSystemDefenceSkill(int slotIndex, DnSkillHandle hSkill) { if (!hSkill) { RemovePreFixSystemDefenceSkill(slotIndex); return false; } PREFIX_SYSTEM_SKILLINFO skillInfo; skillInfo.slotIndex = slotIndex; skillInfo.hSkill = hSkill; skillInfo.hSkill->SetItemPrefixSkill(); //ÇØ´ç ½ºÅ³ÀÇ È®·ü°ªÀ» °¡Á®¿Â´Ù. CDnProbabilityChecker* pProbabilityChecker = static_cast(hSkill->GetChecker(IDnSkillUsableChecker::PROB_CHECKER)); skillInfo.fRatio = pProbabilityChecker ? pProbabilityChecker->GetProbability() : 0.0f; bool bResult = m_prefixSystemDefenceSkills.insert(PREFIX_SYSTEM_SKILL_LIST::value_type(slotIndex, skillInfo)).second; // if (bResult) // RefreshPrefixDefenceSkills(); #if defined(PRE_ADD_PREFIX_SYSTE_RENEW) AddPrefixDefenceSkill(hSkill); #endif // PRE_ADD_PREFIX_SYSTE_RENEW return bResult; } void MASkillUser::RemovePreFixSystemDefenceSkill(int slotIndex) { PREFIX_SYSTEM_SKILL_LIST::iterator iter = m_prefixSystemDefenceSkills.find(slotIndex); if (iter != m_prefixSystemDefenceSkills.end()) { DnSkillHandle hSkill = iter->second.hSkill; #if defined(PRE_ADD_PREFIX_SYSTE_RENEW) RemovePrefixDefenceSkill(hSkill); #endif // PRE_ADD_PREFIX_SYSTE_RENEW RemoveProcessPrefixDefenceSkill(hSkill); SAFE_RELEASE_SPTR(hSkill); m_prefixSystemDefenceSkills.erase(iter); //RefreshPrefixDefenceSkills(); } } void MASkillUser::RemoveProcessPrefixDefenceSkill(DnSkillHandle hSkill) { list::iterator iter = m_listProcessPreFixDefenceSkills.begin(); for( ; iter != m_listProcessPreFixDefenceSkills.end(); ) { DnSkillHandle hProcessPrefixDefenceSkill = *iter; if (hProcessPrefixDefenceSkill == hSkill) { iter = m_listProcessPreFixDefenceSkills.erase(iter); continue; } ++iter; } } void MASkillUser::RefreshPrefixDefenceSkills() { PREFIX_SYSTEM_SKILL_COLLECTION sameSkillList; //1. ½½·Ôº°·Î ÀúÀåµÈ ½ºÅ³µéÀ» °°Àº ½ºÅ³³¢¸® ¼öÁýÇÑ´Ù. GroupingPrefixDefenceSkillsBySameSkillID(m_prefixSystemDefenceSkills, sameSkillList); PREFIX_SYSTEM_SKILL_LIST tempCandiateDefenceSkills; //2. °°Àº ½ºÅ³µé È®·üÀ» ´õÇØ¼­ È®·üÀ» °áÁ¤Çϰí, °°Àº ½ºÅ³Áß ·¹º§ÀÌ ³ôÀº ³à¼®À» ¼±ÅÃÇÑ´Ù. CalculateProbabilitySkill(tempCandiateDefenceSkills, sameSkillList); //3. ½ºÅ³IDº°·Î ·¹º§ÀÌ ³ôÀº ³à¼®ÀÇ ¸®½ºÆ®¿¡¼­ ½ºÅ³ÀÇ ¿ì¼±¼øÀ§º°·Î ±×·ìÇÎÇÑ´Ù. GroupingSkillByPriority(m_PrefixSystemCandiateDefenceSkills, tempCandiateDefenceSkills); } bool MASkillUser::AddPreFixSystemOffenceSkill(int slotIndex, DnSkillHandle hSkill) { if (!hSkill) { RemovePreFixSystemOffenceSkill(slotIndex); return false; } PREFIX_SYSTEM_SKILLINFO skillInfo; skillInfo.slotIndex = slotIndex; skillInfo.hSkill = hSkill; skillInfo.hSkill->SetItemPrefixSkill(); //ÇØ´ç ½ºÅ³ÀÇ È®·ü°ªÀ» °¡Á®¿Â´Ù. CDnProbabilityChecker* pProbabilityChecker = static_cast(hSkill->GetChecker(IDnSkillUsableChecker::PROB_CHECKER)); skillInfo.fRatio = pProbabilityChecker ? pProbabilityChecker->GetProbability() : 0.0f; bool bResult = m_prefixSystemOffenceSkills.insert(PREFIX_SYSTEM_SKILL_LIST::value_type(slotIndex, skillInfo)).second; // if (bResult) // RefreshPrefixOffenceSkills(); #if defined(PRE_ADD_PREFIX_SYSTE_RENEW) AddPrefixOffenceSkill(hSkill); #endif // PRE_ADD_PREFIX_SYSTE_RENEW return bResult; } void MASkillUser::RemovePreFixSystemOffenceSkill(int slotIndex) { PREFIX_SYSTEM_SKILL_LIST::iterator iter = m_prefixSystemOffenceSkills.begin(); for( ; iter != m_prefixSystemOffenceSkills.end(); ) { if( iter->first == slotIndex ) { DnSkillHandle hSkill = iter->second.hSkill; hSkill->OnEnd( 0, 0.f ); #if defined(PRE_ADD_PREFIX_SYSTE_RENEW) RemovePrefixOffenceSkill(hSkill); #endif // PRE_ADD_PREFIX_SYSTE_RENEW RemoveProcessPrefixOffenceSkill(hSkill); SAFE_RELEASE_SPTR(hSkill); iter = m_prefixSystemOffenceSkills.erase(iter); continue; } ++iter; } } void MASkillUser::RemoveProcessPrefixOffenceSkill(DnSkillHandle hSkill) { list::iterator iter = m_listProcessPreFixOffenceSkills.begin(); for( ; iter != m_listProcessPreFixOffenceSkills.end(); ) { DnSkillHandle hProcessPrefixOffenceSkill = *iter; if (hProcessPrefixOffenceSkill == hSkill) { iter = m_listProcessPreFixOffenceSkills.erase(iter); continue; } ++iter; } } void MASkillUser::RefreshPrefixOffenceSkills(float fHitDamageProb) { PREFIX_SYSTEM_SKILL_COLLECTION sameSkillList; //1. ½½·Ôº°·Î ÀúÀåµÈ ½ºÅ³µéÀ» °°Àº ½ºÅ³³¢¸® ¼öÁýÇÑ´Ù. GroupingPrefixDefenceSkillsBySameSkillID(m_prefixSystemOffenceSkills, sameSkillList); PREFIX_SYSTEM_SKILL_LIST tempCandiateOffenceSkills; //2. °°Àº ½ºÅ³µé È®·üÀ» ´õÇØ¼­ È®·üÀ» °áÁ¤Çϰí, °°Àº ½ºÅ³Áß ·¹º§ÀÌ ³ôÀº ³à¼®À» ¼±ÅÃÇÑ´Ù. CalculateProbabilitySkill(tempCandiateOffenceSkills, sameSkillList); //3. ½ºÅ³IDº°·Î ·¹º§ÀÌ ³ôÀº ³à¼®ÀÇ ¸®½ºÆ®¿¡¼­ ½ºÅ³ÀÇ ¿ì¼±¼øÀ§º°·Î ±×·ìÇÎÇÑ´Ù. GroupingSkillByPriority(m_PrefixSystemCandiateOffenceSkills, tempCandiateOffenceSkills, fHitDamageProb); } void MASkillUser::ProcessPrefixDefenceSkill(DnActorHandle hHitter) { //Á¢µÎ¾î ½Ã½ºÅÛ ¹æ¾î¿ë ½ºÅ³ µî·ÏµÇ µÇ¾î ÀÖÁö ¾Ê´Ù¸é if (m_prefixSystemDefenceSkills.empty()) return; OutputDebug("Á¢µÎ¾î ¹æ¾î¿ë ½ºÅ³ ½ÃÀÛ-----------------------------!!\n"); //Á¢µÎ¾î ½Ã½ºÅÛ ¹æ¾î¿ë ½ºÅ³Áß ¼±ÅÃ.. RefreshPrefixDefenceSkills(); // ÃÖÁ¾ ¸®½ºÆ®¿¡ ´ã±ä ½ºÅ³Áß¿¡¼­ ¿ì¼±¼øÀ§°¡ °¡Àå ³ôÀº ¸®½ºÆ®¿¡ ÀúÀåµÈ ½ºÅ³¸¸ »ç¿ëÇÑ´Ù. if (m_PrefixSystemCandiateDefenceSkills.empty()) { OutputDebug("Á¢µÎ¾î ¹æ¾î¿ë ½ºÅ³ ¼±ÅõȰоøÀ½.-----------------------------!!\n"); return; } PREFIX_SYSTEM_SKILL_COLLECTION::iterator selectIter = m_PrefixSystemCandiateDefenceSkills.begin(); PRESIX_SYSTEM_SKILLS &skills = selectIter->second; PRESIX_SYSTEM_SKILLS::iterator iter = skills.begin(); PRESIX_SYSTEM_SKILLS::iterator endIter = skills.end(); for (; iter != endIter; ++iter) { DnSkillHandle hSkill = (*iter).hSkill; if (!hSkill /*|| CDnSkill::UsingResult::Success != hSkill->CanExecute()*/) continue; /* //ÄðŸÀÓ ³²¾Æ ÀÖÀ¸¸é °Ç³Ê¶Ü. if (hSkill->GetCoolTime() != 0.0f && hSkill->GetElapsedDelayTime() > 0.0f) continue; */ OutputDebug("Á¢µÎ¾î ¹æ¾î¿ë ½ºÅ³(%d) ½ÃÀÛ....\n", hSkill->GetClassID()); //Skill ÄðŸÀÓ ½ÃÀÛ? hSkill->OnBeginCoolTime(); m_PrefixSkillCoolTimeManager.AddCoolTime(hSkill); int nStateEffectCount = hSkill->GetStateEffectCount(); // ÇØ´ç ½ºÅ³ÀÇ »óÅ ȿ°úº° Àû¿ë ¾×Å͸¦ °áÁ¤Çؼ­ Áߺ¹ ó¸® È®ÀÎÇϰí, // ¾×Åͺ°·Î »óÅ ȿ°ú Àû¿ëÀ» ÇØ¾ß ÇÒµí Çѵ¥... for( DWORD k = 0; k < hSkill->GetStateEffectCount(); k++ ) { CDnSkill::StateEffectStruct *pLocalStruct = hSkill->GetStateEffectFromIndex(k); DnActorHandle hApplyActor; // »óÅ ȿ°ú Àû¿ë Ÿ°Ù ŸÀÔ¿¡ µû¶ó Àû¿ëµÉ ¾×Å͸¦ °áÁ¤ÇÑ´Ù. switch( pLocalStruct->ApplyType ) { case CDnSkill::ApplySelf: // ÀÚ½ÅÇÑÅ× hApplyActor = m_pActor->GetActorHandle(); break; case CDnSkill::ApplyTarget: // Ÿ°ÙÇÑÅ× hApplyActor = hHitter; break; case CDnSkill::ApplyEnemy: // ÀûÇÑÅ×.. (°°Àº ÆíÀÌ ¾Æ´Ï¸é ³ª¸¦ ¶§¸° ³ðÀÌ ÀûÀÌ´Ù..) if( m_pActor->GetTeam() == hHitter->GetTeam() ) continue; else hApplyActor = hHitter; break; case CDnSkill::ApplyFriend: // °°Àº Æí.. (°°Àº ÆíÀÌ¸é ³ª¸¦ ¶§¸° ³ðÀÌ °°Àº Æí..?) if( m_pActor->GetTeam() != hHitter->GetTeam() ) continue; else hApplyActor = hHitter; break; } // »óÅÂÈ¿°úÁß Áö¼Ó ½Ã°£ÀÌ 0À̰í Àڽſ¡°Ô °Å´Â »óÅ ȿ°ú´Â // ½ºÅ³ÀÇ m_vlApplyNoPacketStateEffectList¿¡ ´ã¾Æ ³õ°í ½ºÅ³ ³¡³¯¶§ // Áö¿ö Áöµµ·Ï ÇÑ´Ù...[2011/01/13 semozz] bool isSelfPermentStateEffect = false; if (CDnSkill::ApplySelf == pLocalStruct->ApplyType && (0 == pLocalStruct->nDurationTime || -1 == pLocalStruct->nDurationTime)) { pLocalStruct->nDurationTime = -1; isSelfPermentStateEffect = true; } CDnStateBlow *pStateBlow = hApplyActor->GetStateBlow(); CDnSkill::CanApply eResult = CDnSkill::CanApply::Apply; if (pStateBlow) eResult = pStateBlow->CanApplySkillStateEffect(hSkill->GetInfo(), *pLocalStruct); if (CDnSkill::CanApply::Fail != eResult) { hApplyActor->RemoveResetStateBlow(); int nBlowID = hApplyActor->CmdAddStateEffect( hSkill->GetInfo(), (STATE_BLOW::emBLOW_INDEX)pLocalStruct->nID, pLocalStruct->nDurationTime, pLocalStruct->szValue.c_str(), false, false ); if (isSelfPermentStateEffect) hSkill->AddPrefixBlow(hApplyActor, nBlowID); } hApplyActor->InitStateBlowIDToRemove(); } //»ç¿ëµÈ ¹æ¾î ½ºÅ³Àº ¸®½ºÆ®¿¡ ´ã¾Æ ³õ´Â´Ù.. m_listProcessPreFixDefenceSkills.push_back(hSkill); } OutputDebug("Á¢µÎ¾î ¹æ¾î¿ë ½ºÅ³ ³¡ -----------------------------!!\n"); } void MASkillUser::ProcessPrefixOffenceSkill(float fHitDamageProb) { //Á¢µÎ¾î ½Ã½ºÅÛ ¹æ¾î¿ë ½ºÅ³ µî·ÏµÇ µÇ¾î ÀÖÁö ¾Ê´Ù¸é if (m_prefixSystemOffenceSkills.empty()) return; //Á¢µÎ¾î ½Ã½ºÅÛ °ø°Ý¿ë ½ºÅ³Áß ¼±ÅÃ.. RefreshPrefixOffenceSkills(fHitDamageProb); // ÃÖÁ¾ ¸®½ºÆ®¿¡ ´ã±ä ½ºÅ³Áß¿¡¼­ ¿ì¼±¼øÀ§°¡ °¡Àå ³ôÀº ¸®½ºÆ®¿¡ ÀúÀåµÈ ½ºÅ³¸¸ »ç¿ëÇÑ´Ù. if (m_PrefixSystemCandiateOffenceSkills.empty()) return; PREFIX_SYSTEM_SKILL_COLLECTION::iterator selectIter = m_PrefixSystemCandiateOffenceSkills.begin(); PRESIX_SYSTEM_SKILLS &skills = selectIter->second; PRESIX_SYSTEM_SKILLS::iterator iter = skills.begin(); PRESIX_SYSTEM_SKILLS::iterator endIter = skills.end(); for (; iter != endIter; ++iter) { DnSkillHandle hSkill = (*iter).hSkill; if (!hSkill/* || CDnSkill::UsingResult::Success != hSkill->CanExecute()*/) continue; //Skill ÄðŸÀÓ ½ÃÀÛ? hSkill->OnBeginCoolTime(); m_PrefixSkillCoolTimeManager.AddCoolTime(hSkill); int nStateEffectCount = hSkill->GetStateEffectCount(); // ÇØ´ç ½ºÅ³ÀÇ »óÅ ȿ°úº° Àû¿ë ¾×Å͸¦ °áÁ¤Çؼ­ Áߺ¹ ó¸® È®ÀÎÇϰí, // ¾×Åͺ°·Î »óÅ ȿ°ú Àû¿ëÀ» ÇØ¾ß ÇÒµí Çѵ¥... for( DWORD k = 0; k < hSkill->GetStateEffectCount(); k++ ) { CDnSkill::StateEffectStruct *pLocalStruct = hSkill->GetStateEffectFromIndex(k); DnActorHandle hApplyActor; // »óÅ ȿ°ú Àû¿ë Ÿ°Ù ŸÀÔ¿¡ µû¶ó Àû¿ëµÉ ¾×Å͸¦ °áÁ¤ÇÑ´Ù. switch( pLocalStruct->ApplyType ) { case CDnSkill::ApplySelf: // ÀÚ½ÅÇÑÅ× hApplyActor = m_pActor->GetActorHandle(); break; case CDnSkill::ApplyTarget: // Ÿ°ÙÇÑÅ× continue; case CDnSkill::ApplyEnemy: // ÀûÇÑÅ×.. (°°Àº ÆíÀÌ ¾Æ´Ï¸é ³ª¸¦ ¶§¸° ³ðÀÌ ÀûÀÌ´Ù..) continue; break; case CDnSkill::ApplyFriend: // °°Àº Æí.. (°°Àº ÆíÀÌ¸é ³ª¸¦ ¶§¸° ³ðÀÌ °°Àº Æí..?) continue; break; } // »óÅÂÈ¿°úÁß Áö¼Ó ½Ã°£ÀÌ 0À̰í Àڽſ¡°Ô °Å´Â »óÅ ȿ°ú´Â // ½ºÅ³ÀÇ m_vlApplyNoPacketStateEffectList¿¡ ´ã¾Æ ³õ°í ½ºÅ³ ³¡³¯¶§ // Áö¿ö Áöµµ·Ï ÇÑ´Ù...[2011/01/13 semozz] bool isSelfPermentStateEffect = false; if (CDnSkill::ApplySelf == pLocalStruct->ApplyType && (0 == pLocalStruct->nDurationTime || -1 == pLocalStruct->nDurationTime)) { pLocalStruct->nDurationTime = -1; isSelfPermentStateEffect = true; } CDnStateBlow *pStateBlow = hApplyActor->GetStateBlow(); CDnSkill::CanApply eResult = CDnSkill::CanApply::Apply; if (pStateBlow) eResult = pStateBlow->CanApplySkillStateEffect(hSkill->GetInfo(), *pLocalStruct); if (CDnSkill::CanApply::Fail != eResult) { hApplyActor->RemoveResetStateBlow(); int nBlowID = hApplyActor->CmdAddStateEffect( hSkill->GetInfo(), (STATE_BLOW::emBLOW_INDEX)pLocalStruct->nID, pLocalStruct->nDurationTime, pLocalStruct->szValue.c_str(), false, false ); if (isSelfPermentStateEffect) hSkill->AddPrefixBlow(hApplyActor, nBlowID); } hApplyActor->InitStateBlowIDToRemove(); } //»ç¿ëµÈ ¹æ¾î ½ºÅ³Àº ¸®½ºÆ®¿¡ ´ã¾Æ ³õ´Â´Ù.. m_listProcessPreFixOffenceSkills.push_back(hSkill); } } void MASkillUser::ApplyPrefixOffenceSkillToTarget(DnActorHandle hTarget) { // ÃÖÁ¾ ¸®½ºÆ®¿¡ ´ã±ä ½ºÅ³Áß¿¡¼­ ¿ì¼±¼øÀ§°¡ °¡Àå ³ôÀº ¸®½ºÆ®¿¡ ÀúÀåµÈ ½ºÅ³¸¸ »ç¿ëÇÑ´Ù. if (m_listProcessPreFixOffenceSkills.empty()) return; list::iterator iter = m_listProcessPreFixOffenceSkills.begin(); list::iterator endIter = m_listProcessPreFixOffenceSkills.end(); for (; iter != endIter; ++iter) { DnSkillHandle hSkill = (*iter); if (!hSkill) continue; int nStateEffectCount = hSkill->GetStateEffectCount(); // ÇØ´ç ½ºÅ³ÀÇ »óÅ ȿ°úº° Àû¿ë ¾×Å͸¦ °áÁ¤Çؼ­ Áߺ¹ ó¸® È®ÀÎÇϰí, // ¾×Åͺ°·Î »óÅ ȿ°ú Àû¿ëÀ» ÇØ¾ß ÇÒµí Çѵ¥... for( DWORD k = 0; k < hSkill->GetStateEffectCount(); k++ ) { CDnSkill::StateEffectStruct *pLocalStruct = hSkill->GetStateEffectFromIndex(k); DnActorHandle hApplyActor; // »óÅ ȿ°ú Àû¿ë Ÿ°Ù ŸÀÔ¿¡ µû¶ó Àû¿ëµÉ ¾×Å͸¦ °áÁ¤ÇÑ´Ù. switch( pLocalStruct->ApplyType ) { case CDnSkill::ApplySelf: // ÀÚ½ÅÇÑÅ× continue; case CDnSkill::ApplyTarget: // Ÿ°ÙÇÑÅ× hApplyActor = hTarget; break; case CDnSkill::ApplyEnemy: // ÀûÇÑÅ×.. (°°Àº ÆíÀÌ ¾Æ´Ï¸é ³ª¸¦ ¶§¸° ³ðÀÌ ÀûÀÌ´Ù..) if( m_pActor->GetTeam() == hTarget->GetTeam() ) continue; else hApplyActor = hTarget; break; case CDnSkill::ApplyFriend: // °°Àº Æí.. (°°Àº ÆíÀÌ¸é ³ª¸¦ ¶§¸° ³ðÀÌ °°Àº Æí..?) if( m_pActor->GetTeam() != hTarget->GetTeam() ) continue; else hApplyActor = hTarget; break; } // »óÅÂÈ¿°úÁß Áö¼Ó ½Ã°£ÀÌ 0À̰í Àڽſ¡°Ô °Å´Â »óÅ ȿ°ú´Â // ½ºÅ³ÀÇ m_vlApplyNoPacketStateEffectList¿¡ ´ã¾Æ ³õ°í ½ºÅ³ ³¡³¯¶§ // Áö¿ö Áöµµ·Ï ÇÑ´Ù...[2011/01/13 semozz] bool isSelfPermentStateEffect = false; if (CDnSkill::ApplySelf == pLocalStruct->ApplyType && (0 == pLocalStruct->nDurationTime || -1 == pLocalStruct->nDurationTime)) { pLocalStruct->nDurationTime = -1; isSelfPermentStateEffect = true; } CDnStateBlow *pStateBlow = hApplyActor->GetStateBlow(); CDnSkill::CanApply eResult = CDnSkill::CanApply::Apply; if (pStateBlow) eResult = pStateBlow->CanApplySkillStateEffect(hSkill->GetInfo(), *pLocalStruct); if (CDnSkill::CanApply::Fail != eResult) { hApplyActor->RemoveResetStateBlow(); int nBlowID = hApplyActor->CmdAddStateEffect( hSkill->GetInfo(), (STATE_BLOW::emBLOW_INDEX)pLocalStruct->nID, pLocalStruct->nDurationTime, pLocalStruct->szValue.c_str(), false, false ); if (isSelfPermentStateEffect) hSkill->AddPrefixBlow(hApplyActor, nBlowID); } hApplyActor->InitStateBlowIDToRemove(); } } } void MASkillUser::CalculateProbabilitySkill(PREFIX_SYSTEM_SKILL_LIST &candidateSkills, PREFIX_SYSTEM_SKILL_COLLECTION &sameSkillList) { //Èĺ¸ ½ºÅ³ ¸®½ºÆ® ÃʱâÈ­ candidateSkills.clear(); PREFIX_SYSTEM_SKILL_COLLECTION::iterator iter = sameSkillList.begin(); PREFIX_SYSTEM_SKILL_COLLECTION::iterator endIter = sameSkillList.end(); for (; iter != endIter; ++iter) { //°°Àº ½ºÅ³ID¸¦ °¡Áø ½ºÅ³µé È®·üÀ» ÇÕ»êÇÑ´Ù. PRESIX_SYSTEM_SKILLS::iterator skillIter = iter->second.begin(); PRESIX_SYSTEM_SKILLS::iterator skillEndIter = iter->second.end(); float fProbability = 0.0f; DnSkillHandle hSelectedSkill; int nSlotIndex = -1; for (; skillIter != skillEndIter; ++skillIter) { if (skillIter->hSkill) { fProbability += skillIter->fRatio; // ÇØ´ç ½ºÅ³ if (!hSelectedSkill) { hSelectedSkill = skillIter->hSkill; nSlotIndex = skillIter->slotIndex; } else { if (hSelectedSkill->GetLevel() < skillIter->hSkill->GetLevel()) { hSelectedSkill = skillIter->hSkill; nSlotIndex = skillIter->slotIndex; } } } } // ¼±ÅÃµÈ ½ºÅ³ÀÌ ÀÖÀ¸¸é ÃÖÁ¾ ½ºÅ³ Èĺ¸ ¸®½ºÆ®¿¡ Ãß°¡ÇÑ´Ù. if (hSelectedSkill && -1 != nSlotIndex && 0.0f != fProbability) { int nSkillID = hSelectedSkill->GetClassID(); PREFIX_SYSTEM_SKILLINFO skillInfo; skillInfo.fRatio = fProbability; skillInfo.hSkill = hSelectedSkill; skillInfo.slotIndex = nSlotIndex; OutputDebug("°°Àº ½ºÅ³(%d) ÇÕ»ê ÃÖÁ¾ È®·ü (%f) ½½·Ô Index(%d)·Î °áÁ¤µÊ!!!!!\n", skillInfo.hSkill->GetClassID(), skillInfo.fRatio, skillInfo.slotIndex); candidateSkills.insert(PREFIX_SYSTEM_SKILL_LIST::value_type(nSkillID, skillInfo)); } } } void MASkillUser::GroupingPrefixDefenceSkillsBySameSkillID(PREFIX_SYSTEM_SKILL_LIST &skillList, PREFIX_SYSTEM_SKILL_COLLECTION &sameSkillList) { PREFIX_SYSTEM_SKILL_LIST::iterator iter = skillList.begin(); PREFIX_SYSTEM_SKILL_LIST::iterator endIter = skillList.end(); for (; iter != endIter; ++iter) { int nSkillID = -1; int nSlotIndex = iter->first; //½½·Ô À妽º PREFIX_SYSTEM_SKILLINFO skillInfo = iter->second; if (!skillInfo.hSkill) continue; nSkillID = skillInfo.hSkill->GetClassID(); PREFIX_SYSTEM_SKILL_COLLECTION::iterator findIter = sameSkillList.find(nSkillID); if (findIter != sameSkillList.end()) { //ÀÌ¹Ì °°Àº ½ºÅ³ID¸¦ °¡Áø ½ºÅ³ÀÌ ¸®½ºÆ®¿¡ ÀÖ´Ù¸é skillInfo.slotIndex = nSlotIndex; findIter->second.push_back(skillInfo); } else { //¾ÆÁ÷ ½ºÅ³ µî·ÏÀÌ µÇ¾î ÀÖÁö ¾Ê´Ù¸é ¸®½ºÆ®¸¦ ¸¸µé¾î µî·Ï.. PRESIX_SYSTEM_SKILLS skillList; skillInfo.slotIndex = nSlotIndex; skillList.push_back(skillInfo); sameSkillList.insert(PREFIX_SYSTEM_SKILL_COLLECTION::value_type(nSkillID, skillList)); } } } void MASkillUser::GroupingSkillByPriority(PREFIX_SYSTEM_SKILL_COLLECTION& prefixSystemSkills, PREFIX_SYSTEM_SKILL_LIST& tempCandiateSkills, float fHitDamageProb/* = 1.0f*/) { prefixSystemSkills.clear(); PREFIX_SYSTEM_SKILL_LIST::iterator iter = tempCandiateSkills.begin(); PREFIX_SYSTEM_SKILL_LIST::iterator endIter = tempCandiateSkills.end(); //´ëÇ¥ ½ºÅ³ ¸®½ºÆ®¸¦ ¼øÈ¸ Çϸ鼭 ¿ì¼± ¼øÀ§º°·Î ±×·ìÇÎÀ» ÇÑ´Ù. for (; iter != endIter; ++iter) { int nPriority = 0; PREFIX_SYSTEM_SKILLINFO skillInfo = iter->second; if (!skillInfo.hSkill) continue; nPriority = skillInfo.hSkill->GetPrefixSystemPriority(); //½ºÅ³ ÄðŸÀÓ È®ÀÎ... //if (skillInfo.hSkill->GetCoolTime() > 0.0f && skillInfo.hSkill->GetElapsedDelayTime() > 0.0f) if (m_PrefixSkillCoolTimeManager.IsCoolTime(skillInfo.hSkill->GetClassID())) { OutputDebug("½ºÅ³(%d) ÄðŸÀÓ Áß.........!!!!\n", skillInfo.hSkill->GetClassID()); continue; } //È®·ü°è»ê ÇØ¼­ Åë°úµÈ ½ºÅ³¸¸ ¸®½ºÆ®¿¡ Ãß°¡ÇÑ´Ù... bool bExecuteable = rand() % 10000 <= (iter->second.fRatio * fHitDamageProb); if (!bExecuteable) { OutputDebug("½ºÅ³(%d) È®·ü¿¡¼­ °É·¯Áü...!!!!\n", skillInfo.hSkill->GetClassID()); continue; } OutputDebug("¿ì¼±¼øÀ§ (%d)¿¡ ½ºÅ³(%d) µî·ÏµÊ!!!!\n", nPriority, skillInfo.hSkill->GetClassID()); PREFIX_SYSTEM_SKILL_COLLECTION::iterator findIter = prefixSystemSkills.find(nPriority); if (findIter != prefixSystemSkills.end()) { //ÀÌ¹Ì ¿ì¼±¼øÀ§ Á¤º¸°¡ µî·Ï µÇ¾î ÀÖ´Ù¸é //¿ì¼±¼øÀ§ ¸®½ºÆ®¿¡ ½ºÅ³ Á¤º¸¸¦ Ãß°¡ÇÑ´Ù. findIter->second.push_back(skillInfo); } else { //¾ÆÁ÷ ¿ì¼±¼øÀ§°¡ µî·ÏÀÌ µÇ¾î ÀÖÁö ¾Ê´Ù¸é.. //½ºÅ³ ÀúÀåÇÒ ¸®½ºÆ® ¸¸µé°í //½ºÅ³ Á¤º¸ ¼³Á¤ ÇØ¼­ ¸®½ºÆ®¿¡ Ãß°¡ÇÑ´Ù. PRESIX_SYSTEM_SKILLS skillList; skillList.push_back(skillInfo); prefixSystemSkills.insert(PREFIX_SYSTEM_SKILL_COLLECTION::value_type(nPriority, skillList)); } } } void MASkillUser::EndPrefixSystemSkill( LOCAL_TIME LocalTime, float fDelta ) { list::iterator iter = m_listProcessPreFixDefenceSkills.begin(); for( iter; iter != m_listProcessPreFixDefenceSkills.end(); ++iter ) { DnSkillHandle hAutoPassive = *iter; hAutoPassive->OnEnd( LocalTime, fDelta ); } iter = m_listProcessPreFixOffenceSkills.begin(); for( iter; iter != m_listProcessPreFixOffenceSkills.end(); ++iter ) { DnSkillHandle hAutoPassive = *iter; hAutoPassive->OnEnd( LocalTime, fDelta ); } } void MASkillUser::InitPrefixOffenceSkills() { m_PrefixSystemCandiateOffenceSkills.clear(); } bool MASkillUser::IsPrefixTriggerSkill() { if (!m_hProcessSkill) return false; return m_hProcessSkill->IsPrefixTriggerSkill(); } #endif // _GAMESERVER void MASkillUser::UpdateSkillLevelUpInfo() { std::map::iterator iter = m_SkillLevelUpInfoList.begin(); std::map::iterator endIter = m_SkillLevelUpInfoList.end(); m_SkillLevelUpInfo.clear(); for (; iter != endIter; ++iter) { SkillLevelUpInfo& skillLevelUpInfo = iter->second; //½ºÅ³ ID / ·¹º§¾÷ °ªÀÌ Á¤»óÀ̶ó¸é if (skillLevelUpInfo.nSkillID != 0 && skillLevelUpInfo.nLevelUp != 0) { //½ºÅ³ ·¹º§¾÷ Á¤º¸ ¸®½ºÆ®¿¡¼­ °°Àº ½ºÅ³ ¾ÆÀ̵𸦠ã´Â´Ù. std::map::iterator findIter = m_SkillLevelUpInfo.find(skillLevelUpInfo.nSkillID); if (findIter != m_SkillLevelUpInfo.end()) { // ±âÁ¸ ·¹º§¾÷ °ªÀÌ ´õ Å©´Ù¸é °Ç³Ê¶Ü. if (findIter->second > skillLevelUpInfo.nLevelUp) continue; // ±âÁ¸ ·¹º§¾÷ °ªÀÌ Å©Áö ¾ÊÀ¸¸é ¸®½ºÆ®¿¡¼­ Á¦°Å ÇÑ´Ù.. m_SkillLevelUpInfo.erase(findIter); } // »õ·Î¿î ½ºÅ³ ·¹º§¾÷ Á¤º¸¸¦ ÀúÀåÇÑ´Ù. m_SkillLevelUpInfo.insert(std::make_pair(skillLevelUpInfo.nSkillID, skillLevelUpInfo.nLevelUp)); } } } void MASkillUser::AddSkillLevelUpInfo(int nSlotIndex, int nSkillID, int nLevelUp) { DnSkillHandle hSkill = FindSkill(nSkillID); if( hSkill ) { if (hSkill->GetElapsedDelayTime() > 0.0f || hSkill->IsToggleOn()) return; } SkillLevelUpInfo skillLevelUpInfo; skillLevelUpInfo.nSkillID = nSkillID; skillLevelUpInfo.nLevelUp = nLevelUp; m_SkillLevelUpInfoList.insert(std::make_pair(nSlotIndex, skillLevelUpInfo)); //½ºÅ³ ·¹º§¾÷ Á¤º¸ °»½Å.. UpdateSkillLevelUpInfo(); int nSkillLevelUp = GetSkillLevelUpValue(nSkillID); SkillLevelUp(nSkillID, nSkillLevelUp); } void MASkillUser::RemoveSkillLevelUpInfo(int nSlotIndex) { std::map::iterator findIter = m_SkillLevelUpInfoList.find(nSlotIndex); if (findIter != m_SkillLevelUpInfoList.end()) { //Áö¿öÁú ·¹º§¾÷ ¾ÆÀÌÅÛ¿¡ Àû¿ëµÈ ½ºÅ³ ID¸¦ ¹Þ¾Æ ³õ´Â´Ù. int nSkillID = findIter->second.nSkillID; DnSkillHandle hSkill = FindSkill(nSkillID); if( hSkill ) { if (hSkill->GetElapsedDelayTime() > 0.0f || hSkill->IsToggleOn()) return; } //·¹º§¾÷ Á¤º¸¸¦ ¸®½ºÆ®¿¡¼­ Áö¿ì°í m_SkillLevelUpInfoList.erase(findIter); //·¹º§¾÷ Á¤º¸ °»½Å UpdateSkillLevelUpInfo(); //·¹º§¾÷ Á¤º¸°¡ ¾ø¾îÁö¹Ç·Î int nLevelUp = GetSkillLevelUpValue(nSkillID); SkillLevelUp(nSkillID, nLevelUp); } } int MASkillUser::GetSkillLevelUpValue(int nSkillID) { int nLevelUpValue = 0; int nLevelUpValueByNormalItem = 0; std::map::iterator findNormalIter = m_SkillLevelUpInfo.find(nSkillID); if (findNormalIter != m_SkillLevelUpInfo.end()) nLevelUpValueByNormalItem = findNormalIter->second; int nLevelUpValueByCashItem = 0; std::map::iterator findCashIter = m_CashSkillLevelUpInfo.find(nSkillID); if (findCashIter != m_CashSkillLevelUpInfo.end()) nLevelUpValueByCashItem = findCashIter->second; //ij½Ã¾ÆÀÌÅÛÀÇ ·¹º§¾÷ Á¦ÇÑ °ªÀº 1 if (nLevelUpValueByCashItem > 1) nLevelUpValueByCashItem = 1; //·¹º§¾÷ ¾ÆÀÌÅÛÀº Áߺ¹ µÇÁö ¾Ê°í, ¼öÂ÷°¡ ³ôÀº °ªÀ» Àû¿ë Çϵµ·Ï ÇÑ´Ù. nLevelUpValue = max(nLevelUpValueByNormalItem, nLevelUpValueByCashItem); return nLevelUpValue; } bool MASkillUser::ExistSkillLevelUpValue() { if( m_SkillLevelUpInfo.empty() && m_CashSkillLevelUpInfo.empty() ) return false; return true; } void MASkillUser::SkillLevelUp(int nSkillID, int nLevelUp) { //±âÁ¸ ½ºÅ³À» ã¾Æ¼­ ½ºÅ³ÀÌ ÀÖ°í, ÃʱâÈ­ µÈ ½ºÅ³ÀÌ ¾Æ´Ï¸é ·¹º§¾÷ ½ÃŲ´Ù. DnSkillHandle hSkill = FindSkill(nSkillID); if (!hSkill) return; int nCurentSkillLevel = hSkill->GetLevel(); int nCurLevlUpValue = hSkill->GetLevelUpValue(); bool bChangeLevel = true; if (nCurentSkillLevel == 0) bChangeLevel = false; //»õ·Î ·¹º§¾÷ ÇÒ ¼öÄ¡¿Í ÇöÀç ·¹º§¾÷ÀÌ Àû¿ëµÈ ¼öÄ¡°¡ °°À¸¸é ½ºÅ³À» º¯°æÇÒ Çʿ䰡 ¾øÀ½. if (nCurLevlUpValue == nLevelUp) bChangeLevel = false; if (bChangeLevel) { //SetSkillLevel³»ºÎ AddSkill¿¡¼­ ¿ø·¡ ·¹º§¿¡ Áö±ÝÀÇ Áõ°¡Ä¡°¡ °è»êµÇ¾î ½ºÅ³ÀÌ »ý¼ºµÊ.. int nOrigLevel = nCurentSkillLevel - nCurLevlUpValue; ChangeSkillLevelUp(nSkillID, nOrigLevel); } #if defined(_GAMESERVER) #else else hSkill->DisableSkillByItemMove(false); #endif // _GAMESERVER } void MASkillUser::ChangeSkillLevelUp(int nSkillID, int nOrigLevel) { RemoveSkill(nSkillID); AddSkill(nSkillID, nOrigLevel); } // std::map m_CashSkillLevelUpInfoList; void MASkillUser::AddSkillLevelUpInfoByCashItem(int nSlotIndex, int nSkillID, int nLevelUp) { SkillLevelUpInfo skillLevelUpInfo; skillLevelUpInfo.nSkillID = nSkillID; skillLevelUpInfo.nLevelUp = nLevelUp; m_CashSkillLevelUpInfoList.insert(std::make_pair(nSlotIndex, skillLevelUpInfo)); //½ºÅ³ ·¹º§¾÷ Á¤º¸ °»½Å.. UpdateSkillLevelUpInfoByCashItem(); int nSkillLevelUp = GetSkillLevelUpValue(nSkillID); SkillLevelUp(nSkillID, nSkillLevelUp); } void MASkillUser::UpdateSkillLevelUpInfoByCashItem() { std::map::iterator iter = m_CashSkillLevelUpInfoList.begin(); std::map::iterator endIter = m_CashSkillLevelUpInfoList.end(); m_CashSkillLevelUpInfo.clear(); for (; iter != endIter; ++iter) { SkillLevelUpInfo& skillLevelUpInfo = iter->second; //½ºÅ³ ID / ·¹º§¾÷ °ªÀÌ Á¤»óÀ̶ó¸é if (skillLevelUpInfo.nSkillID != 0 && skillLevelUpInfo.nLevelUp != 0) { //½ºÅ³ ·¹º§¾÷ Á¤º¸ ¸®½ºÆ®¿¡¼­ °°Àº ½ºÅ³ ¾ÆÀ̵𸦠ã´Â´Ù. std::map::iterator findIter = m_CashSkillLevelUpInfo.find(skillLevelUpInfo.nSkillID); if (findIter != m_CashSkillLevelUpInfo.end()) { // ±âÁ¸ ·¹º§¾÷ °ªÀÌ ´õ Å©´Ù¸é °Ç³Ê¶Ü. if (findIter->second > skillLevelUpInfo.nLevelUp) continue; // ±âÁ¸ ·¹º§¾÷ °ªÀÌ Å©Áö ¾ÊÀ¸¸é ¸®½ºÆ®¿¡¼­ Á¦°Å ÇÑ´Ù.. m_CashSkillLevelUpInfo.erase(findIter); } // »õ·Î¿î ½ºÅ³ ·¹º§¾÷ Á¤º¸¸¦ ÀúÀåÇÑ´Ù. m_CashSkillLevelUpInfo.insert(std::make_pair(skillLevelUpInfo.nSkillID, skillLevelUpInfo.nLevelUp)); } } } void MASkillUser::RemoveSkillLevelUpInfoByCashItem(int nSlotIndex) { std::map::iterator findIter = m_CashSkillLevelUpInfoList.find(nSlotIndex); if (findIter != m_CashSkillLevelUpInfoList.end()) { //Áö¿öÁú ·¹º§¾÷ ¾ÆÀÌÅÛ¿¡ Àû¿ëµÈ ½ºÅ³ ID¸¦ ¹Þ¾Æ ³õ´Â´Ù. int nSkillID = findIter->second.nSkillID; //·¹º§¾÷ Á¤º¸¸¦ ¸®½ºÆ®¿¡¼­ Áö¿ì°í m_CashSkillLevelUpInfoList.erase(findIter); //·¹º§¾÷ Á¤º¸ °»½Å UpdateSkillLevelUpInfoByCashItem(); //·¹º§¾÷ Á¤º¸°¡ ¾ø¾îÁö¹Ç·Î int nLevelUp = GetSkillLevelUpValue(nSkillID); SkillLevelUp(nSkillID, nLevelUp); } } #if defined(PRE_ADD_PREFIX_SYSTE_RENEW) #if defined(_GAMESERVER) void MASkillUser::AddPrefixDefenceSkill(DnSkillHandle hSkill) { if (!hSkill) return; //ÀÌ ½ºÅ³ÀÇ Á¢µÎ»ç ½ºÅ³ ŸÀÔ(Çà¿î/ÆÄ±«....) int nPrefixSkillType = hSkill->GetPrefixSkillType(); PREFIX_SKILL_INFO::iterator findIter = m_PrefixDefenceSkills.find(nPrefixSkillType); //±âÁ¸ Ä«Å×°í¸®°¡ ÀÖ´Ù¸é if (findIter != m_PrefixDefenceSkills.end()) { //±âÁ¸ Á¢µÎ»ç ½ºÅ³ °ü¸® °´Ã¼¿¡ ½ºÅ³À» Ãß°¡ Çϰí, Á¤º¸¸¦ °»½ÅÇÑ´Ù. findIter->second->AddSkill(hSkill); } else { //¾ÆÁ÷ µî·ÏµÈ Á¢µÎ»ç ½ºÅ³ÀÌ ¾ø´Ù¸é »õ·Î ¸¸µé¾î¼­ µî·Ï ÇÑ´Ù. CDnPrefixSkill* pPrefixSkill = new CDnPrefixSkill(nPrefixSkillType); pPrefixSkill->AddSkill(hSkill); m_PrefixDefenceSkills.insert(make_pair(nPrefixSkillType, pPrefixSkill)); } } void MASkillUser::RemovePrefixDefenceSkill(DnSkillHandle hSkill) { //ÀÌ ½ºÅ³ÀÇ Á¢µÎ»ç ½ºÅ³ ŸÀÔ(Çà¿î/ÆÄ±«....) int nPrefixSkillType = hSkill->GetPrefixSkillType(); PREFIX_SKILL_INFO::iterator findIter = m_PrefixDefenceSkills.find(nPrefixSkillType); //±âÁ¸ Ä«Å×°í¸®°¡ ÀÖ´Ù¸é if (findIter != m_PrefixDefenceSkills.end()) { //±âÁ¸ Á¢µÎ»ç ½ºÅ³ °ü¸® °´Ã¼¿¡¼­ ½ºÅ³À» Á¦°Å ÇÑ´Ù. findIter->second->RemoveSkill(hSkill); //µî·ÏµÈ ½ºÅ³ÀÌ ¾øÀ¸¸é ¸®½ºÆ®¿¡¼­ Á¦°Å ÇÑ´Ù. if (findIter->second->GetSkillCount() == 0) { SAFE_DELETE(findIter->second); m_PrefixDefenceSkills.erase(findIter); } } } void MASkillUser::ProcessPrefixDefenceSkill_New(DnActorHandle hHitter) { //Á¢µÎ¾î ½Ã½ºÅÛ ¹æ¾î¿ë ½ºÅ³ µî·ÏµÇ µÇ¾î ÀÖÁö ¾Ê´Ù¸é if (m_PrefixDefenceSkills.empty()) return; OutputDebug("Á¢µÎ¾î ¹æ¾î¿ë ½ºÅ³ ½ÃÀÛ-----------------------------!!\n"); //Á¢µÎ»ç ½ºÅ³ ¹ßµ¿ È®·ü °è»ê.. PREFIX_SKILL_INFO::iterator iter = m_PrefixDefenceSkills.begin(); PREFIX_SKILL_INFO::iterator endIter = m_PrefixDefenceSkills.end(); for (; iter != endIter; ++iter) { CDnPrefixSkill* pPrefixSkill = iter->second; if (!pPrefixSkill) continue; //Á¢µÎ»ç ½ºÅ³ÀÌ ÄðŸÀÓ ÁßÀÎÁö È®ÀÎÇÑ´Ù.. if (m_PrefixSkillCoolTimeManager.IsCoolTime(pPrefixSkill->GetSkillType())) { OutputDebug("Á¢µÎ»ç ¹æ¾î ½ºÅ³(%d) ÄðŸÀÓ Áß!!!!!!!!!!\n", pPrefixSkill->GetSkillType()); continue; } //Á¢µÎ»ç ½ºÅ³ ¹ßµ¿ È®·ü È®ÀÎ. bool bExecuteable = rand() % 10000 <= pPrefixSkill->GetProbability(); if (!bExecuteable) { OutputDebug("Á¢µÎ»ç ¹æ¾î ½ºÅ³(%d) È®·ü¿¡¼­ °É·¯Áü...!!!!\n", pPrefixSkill->GetSkillType()); continue; } //´ëÇ¥ ½ºÅ³ DnSkillHandle hSkill = pPrefixSkill->GetSkillHandle(); if (!hSkill) continue; hSkill->OnBeginCoolTime(); //Skill ÄðŸÀÓ ½ÃÀÛ? m_PrefixSkillCoolTimeManager.AddCoolTime(pPrefixSkill); int nStateEffectCount = pPrefixSkill->GetStateEffectCount(); // ÇØ´ç ½ºÅ³ÀÇ »óÅ ȿ°úº° Àû¿ë ¾×Å͸¦ °áÁ¤Çؼ­ Áߺ¹ ó¸® È®ÀÎÇϰí, // ¾×Åͺ°·Î »óÅ ȿ°ú Àû¿ëÀ» ÇØ¾ß ÇÒµí Çѵ¥... for( int k = 0; k < pPrefixSkill->GetStateEffectCount(); k++ ) { CDnSkill::StateEffectStruct *pLocalStruct = pPrefixSkill->GetStateEffectFromIndex(k); DnActorHandle hApplyActor; // »óÅ ȿ°ú Àû¿ë Ÿ°Ù ŸÀÔ¿¡ µû¶ó Àû¿ëµÉ ¾×Å͸¦ °áÁ¤ÇÑ´Ù. switch( pLocalStruct->ApplyType ) { case CDnSkill::ApplySelf: // ÀÚ½ÅÇÑÅ× hApplyActor = m_pActor->GetActorHandle(); break; case CDnSkill::ApplyTarget: // Ÿ°ÙÇÑÅ× hApplyActor = hHitter; break; case CDnSkill::ApplyEnemy: // ÀûÇÑÅ×.. (°°Àº ÆíÀÌ ¾Æ´Ï¸é ³ª¸¦ ¶§¸° ³ðÀÌ ÀûÀÌ´Ù..) if( m_pActor->GetTeam() == hHitter->GetTeam() ) continue; else hApplyActor = hHitter; break; case CDnSkill::ApplyFriend: // °°Àº Æí.. (°°Àº ÆíÀÌ¸é ³ª¸¦ ¶§¸° ³ðÀÌ °°Àº Æí..?) if( m_pActor->GetTeam() != hHitter->GetTeam() ) continue; else hApplyActor = hHitter; break; } // »óÅÂÈ¿°úÁß Áö¼Ó ½Ã°£ÀÌ 0À̰í Àڽſ¡°Ô °Å´Â »óÅ ȿ°ú´Â // ½ºÅ³ÀÇ m_vlApplyNoPacketStateEffectList¿¡ ´ã¾Æ ³õ°í ½ºÅ³ ³¡³¯¶§ // Áö¿ö Áöµµ·Ï ÇÑ´Ù...[2011/01/13 semozz] bool isSelfPermentStateEffect = false; if (CDnSkill::ApplySelf == pLocalStruct->ApplyType && (0 == pLocalStruct->nDurationTime || -1 == pLocalStruct->nDurationTime)) { pLocalStruct->nDurationTime = -1; isSelfPermentStateEffect = true; } CDnStateBlow *pStateBlow = hApplyActor->GetStateBlow(); CDnSkill::CanApply eResult = CDnSkill::CanApply::Apply; if (pStateBlow) eResult = pStateBlow->CanApplySkillStateEffect(hSkill->GetInfo(), *pLocalStruct); if (CDnSkill::CanApply::Fail != eResult) { hApplyActor->RemoveResetStateBlow(); int nBlowID = hApplyActor->CmdAddStateEffect( hSkill->GetInfo(), (STATE_BLOW::emBLOW_INDEX)pLocalStruct->nID, pLocalStruct->nDurationTime, pLocalStruct->szValue.c_str(), false, false ); OutputDebug("Á¢µÎ»ç ¹æ¾î ½ºÅ³(%d) »óÅÂÈ¿°ú (%d)-(%s)\n", pPrefixSkill->GetSkillType(), pLocalStruct->nID, pLocalStruct->szValue.c_str()); if (isSelfPermentStateEffect) hSkill->AddPrefixBlow(hApplyActor, nBlowID); } hApplyActor->InitStateBlowIDToRemove(); } //»ç¿ëµÈ ¹æ¾î ½ºÅ³Àº ¸®½ºÆ®¿¡ ´ã¾Æ ³õ´Â´Ù.. m_listProcessPreFixDefenceSkills.push_back(hSkill); } OutputDebug("Á¢µÎ¾î ¹æ¾î¿ë ½ºÅ³ ³¡ -----------------------------!!\n"); } void MASkillUser::AddPrefixOffenceSkill(DnSkillHandle hSkill) { if (!hSkill) return; //ÀÌ ½ºÅ³ÀÇ Á¢µÎ»ç ½ºÅ³ ŸÀÔ(Çà¿î/ÆÄ±«....) int nPrefixSkillType = hSkill->GetPrefixSkillType(); PREFIX_SKILL_INFO::iterator findIter = m_PrefixOffenceSkills.find(nPrefixSkillType); //±âÁ¸ Ä«Å×°í¸®°¡ ÀÖ´Ù¸é if (findIter != m_PrefixOffenceSkills.end()) { //±âÁ¸ Á¢µÎ»ç ½ºÅ³ °ü¸® °´Ã¼¿¡ ½ºÅ³À» Ãß°¡ Çϰí, Á¤º¸¸¦ °»½ÅÇÑ´Ù. findIter->second->AddSkill(hSkill); } else { //¾ÆÁ÷ µî·ÏµÈ Á¢µÎ»ç ½ºÅ³ÀÌ ¾ø´Ù¸é »õ·Î ¸¸µé¾î¼­ µî·Ï ÇÑ´Ù. CDnPrefixSkill* pPrefixSkill = new CDnPrefixSkill(nPrefixSkillType); pPrefixSkill->AddSkill(hSkill); m_PrefixOffenceSkills.insert(make_pair(nPrefixSkillType, pPrefixSkill)); } } void MASkillUser::RemovePrefixOffenceSkill(DnSkillHandle hSkill) { //ÀÌ ½ºÅ³ÀÇ Á¢µÎ»ç ½ºÅ³ ŸÀÔ(Çà¿î/ÆÄ±«....) int nPrefixSkillType = hSkill->GetPrefixSkillType(); PREFIX_SKILL_INFO::iterator findIter = m_PrefixOffenceSkills.find(nPrefixSkillType); //±âÁ¸ Ä«Å×°í¸®°¡ ÀÖ´Ù¸é if (findIter != m_PrefixOffenceSkills.end()) { //±âÁ¸ Á¢µÎ»ç ½ºÅ³ °ü¸® °´Ã¼¿¡¼­ ½ºÅ³À» Á¦°Å ÇÑ´Ù. findIter->second->RemoveSkill(hSkill); //µî·ÏµÈ ½ºÅ³ÀÌ ¾øÀ¸¸é ¸®½ºÆ®¿¡¼­ Á¦°Å ÇÑ´Ù. if (findIter->second->GetSkillCount() == 0) { RemoveProcessPrefixOffenceSkill(findIter->second); SAFE_DELETE(findIter->second); m_PrefixOffenceSkills.erase(findIter); } } } //´ýÇÁ °ü·ÃÇØ¼­(ÇÑ ÇÁ·¹ÀÓ¿¡¼­ µ¿ÀÛÇØ¼­ ÀÌ·²ÀÏÀº ¾øÀ»µí Çѵ¥..) °ø°Ý¿ë Á¢¹Ì»ç ½ºÅ³ÀÌ Á¦°Å µÉ¶§ //½ÇÇàµÇ°í ÀÖ´Â Á¢¹Ì»ç ½ºÅ³ ¸®½ºÆ®¿¡ °°Àº ½ºÅ³ÀÌ ÀÖÀ¸¸é Á¦°Å Çϵµ·ÏÇÑ´Ù. void MASkillUser::RemoveProcessPrefixOffenceSkill(CDnPrefixSkill* pRemovePrefixSkill) { if (NULL == pRemovePrefixSkill) return; list::iterator iter = m_ProcessPrefixOffenceSkills.begin(); for (; iter != m_ProcessPrefixOffenceSkills.end(); ) { CDnPrefixSkill* pPrefixSkill = (*iter); if (pPrefixSkill && pPrefixSkill == pRemovePrefixSkill) { iter = m_ProcessPrefixOffenceSkills.erase(iter); continue; } ++iter; } } void MASkillUser::ProcessPrefixOffenceSkill_New() { //Á¢µÎ¾î ½Ã½ºÅÛ ¹æ¾î¿ë ½ºÅ³ µî·ÏµÇ µÇ¾î ÀÖÁö ¾Ê´Ù¸é if (m_PrefixOffenceSkills.empty()) return; //Á¢µÎ»ç ½ºÅ³ ¹ßµ¿ Àü¿¡ ¸®½ºÆ®¸¦ ºñ¿î´Ù. m_ProcessPrefixOffenceSkills.clear(); //Á¢µÎ»ç ½ºÅ³ ¹ßµ¿ È®·ü °è»ê.. PREFIX_SKILL_INFO::iterator iter = m_PrefixOffenceSkills.begin(); PREFIX_SKILL_INFO::iterator endIter = m_PrefixOffenceSkills.end(); for (; iter != endIter; ++iter) { CDnPrefixSkill* pPrefixSkill = iter->second; if (!pPrefixSkill) continue; //Á¢µÎ»ç ½ºÅ³ÀÌ ÄðŸÀÓ ÁßÀÎÁö È®ÀÎÇÑ´Ù..(¹«±â/¹æ¾î±¸ ±¸ºÐÀÌ µÈ´Ù??) if (m_PrefixSkillCoolTimeManager.IsCoolTime(pPrefixSkill->GetSkillType())) { OutputDebug("Á¢µÎ»ç °ø°Ý ½ºÅ³(%d) ÄðŸÀÓ Áß!!!!!!!!!!\n", pPrefixSkill->GetSkillType()); continue; } //Á¢µÎ»ç ½ºÅ³ ¹ßµ¿ È®·ü È®ÀÎ. bool bExecuteable = rand() % 10000 <= pPrefixSkill->GetProbability(); if (!bExecuteable) { OutputDebug("Á¢µÎ»ç °ø°Ý ½ºÅ³(%d) È®·ü¿¡¼­ °É·¯Áü...!!!!\n", pPrefixSkill->GetSkillType()); continue; } //´ëÇ¥ ½ºÅ³ DnSkillHandle hSkill = pPrefixSkill->GetSkillHandle(); if (!hSkill) continue; //Skill ÄðŸÀÓ ½ÃÀÛ? hSkill->OnBeginCoolTime(); m_PrefixSkillCoolTimeManager.AddCoolTime(pPrefixSkill); int nStateEffectCount = pPrefixSkill->GetStateEffectCount(); // ÇØ´ç ½ºÅ³ÀÇ »óÅ ȿ°úº° Àû¿ë ¾×Å͸¦ °áÁ¤Çؼ­ Áߺ¹ ó¸® È®ÀÎÇϰí, // ¾×Åͺ°·Î »óÅ ȿ°ú Àû¿ëÀ» ÇØ¾ß ÇÒµí Çѵ¥... for( int k = 0; k < pPrefixSkill->GetStateEffectCount(); k++ ) { CDnSkill::StateEffectStruct *pLocalStruct = pPrefixSkill->GetStateEffectFromIndex(k); DnActorHandle hApplyActor; // »óÅ ȿ°ú Àû¿ë Ÿ°Ù ŸÀÔ¿¡ µû¶ó Àû¿ëµÉ ¾×Å͸¦ °áÁ¤ÇÑ´Ù. switch( pLocalStruct->ApplyType ) { case CDnSkill::ApplySelf: // ÀÚ½ÅÇÑÅ× hApplyActor = m_pActor->GetActorHandle(); break; case CDnSkill::ApplyTarget: // Ÿ°ÙÇÑÅ× continue; case CDnSkill::ApplyEnemy: // ÀûÇÑÅ×.. (°°Àº ÆíÀÌ ¾Æ´Ï¸é ³ª¸¦ ¶§¸° ³ðÀÌ ÀûÀÌ´Ù..) continue; break; case CDnSkill::ApplyFriend: // °°Àº Æí.. (°°Àº ÆíÀÌ¸é ³ª¸¦ ¶§¸° ³ðÀÌ °°Àº Æí..?) continue; break; } // »óÅÂÈ¿°úÁß Áö¼Ó ½Ã°£ÀÌ 0À̰í Àڽſ¡°Ô °Å´Â »óÅ ȿ°ú´Â // ½ºÅ³ÀÇ m_vlApplyNoPacketStateEffectList¿¡ ´ã¾Æ ³õ°í ½ºÅ³ ³¡³¯¶§ // Áö¿ö Áöµµ·Ï ÇÑ´Ù...[2011/01/13 semozz] bool isSelfPermentStateEffect = false; if (CDnSkill::ApplySelf == pLocalStruct->ApplyType && (0 == pLocalStruct->nDurationTime || -1 == pLocalStruct->nDurationTime)) { pLocalStruct->nDurationTime = -1; isSelfPermentStateEffect = true; } CDnStateBlow *pStateBlow = hApplyActor->GetStateBlow(); CDnSkill::CanApply eResult = CDnSkill::CanApply::Apply; if (pStateBlow) eResult = pStateBlow->CanApplySkillStateEffect(hSkill->GetInfo(), *pLocalStruct); if (CDnSkill::CanApply::Fail != eResult) { hApplyActor->RemoveResetStateBlow(); int nBlowID = hApplyActor->CmdAddStateEffect( hSkill->GetInfo(), (STATE_BLOW::emBLOW_INDEX)pLocalStruct->nID, pLocalStruct->nDurationTime, pLocalStruct->szValue.c_str(), false, false ); // OutputDebug("Á¢µÎ»ç °ø°Ý ½ºÅ³(%d) »óÅÂÈ¿°ú ÀÚ½ÅÇÑÅ× Àû¿ë (%d)-(%s)\n", pPrefixSkill->GetSkillType(), pLocalStruct->nID, pLocalStruct->szValue.c_str()); if (isSelfPermentStateEffect) hSkill->AddPrefixBlow(hApplyActor, nBlowID); } hApplyActor->InitStateBlowIDToRemove(); } //»ç¿ëµÈ ¹æ¾î ½ºÅ³Àº ¸®½ºÆ®¿¡ ´ã¾Æ ³õ´Â´Ù.. m_listProcessPreFixOffenceSkills.push_back(hSkill); //Áö±Ý ¹ßµ¿µÈ °ø°Ý¿ë Á¢µÎ»ç ½ºÅ³À» ´ã¾Æ ³õ´Â´Ù. m_ProcessPrefixOffenceSkills.push_back(pPrefixSkill); } } void MASkillUser::ApplyPrefixOffenceSkillToTarget_New(DnActorHandle hTarget) { // ÃÖÁ¾ ¸®½ºÆ®¿¡ ´ã±ä ½ºÅ³Áß¿¡¼­ ¿ì¼±¼øÀ§°¡ °¡Àå ³ôÀº ¸®½ºÆ®¿¡ ÀúÀåµÈ ½ºÅ³¸¸ »ç¿ëÇÑ´Ù. if (m_ProcessPrefixOffenceSkills.empty()) return; list::iterator iter = m_ProcessPrefixOffenceSkills.begin(); list::iterator endIter = m_ProcessPrefixOffenceSkills.end(); for (; iter != endIter; ++iter) { CDnPrefixSkill* pPrefixSkill = (*iter); if (!pPrefixSkill) continue; DnSkillHandle hSkill = pPrefixSkill->GetSkillHandle(); if (!hSkill) continue; int nStateEffectCount = pPrefixSkill->GetStateEffectCount(); // ÇØ´ç ½ºÅ³ÀÇ »óÅ ȿ°úº° Àû¿ë ¾×Å͸¦ °áÁ¤Çؼ­ Áߺ¹ ó¸® È®ÀÎÇϰí, // ¾×Åͺ°·Î »óÅ ȿ°ú Àû¿ëÀ» ÇØ¾ß ÇÒµí Çѵ¥... for( int k = 0; k < pPrefixSkill->GetStateEffectCount(); k++ ) { CDnSkill::StateEffectStruct *pLocalStruct = pPrefixSkill->GetStateEffectFromIndex(k); DnActorHandle hApplyActor; // »óÅ ȿ°ú Àû¿ë Ÿ°Ù ŸÀÔ¿¡ µû¶ó Àû¿ëµÉ ¾×Å͸¦ °áÁ¤ÇÑ´Ù. switch( pLocalStruct->ApplyType ) { case CDnSkill::ApplySelf: // ÀÚ½ÅÇÑÅ× continue; case CDnSkill::ApplyTarget: // Ÿ°ÙÇÑÅ× hApplyActor = hTarget; break; case CDnSkill::ApplyEnemy: // ÀûÇÑÅ×.. (°°Àº ÆíÀÌ ¾Æ´Ï¸é ³ª¸¦ ¶§¸° ³ðÀÌ ÀûÀÌ´Ù..) if( m_pActor->GetTeam() == hTarget->GetTeam() ) continue; else hApplyActor = hTarget; break; case CDnSkill::ApplyFriend: // °°Àº Æí.. (°°Àº ÆíÀÌ¸é ³ª¸¦ ¶§¸° ³ðÀÌ °°Àº Æí..?) if( m_pActor->GetTeam() != hTarget->GetTeam() ) continue; else hApplyActor = hTarget; break; } // »óÅÂÈ¿°úÁß Áö¼Ó ½Ã°£ÀÌ 0À̰í Àڽſ¡°Ô °Å´Â »óÅ ȿ°ú´Â // ½ºÅ³ÀÇ m_vlApplyNoPacketStateEffectList¿¡ ´ã¾Æ ³õ°í ½ºÅ³ ³¡³¯¶§ // Áö¿ö Áöµµ·Ï ÇÑ´Ù...[2011/01/13 semozz] bool isSelfPermentStateEffect = false; if (CDnSkill::ApplySelf == pLocalStruct->ApplyType && (0 == pLocalStruct->nDurationTime || -1 == pLocalStruct->nDurationTime)) { pLocalStruct->nDurationTime = -1; isSelfPermentStateEffect = true; } CDnStateBlow *pStateBlow = hApplyActor->GetStateBlow(); CDnSkill::CanApply eResult = CDnSkill::CanApply::Apply; if (pStateBlow) eResult = pStateBlow->CanApplySkillStateEffect(hSkill->GetInfo(), *pLocalStruct); if (CDnSkill::CanApply::Fail != eResult) { hApplyActor->RemoveResetStateBlow(); int nBlowID = hApplyActor->CmdAddStateEffect( hSkill->GetInfo(), (STATE_BLOW::emBLOW_INDEX)pLocalStruct->nID, pLocalStruct->nDurationTime, pLocalStruct->szValue.c_str(), false, false ); OutputDebug("Á¢µÎ»ç °ø°Ý ½ºÅ³(%d) »óÅÂÈ¿°ú »ó´ë¿¡ Àû¿ë (%d)-(%s)\n", pPrefixSkill->GetSkillType(), pLocalStruct->nID, pLocalStruct->szValue.c_str()); if (isSelfPermentStateEffect) hSkill->AddPrefixBlow(hApplyActor, nBlowID); } hApplyActor->InitStateBlowIDToRemove(); } } //´ýÇÁ °ü·Ã ÀÇ½É ÄÚµå Á¤¸® //Àû¿ëÇÏ°í ¸®½ºÆ®¸¦ ºñ¿î´Ù.. m_ProcessPrefixOffenceSkills.clear(); } #endif // _GAMESERVER #endif // PRE_ADD_PREFIX_SYSTE_RENEW void MASkillUser::SkillToggle(DnSkillHandle hSkill, bool isOn) { if (!hSkill) return; #if defined(_CLIENT) CDnSkill::DurationTypeEnum eDurationType = hSkill->GetDurationType(); if (eDurationType == CDnSkill::DurationTypeEnum::SummonOnOff) { hSkill->SummonMonsterOff(); } #endif // _CLIENT int skillID = hSkill->GetClassID(); TOGGLESKILLLIST::iterator findIter = m_ToggleOnSkillList.find(skillID); if (isOn) { //ÀÌ¹Ì ½ºÅ³ µî·ÏµÇ¾î ÀÖÀ½.. if (findIter != m_ToggleOnSkillList.end()) return; m_ToggleOnSkillList.insert(std::make_pair(skillID, hSkill)); } else { //µî·ÏµÈ ½ºÅ³ÀÌ ¾ø´Ù¸é if (findIter == m_ToggleOnSkillList.end()) return; m_ToggleOnSkillList.erase(findIter); } } void MASkillUser::SummonOnOffSkillInit(DWORD dwSummonMonsterID) { DNVector(DnSkillHandle) summonOnOffSkills; #if defined(PRE_FIX_SKILLLIST) for( DWORD i=0; iGetDurationType() == CDnSkill::DurationTypeEnum::SummonOnOff) summonOnOffSkills.push_back(hSkill); } #endif // PRE_FIX_SKILLLIST for (DWORD i =0; i < summonOnOffSkills.size(); ++i) { DnSkillHandle hSkill = summonOnOffSkills[i]; if (hSkill && hSkill->GetSummonMonsterID() == dwSummonMonsterID) hSkill->EnableToggle(false); } } #if defined(PRE_ADD_TOTAL_LEVEL_SKILL) void MASkillUser::UpdateGlobalCoolTime(float fRate) { for( DWORD i = 0; i < m_vlSkillObjects.size(); ++i ) { if(m_vlSkillObjects.at( i ).hSkill) m_vlSkillObjects.at( i ).hSkill->UpdateGlobalCoolTime(fRate); } } void MASkillUser::ResetGlobalCoolTime(float fRate) { for( DWORD i = 0; i < m_vlSkillObjects.size(); ++i ) { if(m_vlSkillObjects.at( i ).hSkill) m_vlSkillObjects.at( i ).hSkill->ResetGlobalCoolTime(fRate); } } #endif // PRE_ADD_TOTAL_LEVEL_SKILL