#include "StdAfx.h" #include "DnMaxDamageAddBlow.h" #if !defined( USE_BOOST_MEMPOOL ) #ifdef _DEBUG #define new new(_NORMAL_BLOCK,__FILE__,__LINE__) #endif #endif // #if !defined( USE_BOOST_MEMPOOL ) CDnMaxDamageAddBlow::CDnMaxDamageAddBlow( DnActorHandle hActor, const char* szValue ) : CDnBlow( hActor ) #if !defined(_GAMESERVER) ,m_IntervalChecker( hActor, GetMySmartPtr() ) #endif // _GAMESERVER { m_StateBlow.emBlowIndex = STATE_BLOW::BLOW_160; SetValue( szValue ); m_fValue = (float)atof(szValue); m_fRate = m_fValue; #ifdef _GAMESERVER m_bCalcProb = false; m_bOnDamaged = false; AddCallBackType( SB_ONTARGETHIT ); #else //±âº»ÀûÀ¸·Î ÀÌÆåÆ® Ç¥½Ã ÇÏÁö ¾Êµµ·Ï.. UseTableDefinedGraphicEffect( false ); m_bGraphicEffectShow = false; m_bTrigger = false; #endif } CDnMaxDamageAddBlow::~CDnMaxDamageAddBlow(void) { } void CDnMaxDamageAddBlow::OnBegin( LOCAL_TIME LocalTime, float fDelta ) { __super::OnBegin(LocalTime, fDelta); } void CDnMaxDamageAddBlow::Process( LOCAL_TIME LocalTime, float fDelta ) { CDnBlow::Process( LocalTime, fDelta ); #if defined(_GAMESERVER) //Ç÷¡±× ¸®¼Â m_bCalcProb = m_bOnDamaged = false; #else if (m_bTrigger) { if (m_bGraphicEffectShow) { _AttachGraphicEffect(); if( m_hEtcObjectEffect ) { CEtActionBase::ActionElementStruct* pStruct = m_hEtcObjectEffect->GetElement( "Idle" ); if( pStruct ) m_IntervalChecker.OnBegin( LocalTime, pStruct->dwLength + 1000); } } else { if (m_hEtcObjectEffect) { _DetachGraphicEffect(); m_IntervalChecker.OnEnd(LocalTime, fDelta); } } m_bTrigger = false; } m_IntervalChecker.Process( LocalTime, fDelta ); #endif // _GAMESERVER } void CDnMaxDamageAddBlow::OnEnd( LOCAL_TIME LocalTime, float fDelta ) { __super::OnEnd(LocalTime, fDelta); #if !defined(_GAMESERVER) _DetachGraphicEffect(); #endif // _GAMESERVER } #if defined(_GAMESERVER) bool CDnMaxDamageAddBlow::CalcProb() { bool bExecuteable = false; //½ºÅ³ ÄðŸÀÓ Àû¿ëÇØ¾ßÇÔ.. //ÆÐ½Ãºê ½ºÅ³À϶§¸¸?? DnSkillHandle hSkill; const CDnSkill::SkillInfo* pSkillInfo = GetParentSkillInfo(); if (pSkillInfo) { hSkill = m_hActor->FindSkill(pSkillInfo->iSkillID); if (!hSkill) return bExecuteable; if (CDnSkill::UsingResult::Success != hSkill->CanExecute()) { OutputDebug("%s CanExecute ½ÇÆÐ\n", __FUNCTION__); return bExecuteable; } } else return bExecuteable; //È®·ü °è»ê.. bExecuteable = rand() % 10000 <= (m_fRate * 10000.0f); if (!bExecuteable) { OutputDebug("%s È®·ü °É·¯Áü\n", __FUNCTION__); return bExecuteable; } //Ŭ¶óÀÌ¾ðÆ®¿¡ ÆÐ½ººê ½ºÅ³ ÄðŸÀÓ Àû¿ëÀ» À§ÇØ ÆÐŶ Àü¼Û.. bool isPassiveSkill = CDnSkill::Passive == hSkill->GetSkillType(); if (isPassiveSkill) { BYTE pBuffer[128]; CPacketCompressStream Stream( pBuffer, 128 ); DWORD dwUniqueID = m_hActor ? m_hActor->GetUniqueID() : -1; int nSkillID = hSkill->GetClassID(); Stream.Write( &dwUniqueID, sizeof(dwUniqueID) ); Stream.Write( &nSkillID, sizeof(nSkillID)); m_hActor->Send(eActor::SC_PASSIVESKILL_COOLTIME, &Stream); } if (hSkill) hSkill->OnBeginCoolTime(); return bExecuteable; } void CDnMaxDamageAddBlow::OnTargetHit( DnActorHandle hTargetActor ) { //#30953 1Ÿ 2ų »óȲ ¸·À½. - ¾×ÅͰ¡ Á×¾úÀ¸¸é µ¥¹ÌÁö ó¸® ¾ÈµÇµµ·Ï.. if (!m_hActor || m_hActor->IsDie()) return; if (!hTargetActor || hTargetActor->IsDie()) return; //È®·ü °è»êÀÌ µÇ¾î ÀÖÁö ¾Ê´Ù¸é È®·ü °è»êÀ¸·Î ½ºÅ³ »ç¿ë ¿©ºÎ¸¦ È®ÀÎÇÑ´Ù. if (false == m_bCalcProb) { m_bOnDamaged = CalcProb(); m_bCalcProb = true; if (m_bOnDamaged) { //ÀÌÆåÆ® Ç¥½Ã¿ë ÆÐŶÀ» Àü¼Û.. BYTE pBuffer[128]; CPacketCompressStream Stream( pBuffer, 128 ); DWORD dwUniqueID = m_hActor ? m_hActor->GetUniqueID() : -1; bool bShowEffect = true; Stream.Write( &dwUniqueID, sizeof(dwUniqueID) ); Stream.Write( &m_StateBlow.emBlowIndex, sizeof(m_StateBlow.emBlowIndex)); Stream.Write( &bShowEffect, sizeof(bShowEffect)); m_hActor->Send(eActor::SC_SHOW_STATE_EFFECT, &Stream); } } //»ç¿ë °¡´ÉÇϸé TargetActor¸¦ ¸®½ºÆ®¿¡ Ãß°¡ ÇÑ´Ù. if (m_bOnDamaged) { // [2011/03/09 semozz] // ÃÖ´ë¹°¸®°ø°Ý·Â¿¡¼­ ½ºÅ³¿¡ ÀÇÇÑ Áõ°¡ºÐÀº »©°í ij¸¯ÅÍ¿Í ¾ÆÀÌÅÛ¿¡ ÀÇÇÑ ÃÖ´ë¹°¸®°ø°Ý·ÂÀ» °¡Á®¿Í¾ß ÇÑ´Ù... int nAddDamage = m_hActor->GetAttackPMaxWithoutSkill(); char buffer[65]; _itoa_s(nAddDamage, buffer, 65, 10 ); hTargetActor->CmdAddStateEffect(&m_ParentSkillInfo, STATE_BLOW::BLOW_177, 0, buffer, false, false); } } #else bool CDnMaxDamageAddBlow::OnCustomIntervalProcess( void ) { if (m_hEtcObjectEffect) { _DetachGraphicEffect(); m_IntervalChecker.OnEnd(0, 0.0f); } return true; } void CDnMaxDamageAddBlow::ShowGraphicEffect(bool bShow) { m_bGraphicEffectShow = bShow; m_bTrigger = true; } #endif // _GAMESERVER #if defined(PRE_ADD_PREFIX_SYSTE_RENEW) void CDnMaxDamageAddBlow::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 CDnMaxDamageAddBlow::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