#include "StdAfx.h" #include "DnRangeMReflectDamageBlow.h" #ifdef _DEBUG #define new new(_NORMAL_BLOCK,__FILE__,__LINE__) #endif #ifdef _GAMESERVER extern int GetGaussianRandom( int nMin, int nMax, CMultiRoom *pRoom ); #endif CDnRangeMReflectDamageBlow::CDnRangeMReflectDamageBlow( DnActorHandle hActor, const char* szValue ) : CDnBlow( hActor ) #ifdef _GAMESERVER , m_fReflectRatio( 0.0f ) , m_fReflectRatioMax( 0.0f ) #endif // #ifdef _GAMESERVER { m_StateBlow.emBlowIndex = STATE_BLOW::BLOW_114; AddCallBackType( SB_ONDEFENSEATTACK ); SetValue( szValue ); #ifdef _GAMESERVER m_fReflectRatio = (float)atof( szValue ); m_fReflectRatioMax = 1.0f; #endif // #ifdef _GAMESERVER } CDnRangeMReflectDamageBlow::~CDnRangeMReflectDamageBlow(void) { } void CDnRangeMReflectDamageBlow::OnBegin( LOCAL_TIME LocalTime, float fDelta ) { OutputDebug( "CDnRangeMReflectDamageBlow::OnBegin\n" ); } void CDnRangeMReflectDamageBlow::Process( LOCAL_TIME LocalTime, float fDelta ) { CDnBlow::Process( LocalTime, fDelta ); } void CDnRangeMReflectDamageBlow::OnEnd( LOCAL_TIME LocalTime, float fDelta ) { OutputDebug( "CDnRangeMReflectDamageBlow::OnEnd\n" ); } #ifdef _GAMESERVER bool CDnRangeMReflectDamageBlow::OnDefenseAttack( DnActorHandle hActor, CDnState* pAttackerState, CDnDamageBase::SHitParam &HitParam, bool bHitSuccess ) { if( hActor && pAttackerState && CDnActor::PropActor != hActor->GetActorType() && CDnDamageBase::DistanceTypeEnum::Range == HitParam.DistanceType && 1 == HitParam.cAttackType && !hActor->IsDie() ) { // ¿ø°Å¸®´Â ¹ß»çü¿¡ ½ºÅ³ ¾µ ´ç½ÃÀÇ Ä³¸¯ÅÍÀÇ ´É·ÂÀ» ´ã°í ÀÖ´Â AttackerState ¸¦ »Ì¾Æ¼­ ÀÌ ÇÔ¼öÀÇ ÀÎÀÚ·Î ³Ö¾îÁÜ. //int iMAttackMin = hActor->GetAttackMMin(); //int iMAttackMax = hActor->GetAttackMMax(); int iMAttackMin = pAttackerState->GetAttackMMin(); int iMAttackMax = pAttackerState->GetAttackMMax(); int iReflectDamage = int(GetGaussianRandom( iMAttackMin, iMAttackMax, hActor->GetRoom() ) * m_fReflectRatio * HitParam.fDamage); // #29810 À̽´ °ü·Ã.. Á¤È®ÇÑ ¿øÀÎÀ» ¾Ë ¼ö ¾ø¾î ÀÌ»óÇÑ °ªÀÎ °æ¿ì ÆÐ½ºÇϵµ·Ï ó¸®. if( iReflectDamage < 0 ) return false; ////////////////////////////////////////////////////////////////////////// // ºû¼Ó¼º °ø°Ý·Â¸¸Å­ Áõ°¡. #ifdef PRE_ADD_49660 if( DVINE_PUNISHMENT_SKILL_ID == m_ParentSkillInfo.iSkillID ) { float fLightElementAttack = m_hActor->GetElementAttack( CDnState::Light ); iReflectDamage += int((float)iReflectDamage * fLightElementAttack); } #endif // #ifdef PRE_ADD_49660 #ifdef PRE_FIX_REFLECT_SE_LIMIT // ±âº» °ø°Ý·ÂÀÇ ÃÖ´ëÄ¡¸¦ ³ÑÁö ¾Êµµ·Ï. CDnState* pState = m_hActor->GetStateStep( 0 ); int iLimit = int((float)pState->GetAttackMMax() * m_fReflectRatioMax); if( iLimit < iReflectDamage ) iReflectDamage = iLimit; #endif // #ifdef PRE_FIX_REFLECT_SE_LIMIT #if defined(PRE_FIX_61382) DnActorHandle hOwnerActor = CDnActor::GetOwnerActorHandle(hActor); if (hOwnerActor && hOwnerActor->IsDie() == false) { hActor->RequestDamageFromStateBlow(GetMySmartPtr(), iReflectDamage); if (hOwnerActor->IsDie()) hOwnerActor->Die(m_hActor); } #else hActor->RequestDamageFromStateBlow( GetMySmartPtr(), iReflectDamage ); // Á×¾ú³ª üũ if( hActor->GetHP() <= 0.f ) hActor->Die( m_hActor ); #endif // PRE_FIX_61382 } return false; } #endif #if defined(PRE_ADD_PREFIX_SYSTE_RENEW) void CDnRangeMReflectDamageBlow::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 CDnRangeMReflectDamageBlow::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