#include "StdAfx.h" #include "DnStealBuffBlow.h" #include "DnSkill.h" #if !defined( USE_BOOST_MEMPOOL ) #ifdef _DEBUG #define new new(_NORMAL_BLOCK,__FILE__,__LINE__) #endif #endif // #if !defined( USE_BOOST_MEMPOOL ) CDnStealBuffBlow::CDnStealBuffBlow( DnActorHandle hActor, const char* szValue ) : CDnBlow( hActor ) { m_StateBlow.emBlowIndex = STATE_BLOW::BLOW_174; SetValue( szValue ); m_nCount = 0; m_nNewDelayTime = 0; m_fScanRange = 0.0f; std::string str = szValue;//"°¹¼ö;Áö¼Ó½Ã°£(ms(10000 == 1ÃÊ))"; std::vector tokens; std::string delimiters = ";"; //1. »óÅÂÈ¿°ú À妽º ¸®½ºÆ®¿Í Àû¿ë ·¹º§ ±¸ºÐ TokenizeA(str, tokens, delimiters); if (3 == tokens.size()) { m_nCount = atoi( tokens[0].c_str() ); m_nNewDelayTime = atoi( tokens[1].c_str() ); m_fScanRange = (float)atof(tokens[2].c_str()); } else OutputDebug("%s Invalid value!!!\n", __FUNCTION__); } CDnStealBuffBlow::~CDnStealBuffBlow(void) { } void CDnStealBuffBlow::OnBegin( LOCAL_TIME LocalTime, float fDelta ) { __super::OnBegin(LocalTime, fDelta); #if defined(_GAMESERVER) StealBuffProcess(LocalTime); #endif // _GAMESERVER } void CDnStealBuffBlow::Process( LOCAL_TIME LocalTime, float fDelta ) { __super::Process(LocalTime, fDelta); } void CDnStealBuffBlow::OnEnd( LOCAL_TIME LocalTime, float fDelta ) { __super::OnEnd(LocalTime, fDelta); } #if defined(_GAMESERVER) void CDnStealBuffBlow::FindSkillBlowList(DnActorHandle hActor, int skillID, DNVector(DnBlowHandle)& vlBlowList) { if (!hActor) return; int nStateBlowCount = hActor->GetNumAppliedStateBlow(); for (int i = 0; i < nStateBlowCount; ++i) { DnBlowHandle hBlow = hActor->GetAppliedStateBlow(i); //StealBuffÀÌ¸é °Ç³Ê¶Ü. if (!hBlow || STATE_BLOW::BLOW_174 == hBlow->GetBlowIndex()) continue; //Åõ¸íÈ­ »óÅÂÈ¿°ú if (STATE_BLOW::BLOW_073 == hBlow->GetBlowIndex()) continue; CDnSkill::SkillInfo* pSkillInfo = const_cast(hBlow->GetParentSkillInfo()); //½ºÅ³ Á¤º¸°¡ ¾øÀ¸¸é °Ç³Ê¶Ü. (½ºÅ³ À¯Àú°¡ ¾øÀ» ¼ö ÀÖÀ½..(ÇÁ¶ø?¿¡ ÀÇÇØ Àû¿ëµÈ »óÅÂÈ¿°ú) if (!pSkillInfo /*|| !pSkillInfo->hSkillUser*/) continue; if (pSkillInfo->iSkillID == skillID) vlBlowList.push_back(hBlow); } } void CDnStealBuffBlow::StealBuffProcess() { if (m_nCount <= 0) return; if (!m_hActor) return; if (!m_ParentSkillInfo.hSkillUser) return; //Á¦°ÅÇØ¾ßÇÒ Blow ¸®½ºÆ® DNVector(DnBlowHandle) vlRemoveBlowList; typedef std::map SKILL_ID_LIST; SKILL_ID_LIST skillList; int nLoopCount = m_nCount; int nStateBlowCount = m_hActor->GetNumAppliedStateBlow(); //1. ½ºÅ³ ID¸¦ ¼öÁý for (int i = 0; i < nStateBlowCount; ++i) { DnBlowHandle hBlow = m_hActor->GetAppliedStateBlow(i); //StealBuffÀÌ¸é °Ç³Ê¶Ü. if (!hBlow || STATE_BLOW::BLOW_174 == hBlow->GetBlowIndex()) continue; //Åõ¸íÈ­ »óÅÂÈ¿°ú if (STATE_BLOW::BLOW_073 == hBlow->GetBlowIndex()) continue; //½ºÅ³ Á¤º¸°¡ ¾ø°Å³ª buff°¡ ¾Æ´Ï¸é °Ç³Ê¶Ü. CDnSkill::SkillInfo* pSkillInfo = const_cast(hBlow->GetParentSkillInfo()); if (!pSkillInfo || CDnSkill::DurationTypeEnum::Buff != pSkillInfo->eDurationType ) continue; //¾×Ƽºê ½ºÅ³¸¸.. if (CDnSkill::Active != pSkillInfo->eSkillType) continue; skillList.insert(SKILL_ID_LIST::value_type(pSkillInfo->iSkillID, pSkillInfo->iSkillID)); } //2. ½ºÅ³¿¡ ºÎ¿©µÈ Blowµé ¼öÁýÇØ¼­ »õ·Î¿î ij¸¯ÅÍ¿¡ blowºÎ¿© SKILL_ID_LIST::iterator iter = skillList.begin(); SKILL_ID_LIST::iterator endIter = skillList.end(); for (; iter != endIter; ++iter) { if (nLoopCount == 0) break; //ÇØ´ç ½ºÅ³ÀÇ blowµéÀ» ¾ò¾î ¿Â´Ù.. DNVector(DnBlowHandle) vlSkillBlowList; FindSkillBlowList(m_hActor, iter->first, vlSkillBlowList); int nBlowCount = (int)vlSkillBlowList.size(); for (int n = 0; n < nBlowCount; ++n) { DnBlowHandle hBlow = vlSkillBlowList[n]; if (!hBlow) continue; CDnSkill::SkillInfo* pSkillInfo = const_cast(hBlow->GetParentSkillInfo()); if (!pSkillInfo || !pSkillInfo->hSkillUser) continue; //½ºÅ³ »ç¿ëÇÑ À¯Àú¿¡°Ô¼­ ½ºÅ³ ÇÚµéÀ» ¾ò¾î ¿Â´Ù. ¾øÀ¸¸é °Ç³Ê¶Ü DnSkillHandle hSkill = pSkillInfo->hSkillUser->FindSkill(pSkillInfo->iSkillID); if (!hSkill) continue; //ƯÁ¤ ¹«±â¸¦ ÇÊ¿ä·Î ÇÏÁö ¾ÊÀ¸¸é if (CDnWeapon::EquipTypeEnum_Amount == hSkill->GetNeedEquipType(0) && CDnWeapon::EquipTypeEnum_Amount == hSkill->GetNeedEquipType(1)) { //½ºÅ³À» »ç¿ëÇÑ À¯Àú¿¡°Ô Áö¿öÁö´Â »óÅ ȿ°ú¸¦ »õ·Î¿î Áö¼Ó ½Ã°£À¸·Î µî·ÏÇÑ´Ù.. m_ParentSkillInfo.hSkillUser->CmdAddStateEffect(pSkillInfo, hBlow->GetBlowIndex(), m_nNewDelayTime, hBlow->GetValue(), false, false); } } nLoopCount--; } } void CDnStealBuffBlow::StealBuffProcess(LOCAL_TIME LocalTime) { DNVector(DnActorHandle) VecList; m_hActor->ScanActor( m_hActor->GetRoom(), *m_hActor->GetPosition(), m_fScanRange, VecList ); for( DWORD i=0; iIsHittable( m_hActor, LocalTime, NULL ) ) continue; if (VecList[i]->GetTeam() == m_hActor->GetTeam()) continue; StealBuffFromActor(VecList[i]); } } void CDnStealBuffBlow::StealBuffFromActor( DnActorHandle hTargetActor ) { if (m_nCount <= 0) return; if (!m_hActor) return; //¸é¿ª ó¸®... if (!hTargetActor || hTargetActor->IsImmuned(m_StateBlow.emBlowIndex)) return; //Á¦°ÅÇØ¾ßÇÒ Blow ¸®½ºÆ® DNVector(DnBlowHandle) vlRemoveBlowList; typedef std::map SKILL_ID_LIST; SKILL_ID_LIST skillList; int nLoopCount = m_nCount; int nStateBlowCount = hTargetActor->GetNumAppliedStateBlow(); //1. ½ºÅ³ ID¸¦ ¼öÁý for (int i = 0; i < nStateBlowCount; ++i) { DnBlowHandle hBlow = hTargetActor->GetAppliedStateBlow(i); //StealBuffÀÌ¸é °Ç³Ê¶Ü. if (!hBlow || STATE_BLOW::BLOW_174 == hBlow->GetBlowIndex()) continue; //Åõ¸íÈ­ »óÅÂÈ¿°ú if (STATE_BLOW::BLOW_073 == hBlow->GetBlowIndex()) continue; //½ºÅ³ Á¤º¸°¡ ¾ø°Å³ª buff°¡ ¾Æ´Ï¸é °Ç³Ê¶Ü. CDnSkill::SkillInfo* pSkillInfo = const_cast(hBlow->GetParentSkillInfo()); if (!pSkillInfo || CDnSkill::DurationTypeEnum::Buff != pSkillInfo->eDurationType ) continue; //¾×Ƽºê ½ºÅ³¸¸.. if (CDnSkill::Active != pSkillInfo->eSkillType) continue; skillList.insert(SKILL_ID_LIST::value_type(pSkillInfo->iSkillID, pSkillInfo->iSkillID)); } //2. ½ºÅ³¿¡ ºÎ¿©µÈ Blowµé ¼öÁýÇØ¼­ »õ·Î¿î ij¸¯ÅÍ¿¡ blowºÎ¿© SKILL_ID_LIST::iterator iter = skillList.begin(); SKILL_ID_LIST::iterator endIter = skillList.end(); for (; iter != endIter; ++iter) { if (nLoopCount == 0) break; //ÇØ´ç ½ºÅ³ÀÇ blowµéÀ» ¾ò¾î ¿Â´Ù.. DNVector(DnBlowHandle) vlSkillBlowList; FindSkillBlowList(hTargetActor, iter->first, vlSkillBlowList); int nBlowCount = (int)vlSkillBlowList.size(); for (int n = 0; n < nBlowCount; ++n) { DnBlowHandle hBlow = vlSkillBlowList[n]; if (!hBlow) continue; // [2011/03/30 semozz] // ½ºÅ³ À¯Àú ¾×ÅÍ È®ÀÎÀº ¾È Çϴ°ɷÎ..(ÇÁ¶ø?¿¡ ÀÇÇØ¼­ Ãß°¡µÈ »óÅÂÈ¿°ú´Â ½ºÅ³ À¯Àú ¾×ÅͰ¡ ¾øÀ½.) CDnSkill::SkillInfo* pSkillInfo = const_cast(hBlow->GetParentSkillInfo()); if (!pSkillInfo /*|| !pSkillInfo->hSkillUser*/) continue; //½ºÅ³ À¯Àú Á¤º¸°¡ ¼³Á¤ µÇ¾î ÀÖÀ»°æ¿ì if (pSkillInfo->hSkillUser) { //½ºÅ³ À¯Àú Á¤º¸°¡ ÀÖ´Ù¸é ½ºÅ³ °Ë»ç.. DnSkillHandle hSkill = pSkillInfo->hSkillUser->FindSkill(pSkillInfo->iSkillID); //½ºÅ³ÀÌ ¾øÀ¸¸é °Ç³Ê¶Ü.. if (!hSkill) continue; //°Ë»öµÈ ½ºÅ³ÀÌ ÀÖÀ¸¸é ƯÁ¤ ¹«±â¸¦ ÇÊ¿ä·Î ÇÏ´Â ½ºÅ³ÀÌ¸é °Ç³Ê ¶Ü if (CDnWeapon::EquipTypeEnum_Amount != hSkill->GetNeedEquipType(0) || CDnWeapon::EquipTypeEnum_Amount != hSkill->GetNeedEquipType(1)) continue; } //Àڽſ¡°Ô Àû¿ëÇÒ »óÅÂÈ¿°ú¸¦ ¿¹¾àÇÑ´Ù.. m_hActor->ReserveStealMagicBuff(hTargetActor, pSkillInfo, m_nNewDelayTime, hBlow->GetBlowIndex(), hBlow->GetValue()); } nLoopCount--; } } #endif // _GAMESERVER #if defined(PRE_ADD_PREFIX_SYSTE_RENEW) void CDnStealBuffBlow::AddStateEffectValue(const char* szOrigValue, const char* szAddValue, std::string& szNewValue) { char szBuff[128] = {0, }; //ÆÄ½Ì¿¡ ÇÊ¿äÇÑ º¯¼ö ¼±¾ð std::vector vlTokens[2]; string strArgument[2]; //ÇÊ¿äÇÑ °ª º¯¼ö int nCount[2] = {0, }; int nNewDelayTime[2] = {0, }; float fScanRange[2] = {0.0f, }; ////////////////////////////////////////////////////////////////////////// //ù¹øÂ° ¹®ÀÚ¿­ ÆÄ½Ì. strArgument[0] = szOrigValue; TokenizeA( strArgument[0], vlTokens[0], ";" ); if( vlTokens[0].size() == 3 ) { nCount[0] = atoi( vlTokens[0][0].c_str() ); nNewDelayTime[0] = atoi( vlTokens[0][1].c_str() ); fScanRange[0] = (float)atof( vlTokens[0][2].c_str() ); } ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// //µÎ¹øÂ° ¹®ÀÚ¿­ ÆÄ½Ì strArgument[1] = szAddValue; TokenizeA( strArgument[1], vlTokens[1], ";" ); if( vlTokens[1].size() == 3 ) { nCount[1] = atoi( vlTokens[1][0].c_str() ); nNewDelayTime[1] = atoi( vlTokens[1][1].c_str() ); fScanRange[1] = (float)atof( vlTokens[1][2].c_str() ); } ////////////////////////////////////////////////////////////////////////// //µÎ °ªÀ» ´õÇÑ´Ù. int nResultCount = nCount[0] + nCount[1]; int nResultDelayTime = max(nNewDelayTime[0], nNewDelayTime[1]); float fResultScanRange = max(fScanRange[0], fScanRange[1]); sprintf_s(szBuff, "%d;%d;%f", nResultCount, nResultDelayTime, fResultScanRange); szNewValue = szBuff; } void CDnStealBuffBlow::RemoveStateEffectValue(const char* szOrigValue, const char* szAddValue, std::string& szNewValue) { char szBuff[128] = {0, }; //ÆÄ½Ì¿¡ ÇÊ¿äÇÑ º¯¼ö ¼±¾ð std::vector vlTokens[2]; string strArgument[2]; //ÇÊ¿äÇÑ °ª º¯¼ö int nCount[2] = {0, }; int nNewDelayTime[2] = {0, }; float fScanRange[2] = {0.0f, }; ////////////////////////////////////////////////////////////////////////// //ù¹øÂ° ¹®ÀÚ¿­ ÆÄ½Ì. strArgument[0] = szOrigValue; TokenizeA( strArgument[0], vlTokens[0], ";" ); if( vlTokens[0].size() == 3 ) { nCount[0] = atoi( vlTokens[0][0].c_str() ); nNewDelayTime[0] = atoi( vlTokens[0][1].c_str() ); fScanRange[0] = (float)atof( vlTokens[0][2].c_str() ); } ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// //µÎ¹øÂ° ¹®ÀÚ¿­ ÆÄ½Ì strArgument[1] = szAddValue; TokenizeA( strArgument[1], vlTokens[1], ";" ); if( vlTokens[1].size() == 3 ) { nCount[1] = atoi( vlTokens[1][0].c_str() ); nNewDelayTime[1] = atoi( vlTokens[1][1].c_str() ); fScanRange[1] = (float)atof( vlTokens[1][2].c_str() ); } ////////////////////////////////////////////////////////////////////////// //µÎ °ªÀ» ´õÇÑ´Ù. int nResultCount = nCount[0] - nCount[1]; int nResultDelayTime = min(nNewDelayTime[0], nNewDelayTime[1]); float fResultScanRange = min(fScanRange[0], fScanRange[1]); sprintf_s(szBuff, "%d;%d;%f", nResultCount, nResultDelayTime, fResultScanRange); szNewValue = szBuff; } #endif // PRE_ADD_PREFIX_SYSTE_RENEW