#include "StdAfx.h" #include "DnFreezingShieldBlow.h" #if defined( _GAMESERVER ) #include "DnActor.h" #endif // #if defined( _GAMESERVER ) #if !defined( USE_BOOST_MEMPOOL ) #ifdef _DEBUG #define new new(_NORMAL_BLOCK,__FILE__,__LINE__) #endif #endif // #if !defined( USE_BOOST_MEMPOOL ) CDnFreezingShieldBlow::CDnFreezingShieldBlow( DnActorHandle hActor, const char* szValue ) : CDnBlow( hActor ) { m_StateBlow.emBlowIndex = STATE_BLOW::BLOW_173; SetValue( szValue ); m_nDuration = 0; SetInfo(szValue); #if defined(_GAMESERVER) AddCallBackType( SB_ONDEFENSEATTACK ); #endif // _GAMESERVER } CDnFreezingShieldBlow::~CDnFreezingShieldBlow(void) { } void CDnFreezingShieldBlow::SetInfo(const char* szValue) { std::string str = szValue;//"[¸¶¹ý°ø°Ý·ÂºñÀ²;°ø°Ý¹üÀ§;°áºùÁö¼Ó½Ã°£][°áºù¼³Á¤°ª]"; std::vector tokens; std::string delimiters = "[]"; //1. ±¸ºÐ TokenizeA(str, tokens, delimiters); if (tokens.size() != 2) { OutputDebug("%s :: %s --> »óÅÂÈ¿°ú Á¤º¸ Á¡°Ë ÇÊ¿ä!!!\n", __FUNCTION__, szValue); } else { //2. ±âº» Á¤º¸ std::string defaultInfo = tokens[0]; std::vector infoTokens; delimiters = ";"; TokenizeA(defaultInfo, infoTokens, delimiters); if (3 == infoTokens.size()) { m_fRate = (float)atof( infoTokens[0].c_str() ); m_fLimitRadius = (float)atof( infoTokens[1].c_str() ); m_nFreezingTime = atoi(infoTokens[2].c_str()); } else { m_fRate = 0.0f; m_fLimitRadius = 0.0f; m_nFreezingTime = 0; OutputDebug("%s Invalid Value!!!!\n", __FUNCTION__); } //3. »óÅÂÈ¿°ú ¼³Á¤°ª m_strStateAttribute = tokens[1]; } } void CDnFreezingShieldBlow::OnBegin(LOCAL_TIME LocalTime, float fDelta ) { __super::OnBegin(LocalTime, fDelta); if (m_hActor) { //¾×ÅÍÀÇ ¸¶¹ý°ø°Ý·Â * ºñÀ² => ¹æ¾î¸·ÀÇ ³»±¸µµ¸¦ °áÁ¤ÇÑ´Ù.. m_nDuration = int((float)m_hActor->GetAttackMMax() * m_fRate); } OutputDebug( "CDnFreezingShieldBlow::OnBegin, ¸¶¹ý°ø°Ý·Â : %d , ºñÀ² : %f, ³»±¸µµ : %d\n", m_hActor->GetAttackMMax(), m_fRate, m_nDuration ); } void CDnFreezingShieldBlow::Process( LOCAL_TIME LocalTime, float fDelta ) { CDnBlow::Process( LocalTime, fDelta ); #ifdef _GAMESERVER //¼­¹öÂÊ¿¡¼­´Â Áö¼Ó½Ã°£µ¿¾È À¯Áö ¶Ç´Â ¹æ¾î¸·ÀÌ 0µÇ±âÀü°¡Áö °è¼Ó À¯Áö if( STATE_BLOW::STATE_END == m_StateBlow.emBlowState || m_nDuration <= 0 ) { // Ŭ¶ó¿¡°Ô »óÅÂÈ¿°ú Á¦°ÅÇ϶õ ÆÐŶ¸¸ º¸³»°í ¼­¹ö¿¡¼­´Â ¼ø¸®´ë·Î blow ¸¦ ÇØÁ¦½ÃŲ´Ù. m_hActor->CmdRemoveStateEffect( m_StateBlow.emBlowIndex, false ); SetState( STATE_BLOW::STATE_END ); } #else //Ŭ¶óÀÌ¾ðÆ®´Â °è¼Ó À¯Áö µÇ°í, ¼­¹ö ÆÐŶÀ¸·Î ³¡³ªµµ·ÏÇÑ´Ù... SetState(STATE_BLOW::STATE_DURATION); #endif } void CDnFreezingShieldBlow::OnEnd( LOCAL_TIME LocalTime, float fDelta ) { #if defined(_GAMESERVER) if (m_hActor && !m_hActor->IsDie()) { DNVector(DnActorHandle) hVecList; m_hActor->ScanActor( m_hActor->GetRoom(), *m_hActor->GetPosition(), m_fLimitRadius, hVecList ); // 41¹ø »óÅ ȿ°ú¿¡¼­ ÀÌÆåÆ® 3¹ø »ç¿ë [2011/03/07 semozz] char szBuff[128] = {0, }; _snprintf_s(szBuff, _countof(szBuff), _TRUNCATE, "%d", 3 ); m_ParentSkillInfo.szEffectOutputIDs = szBuff; m_ParentSkillInfo.szEffectOutputIDToClient = szBuff; for( DWORD i=0; iIsHittable( m_hActor, LocalTime, NULL ) ) continue; if (hVecList[i]->GetTeam() == m_hActor->GetTeam()) continue; hVecList[i]->CmdAddStateEffect(&m_ParentSkillInfo, STATE_BLOW::BLOW_041, m_nFreezingTime, m_strStateAttribute.c_str(), true); } } #endif // _GAMESERVER OutputDebug( "CDnFreezingShieldBlow::OnEnd\n"); } #ifdef _GAMESERVER bool CDnFreezingShieldBlow::OnDefenseAttack( DnActorHandle hHitter, CDnState* pAttackerState, CDnDamageBase::SHitParam &HitParam, bool bHitSuccess ) { // #25797 È÷Æ® ½Ã±×³Î¿¡ bIgnoreParring ÀÌ ÄÑÁ® ÀÖÀ¸¸é ¹ßµ¿ÇÏÁö ¾Ê´Â´Ù. if( HitParam.bIgnoreParring ) return false; #if defined(PRE_FIX_BLOCK_CONDITION) //ºí·°ÀÇ ¹ßµ¿ÀÌ fDamage°¡ 0ÀÌ¶óµµ ÀûÀ̶ó¸é ºí·° ¹ßµ¿ °¡´É Çϵµ·Ï.. //¾Æ±ºÀÎ °æ¿ì ±âÁ¸ ó·³ fDamage °¡0ÀÌ¸é ºí·° µÇÁö ¾Êµµ·Ï ÇÔ. if (IsCanBlock(hHitter, m_hActor, HitParam) == false) return false; #else // hit percent °¡ 0% ÀÏ °æ¿ì ¹ßµ¿ÇÏÁö ¾Ê´Â °ÍÀ¸·Î µÊ. (#21175) if( 0.0f == HitParam.fDamage ) return false; #endif // PRE_FIX_BLOCK_CONDITION #if defined(PRE_ADD_49166) // ÇǰÝÀÚ°¡ µð¹öÇÁ (Freezing / FrameStop) »óÅÂÈ¿°ú°¡ Àû¿ëµÇ¾î ÀÖ´Â °æ¿ì´Â ºí·° ¹ßµ¿ µÇÁö ¾Êµµ·Ï.. if (IsInVaildBlockCondition(m_hActor) == true) return false; #endif // PRE_ADD_49166 bool bResult = false; float fDamage = m_hActor->PreCalcDamage(hHitter, HitParam); if( m_nDuration >= fDamage ) { m_nDuration -= (int)fDamage; //¸Â´Â µ¿ÀÛ ÇÏÁö ¾Êµµ·ÏÇÑ´Ù. HitParam.szActionName.assign( "" ); bResult = true; } else { //³²Àº ³»±¸µµº¸´Ù µ¥¹ÌÁö°¡ ´õ Å©¸é ³»±¸µµ´Â 0À¸·Î Çϰí //ÇÇ°Ý µ¿ÀÛ Çϵµ·Ï. m_nDuration = 0; } return bResult; } #endif #if defined(PRE_ADD_PREFIX_SYSTE_RENEW) void CDnFreezingShieldBlow::AddStateEffectValue(const char* szOrigValue, const char* szAddValue, std::string& szNewValue) { char szBuff[128] = {0, }; std::string strValue[2]; std::vector tokens[2]; std::string delimiters = "[]"; float fRate[2] = {0.0f, }; float fLimitRadius[2] = {0.0f, }; int nFreezingTime[2] = {0, }; std::string szArgment[2]; strValue[0] = szOrigValue; //1. ±¸ºÐ TokenizeA(strValue[0], tokens[0], delimiters); if (tokens[0].size() != 2) { OutputDebug("%s :: %s --> »óÅÂÈ¿°ú Á¤º¸ Á¡°Ë ÇÊ¿ä!!!\n", __FUNCTION__, szOrigValue); } else { //2. ±âº» Á¤º¸ std::string defaultInfo = tokens[0][0]; std::vector infoTokens; delimiters = ";"; TokenizeA(defaultInfo, infoTokens, delimiters); if (5 == infoTokens.size()) { fRate[0] = (float)atof(infoTokens[0].c_str()); fLimitRadius[0] = (float)atof(infoTokens[1].c_str()); nFreezingTime[0] = atoi(infoTokens[2].c_str()); } else OutputDebug("%s :: %s --> »óÅÂÈ¿°ú Á¤º¸ Á¡°Ë ÇÊ¿ä!!!\n", __FUNCTION__, szOrigValue); //3. »óÅÂÈ¿°ú ¼³Á¤°ª szArgment[0] = tokens[0][1]; } ////////////////////////////////////////////////////////////////////////// strValue[1] = szAddValue; //1. ±¸ºÐ TokenizeA(strValue[1], tokens[1], delimiters); if (tokens[1].size() != 2) { OutputDebug("%s :: %s --> »óÅÂÈ¿°ú Á¤º¸ Á¡°Ë ÇÊ¿ä!!!\n", __FUNCTION__, szAddValue); } else { //2. ±âº» Á¤º¸ std::string defaultInfo = tokens[1][0]; std::vector infoTokens; delimiters = ";"; TokenizeA(defaultInfo, infoTokens, delimiters); if (5 == infoTokens.size()) { fRate[1] = (float)atof(infoTokens[0].c_str()); fLimitRadius[1] = (float)atof(infoTokens[1].c_str()); nFreezingTime[1] = atoi(infoTokens[2].c_str()); } else OutputDebug("%s :: %s --> »óÅÂÈ¿°ú Á¤º¸ Á¡°Ë ÇÊ¿ä!!!\n", __FUNCTION__, szAddValue); //3. »óÅÂÈ¿°ú ¼³Á¤°ª szArgment[1] = tokens[1][1]; } float fResultRate = fRate[0] + fRate[1]; float fResultLimitRadius = max(fLimitRadius[0], fLimitRadius[1]); int nResultFreezingTime = max(nFreezingTime[0], nFreezingTime[1]); sprintf_s(szBuff, "[%f;%f;%d;][%s]", fResultRate, fResultLimitRadius, nResultFreezingTime, szArgment[0].c_str()); szNewValue = szBuff; } void CDnFreezingShieldBlow::RemoveStateEffectValue(const char* szOrigValue, const char* szAddValue, std::string& szNewValue) { char szBuff[128] = {0, }; std::string strValue[2]; std::vector tokens[2]; std::string delimiters = "[]"; float fRate[2] = {0.0f, }; float fLimitRadius[2] = {0.0f, }; int nFreezingTime[2] = {0, }; std::string szArgment[2]; strValue[0] = szOrigValue; //1. ±¸ºÐ TokenizeA(strValue[0], tokens[0], delimiters); if (tokens[0].size() != 2) { OutputDebug("%s :: %s --> »óÅÂÈ¿°ú Á¤º¸ Á¡°Ë ÇÊ¿ä!!!\n", __FUNCTION__, szOrigValue); } else { //2. ±âº» Á¤º¸ std::string defaultInfo = tokens[0][0]; std::vector infoTokens; delimiters = ";"; TokenizeA(defaultInfo, infoTokens, delimiters); if (5 == infoTokens.size()) { fRate[0] = (float)atof(infoTokens[0].c_str()); fLimitRadius[0] = (float)atof(infoTokens[1].c_str()); nFreezingTime[0] = atoi(infoTokens[2].c_str()); } else OutputDebug("%s :: %s --> »óÅÂÈ¿°ú Á¤º¸ Á¡°Ë ÇÊ¿ä!!!\n", __FUNCTION__, szOrigValue); //3. »óÅÂÈ¿°ú ¼³Á¤°ª szArgment[0] = tokens[0][1]; } ////////////////////////////////////////////////////////////////////////// strValue[1] = szAddValue; //1. ±¸ºÐ TokenizeA(strValue[1], tokens[1], delimiters); if (tokens[1].size() != 2) { OutputDebug("%s :: %s --> »óÅÂÈ¿°ú Á¤º¸ Á¡°Ë ÇÊ¿ä!!!\n", __FUNCTION__, szAddValue); } else { //2. ±âº» Á¤º¸ std::string defaultInfo = tokens[1][0]; std::vector infoTokens; delimiters = ";"; TokenizeA(defaultInfo, infoTokens, delimiters); if (5 == infoTokens.size()) { fRate[1] = (float)atof(infoTokens[0].c_str()); fLimitRadius[1] = (float)atof(infoTokens[1].c_str()); nFreezingTime[1] = atoi(infoTokens[2].c_str()); } else OutputDebug("%s :: %s --> »óÅÂÈ¿°ú Á¤º¸ Á¡°Ë ÇÊ¿ä!!!\n", __FUNCTION__, szAddValue); //3. »óÅÂÈ¿°ú ¼³Á¤°ª szArgment[1] = tokens[1][1]; } float fResultRate = fRate[0] - fRate[1]; float fResultLimitRadius = min(fLimitRadius[0], fLimitRadius[1]); int nResultFreezingTime = min(nFreezingTime[0], nFreezingTime[1]); sprintf_s(szBuff, "[%f;%f;%d;][%s]", fResultRate, fResultLimitRadius, nResultFreezingTime, szArgment[0].c_str()); szNewValue = szBuff; } #endif // PRE_ADD_PREFIX_SYSTE_RENEW