#include "StdAfx.h" #include "DnParryBlow.h" #ifdef _GAMESERVER #include "DnStateBlow.h" #include "DnPlayerActor.h" #endif #ifdef _DEBUG #define new new(_NORMAL_BLOCK,__FILE__,__LINE__) #endif CDnParryBlow::CDnParryBlow(DnActorHandle hActor, const char *szValue) : CDnBlow(hActor) { m_StateBlow.emBlowIndex = STATE_BLOW::BLOW_031; AddCallBackType(SB_ONDEFENSEATTACK); SetValue(szValue); //m_nValue = atoi( szValue ); m_fValue = (float)atof(szValue); #ifdef _GAMESERVER m_strParringActionName.assign( "Skill_Parrying" ); m_bEnable = false; m_bEnableLastLoop = false; m_fAdditionalSignalProb = 0.0f; m_fAdditionalSignalProbLastLoop = 0.0f; #endif } CDnParryBlow::~CDnParryBlow(void) { } void CDnParryBlow::Process( LOCAL_TIME LocalTime, float fDelta ) { CDnBlow::Process( LocalTime, fDelta ); #ifdef _GAMESERVER // ¾×ÅÍ process °ÅÀÇ ³¡ºÎºÐ¿¡ »óÅÂÈ¿°ú process ¸¦ µ¹±â ¶§¹®¿¡ ¿©±â¼­ ¸®¼ÂÇØÁÖ¸é ÆÐ¸µ½Ã±×³ÎÀÇ ±¸°£°ú µ¿ÀÏÇÏ°Ô enable ÀÌ Ã³¸®µÉ °Í. m_bEnableLastLoop = m_bEnable; m_fAdditionalSignalProbLastLoop = m_fAdditionalSignalProb; m_bEnable = false; m_fAdditionalSignalProb = 0.0f; #endif } void CDnParryBlow::OnBegin( LOCAL_TIME LocalTime, float fDelta ) { OutputDebug( "CDnParryBlow::OnBegin\n" ); } void CDnParryBlow::OnEnd( LOCAL_TIME LocalTime, float fDelta ) { OutputDebug( "CDnParryBlow::OnEnd\n" ); } #ifdef _GAMESERVER bool CDnParryBlow::OnDefenseAttack( DnActorHandle hHitter, CDnState* pAttackerState, CDnDamageBase::SHitParam &HitParam, bool bHitSuccess ) { // #25797 È÷Æ® ½Ã±×³Î¿¡ bIgnoreParring ÀÌ ÄÑÁ® ÀÖÀ¸¸é ¹ßµ¿ÇÏÁö ¾Ê´Â´Ù. if( HitParam.bIgnoreParring ) return false; if( !m_bEnableLastLoop ) return false; if( !bHitSuccess ) return false; /* // hit percent °¡ 0% ÀÏ °æ¿ì ¹ßµ¿ÇÏÁö ¾Ê´Â °ÍÀ¸·Î µÊ. (#21175) if( 0.0f == HitParam.fDamage ) { // #29204 fDamage°¡ 0À϶§ ÆÐ¸µ Ç®¸®´Â Çö»ó ¸·À½. // °°Àº ÆÀÀÏ °æ¿ì¸¸ ¹æ¾î ½ÇÆÐ [2011/02/24 semozz] // ´Ù¸¥ ÆÀÀÏ °æ¿ì´Â ¿ø·¡ ·çƾ ó¸®... if (hHitter && m_hActor && (hHitter->GetTeam() == m_hActor->GetTeam())) { 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 // Ç÷¹À̾îÀÎ °æ¿ì¿£, if( m_hActor->IsPlayerActor() ) { // ´ëÆ÷¸ðµåÀ϶§´Â ¹ßµ¿ÇÏÁö ¾ÊÀ½. CDnPlayerActor* pPlayerActor = static_cast(m_hActor.GetPointer()); if( pPlayerActor->IsCannonMode() ) return false; // ¹«±â¸¦ µé°í ÀÖÁö ¾ÊÀº °æ¿ì¿£ ¹ßµ¿ÇÏÁö ¾ÊÀ½. #26772 if( false == (pPlayerActor->IsBattleMode() && pPlayerActor->GetWeapon( 0 ) && pPlayerActor->GetWeapon( 1 )) ) return false; if( pPlayerActor->IsTransformMode() ) return false; } float fAddProb = m_fAdditionalSignalProbLastLoop; if( m_hActor->GetStateBlow()->IsApplied( STATE_BLOW::BLOW_056 ) ) { DNVector(DnBlowHandle) vlhParryingProbBlow; m_hActor->GetStateBlow()->GetStateBlowFromBlowIndex( STATE_BLOW::BLOW_056, vlhParryingProbBlow ); int iNumBlow = (int)vlhParryingProbBlow.size(); for( int i = 0; i < iNumBlow; ++i ) fAddProb += vlhParryingProbBlow.at( i )->GetFloatValue(); } int iProb = int((m_fValue+fAddProb) * 10000.0f); int iRandValue = (_rand(GetRoom())%10000); if( iRandValue <= iProb ) { // HitParam¿¡ ÀûÀýÇÑ °ªÀ» ¼ÂÆÃÇÑ´Ù. HitParam.szActionName = m_strParringActionName; OutputDebug( "CDnParryingBlow::OnDefenseAttack\n" ); // °É¾î³õÀº ¾ÖµéÇÑÅ× ¾Ë·ÁÁÜ. ///////////////////////////////////////////// boost::shared_ptr pEvent( IDnObserverNotifyEvent::Create( EVENT_BUBBLE_PARRING_SUCCESS ) ); pEvent->SetSkillID( m_ParentSkillInfo.iSkillID ); Notify( pEvent ); ////////////////////////////////////////////////////////////////////////// return true; } else { return false; } } #endif #if defined(PRE_ADD_PREFIX_SYSTE_RENEW) void CDnParryBlow::AddStateEffectValue(const char* szOrigValue, const char* szAddValue, std::string& szNewValue) { char szBuff[128] = {0, }; //ÇÊ¿äÇÑ °ª º¯¼ö float fValue[2]; ////////////////////////////////////////////////////////////////////////// //ù¹øÂ° °ª fValue[0] = (float)atof( szOrigValue ); ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// //µÎ¹øÂ° fValue[1] = (float)atof( szAddValue ); ////////////////////////////////////////////////////////////////////////// //µÎ °ªÀ» ´õÇÑ´Ù. float fResultValue = fValue[0] + fValue[1]; sprintf_s(szBuff, "%f", fResultValue); szNewValue = szBuff; } void CDnParryBlow::RemoveStateEffectValue(const char* szOrigValue, const char* szAddValue, std::string& szNewValue) { char szBuff[128] = {0, }; //ÇÊ¿äÇÑ °ª º¯¼ö float fValue[2]; ////////////////////////////////////////////////////////////////////////// //ù¹øÂ° °ª fValue[0] = (float)atof( szOrigValue ); ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// //µÎ¹øÂ° fValue[1] = (float)atof( szAddValue ); ////////////////////////////////////////////////////////////////////////// //°ª °è»ê float fResultValue = fValue[0] - fValue[1]; sprintf_s(szBuff, "%f", fResultValue); szNewValue = szBuff; } #endif // PRE_ADD_PREFIX_SYSTE_RENEW