#include "StdAfx.h" #include "DnComboDamageLimitBlow.h" #include "DnProjectile.h" #if !defined( USE_BOOST_MEMPOOL ) #ifdef _DEBUG #define new new(_NORMAL_BLOCK,__FILE__,__LINE__) #endif #endif // #if !defined( USE_BOOST_MEMPOOL ) /* ÀÌ »óÅ ȿ°ú´Â ÇØ´ç ½ºÅ³ ¾×¼ÇÀÇ ÃÖÃÊ Hit½Ã±×³Î¿¡¼­ Ãß°¡¸¦ ÇÏ°í ±× ÀÌÈÄÀÇ hit½Ã±×³Î¿¡¼­´Â szSkipStateBlows¿¡ ÀÌ »óÅÂÈ¿°ú ½ºÅµÀ» ¼³Á¤Çؼ­ ´Ù½Ã Ãß°¡ µÇÁö ¾Êµµ·Ï ÇØ¾ß ÇÑ´Ù.. */ CDnComboDamageLimitBlow::CDnComboDamageLimitBlow( DnActorHandle hActor, const char* szValue ) : CDnBlow( hActor ) { m_StateBlow.emBlowIndex = STATE_BLOW::BLOW_242; SetValue( szValue ); m_fValue = 0.0f; std::string str = szValue;//"Á¦ÇÑ Hit¼ö;µ¥¹ÌÁö Á¦ÇÑ ¼öÄ¡(0.1 => 10%)"; std::vector tokens; std::string delimiters = ";"; //1. »óÅÂÈ¿°ú À妽º ¸®½ºÆ®¿Í Àû¿ë ·¹º§ ±¸ºÐ TokenizeA(str, tokens, delimiters); if (2 == tokens.size()) { m_nHitLimitCount = atoi( tokens[0].c_str() ); m_fDamageRate = (float)atof(tokens[1].c_str()); //¼³Á¤°ª ¿À·ù? º¸Á¤.. if (m_nHitLimitCount == 0) { m_nHitLimitCount = -1; m_fDamageRate = -1.0f; } } else { //»óÅÂÈ¿°ú ¼³Á¤ÀÌ Àß ¸ø µÈ °æ¿ì Àû¿ë µÇÁö ¾Êµµ·Ï ÇÑ´Ù. m_nHitLimitCount = -1; m_fDamageRate = -1.0f; OutputDebug("%s Invalid Value!!!!\n", __FUNCTION__); } m_bActivated = false; m_SkillStartTime = 0; #if defined(_GAMESERVER) AddCallBackType(SB_ONCALCDAMAGE); #endif // _GAMESERVER } CDnComboDamageLimitBlow::~CDnComboDamageLimitBlow(void) { } void CDnComboDamageLimitBlow::OnBegin( LOCAL_TIME LocalTime, float fDelta ) { OutputDebug( "%s\n", __FUNCTION__); } void CDnComboDamageLimitBlow::OnEnd( LOCAL_TIME LocalTime, float fDelta ) { OutputDebug( "%s »óÅÂÈ¿°ú ½ÃÀÛ ½Ã°£ %d\n", __FUNCTION__, m_SkillStartTime); } void CDnComboDamageLimitBlow::Process( LOCAL_TIME LocalTime, float fDelta ) { __super::Process(LocalTime, fDelta); #if defined(_GAMESERVER) if (m_ParentSkillInfo.hSkillUser) { //½ºÅ³ »ç¿ëÀÌ ³¡³ª°í, ½ºÅ³¿¡¼­ »ç¿ëµÈ ¹ß»çü°¡ ÀüºÎ ¾ø¾î Á³À¸¸é »óÅÂÈ¿°ú Á¾·á ÇÑ´Ù. DnSkillHandle hSkill = m_ParentSkillInfo.hSkillUser->FindSkill(m_ParentSkillInfo.iSkillID); if (hSkill && hSkill->IsFinished() && hSkill->GetProjectileCount(m_SkillStartTime) == 0) { #ifdef PRE_FIX_REMOVE_STATE_EFFECT_PACKET #else m_hActor->SendRemoveStateEffectFromID(GetBlowID()); #endif m_StateBlow.fDurationTime = 0.0f; SetState(STATE_BLOW::STATE_END); } } #endif // _GAMESERVER } #if defined(_GAMESERVER) float CDnComboDamageLimitBlow::OnCalcDamage( float fOriginalDamage, CDnDamageBase::SHitParam& HitParam ) { float fDamage = 0.0f; //¹ß»çü¿¡ ÀÇÇÑ È÷Æ® ÀÎÁö È®ÀÎ... LOCAL_TIME projectileSkillStartTime = 0; CDnProjectile* pProjectile = NULL; if (HitParam.bFromProjectile && HitParam.hWeapon) pProjectile = static_cast( HitParam.hWeapon.GetPointer() ); //¹ß»çüÀÇ ½ºÅ³ ½ÃÀÛ ½Ã°£°ú »óÅÂÈ¿°úÀÇ ½ºÅ³ ½ÃÀÛ ½Ã°£ÀÌ °°¾Æ¾ß ÇÑ´Ù.. if (pProjectile) projectileSkillStartTime = pProjectile->GetSkillStartTime(); //½ºÅ³ »ç¿ëÀÚ¿Í Áö±Ý Hitter°¡ °°ÀºÁö È®ÀÎÇÑ´Ù.. bool bSameHitter = false; if (m_ParentSkillInfo.hSkillUser && HitParam.hHitter && m_ParentSkillInfo.hSkillUser == HitParam.hHitter && m_SkillStartTime == projectileSkillStartTime) bSameHitter = true; // m_bActivated°¡ Ȱ¼ºÈ­ µÇ¾î ÀÖ°í, °°Àº HitterÀÎ °æ¿ì¿¡ µ¥¹ÌÁö º¸Á¤ °è»ê if (m_bActivated == true && bSameHitter) { //¿ø·¡ µ¥¹ÌÁö 100, µ¥¹ÌÁö Á¦ÇÑÀÌ 0.3(30%)Àΰæ¿ì //100 - (1.0 - 0.3) = 70 //-70¸¸Å­ µ¥¹ÌÁö º¸Á¤À» ÇØÁà¾ß µ¥¹ÌÁö°¡ 30¸¸Å­¸¸ Àû¿ëµÊ. fDamage = -(fOriginalDamage * (1.0f - m_fDamageRate)); //¼³Á¤°ªÀÌ À߸ø µÈ°æ¿ì Àû¿ë µÇÁö ¾Êµµ·Ï ÇÔ. if (m_nHitLimitCount == -1 && m_fDamageRate == -1.0f) fDamage = 0.0f; } return fDamage; } void CDnComboDamageLimitBlow::UpdateHitCount(CDnSkill::SkillInfo* pSkillInfo, CDnDamageBase::SHitParam& HitParam) { if (pSkillInfo) { //¹ß»çü¿¡ ÀÇÇÑ È÷Æ® ÀÎÁö È®ÀÎ... LOCAL_TIME projectileSkillStartTime = 0; CDnProjectile* pProjectile = NULL; if (HitParam.bFromProjectile && HitParam.hWeapon) pProjectile = static_cast( HitParam.hWeapon.GetPointer() ); //¹ß»çüÀÇ ½ºÅ³ ½ÃÀÛ ½Ã°£°ú »óÅÂÈ¿°úÀÇ ½ºÅ³ ½ÃÀÛ ½Ã°£ÀÌ °°¾Æ¾ß ÇÑ´Ù.. if (pProjectile) projectileSkillStartTime = pProjectile->GetSkillStartTime(); //½ºÅ³ »ç¿ëÀÚ°¡ °°°í, ½ºÅ³ÀÌ °°Àº °æ¿ì¸¸ HitCount°¨¼Ò if (pSkillInfo->hSkillUser && pSkillInfo->hSkillUser == m_ParentSkillInfo.hSkillUser && pSkillInfo->iSkillID == m_ParentSkillInfo.iSkillID && pSkillInfo->iLevel == m_ParentSkillInfo.iLevel && m_SkillStartTime == projectileSkillStartTime) { if (m_bActivated == false && m_nHitLimitCount >= 0) { m_nHitLimitCount--; if (m_nHitLimitCount <= 0) { m_bActivated = true; m_nHitLimitCount = 0; } } } } } #endif // _GAMESERVER #if defined(PRE_ADD_PREFIX_SYSTE_RENEW) void CDnComboDamageLimitBlow::AddStateEffectValue(const char* szOrigValue, const char* szAddValue, std::string& szNewValue) { char szBuff[128] = {0, }; szNewValue = szOrigValue; } void CDnComboDamageLimitBlow::RemoveStateEffectValue(const char* szOrigValue, const char* szAddValue, std::string& szNewValue) { char szBuff[128] = {0, }; szNewValue = szOrigValue; } #endif // PRE_ADD_PREFIX_SYSTE_RENEW