#include "StdAfx.h" #include "DnPoisonExplosionBlow.h" #include "DnMonsterActor.h" #include "EtActionSignal.h" #ifdef _DEBUG #define new new(_NORMAL_BLOCK,__FILE__,__LINE__) #endif #define POISON_EXPLOSION_ACTION_NAME "Hit_Poison" CDnPoisonExplosionBlow::CDnPoisonExplosionBlow( DnActorHandle hActor, const char* szValue ) : CDnBlow( hActor ), m_pActionElement( NULL ), m_fFrame( 0.0f ) #ifdef _GAMESERVER ,m_iOriAttackMMin( 0 ), m_iOriAttackMMax( 0 ) #endif { m_StateBlow.emBlowIndex = STATE_BLOW::BLOW_115; SetValue( szValue ); m_fValue = (float)atof(szValue); m_pActionElement = m_hActor->GetElement( POISON_EXPLOSION_ACTION_NAME ); _ASSERT( m_pActionElement && "Áßµ¶ Æø¹ß ¾×¼Ç Á¤º¸¸¦ ãÀ» ¼ö ¾øÀ½." ); m_ActionDurationTime = 0; if (m_pActionElement) { m_ActionDurationTime = m_pActionElement->dwLength; m_vlpSignalList = m_pActionElement->pVecSignalList; } } CDnPoisonExplosionBlow::~CDnPoisonExplosionBlow(void) { } bool CDnPoisonExplosionBlow::CanBegin( void ) { // Áßµ¶ »óÅÂÈ¿°ú°¡ °É·ÁÀÖ´Â »óŰ¡ ¾Æ´Ï¶ó¸é ½ÃÀÛµÉ ¼ö ¾ø´Ù. bool bCanBegin = m_hActor->IsAppliedThisStateBlow( STATE_BLOW::BLOW_044 ) || m_hActor->IsAppliedThisStateBlow( STATE_BLOW::BLOW_136 ); // µ¿»ó »óÅÂÈ¿°úµµ Á¦°Å. (#27838); if( false == bCanBegin ) OutputDebug( "CDnPoisonExplosionBlow::CanBegin - Áßµ¶ »óÅÂÈ¿°ú°¡ °É·ÁÀÖÁö ¾ÊÀ¸¹Ç·Î Áßµ¶ Æø¹ß »óÅÂÈ¿°ú ¹ßµ¿ ½ÇÆÐ.\n" ); // Æø¹ß ¾×¼Ç ¾øÀ» ¶© ¹ßµ¿½ÃŰÁö ¾Ê´Â´Ù. if( NULL == m_pActionElement ) { bCanBegin = false; OutputDebug( "CDnPoisonExplosionBlow::CanBegin - Áßµ¶ Æø¹ß ¾×¼ÇÀÌ ¾øÀ¸¹Ç·Î Áßµ¶ Æø¹ß »óÅÂÈ¿°ú ¹ßµ¿ ½ÇÆÐ.\n" ); } return bCanBegin; } void CDnPoisonExplosionBlow::OnBegin( LOCAL_TIME LocalTime, float fDelta ) { // Áßµ¶ »óÅÂÈ¿°ú ÇØÁ¦ #ifdef _GAMESERVER if( m_hActor->IsAppliedThisStateBlow( STATE_BLOW::BLOW_044 ) ) m_hActor->CmdRemoveStateEffect( STATE_BLOW::BLOW_044 ); if( m_hActor->IsAppliedThisStateBlow( STATE_BLOW::BLOW_136 ) ) m_hActor->CmdRemoveStateEffect( STATE_BLOW::BLOW_136 ); #endif // ÀÌ »óÅÂÈ¿°ú°¡ ³¢¾îÀÖ´Â ½ºÅ³ÀÇ ½ÃÀüÀÚÀÇ ¸¶¹ý °ø°Ý·ÂÀ¸·Î »óÅÂÈ¿°ú°¡ Àû¿ëµÈ ¾×ÅÍÀÇ ¸¶¹ý°ø°Ý·ÂÀ» Áö¼Ó½Ã°£ µ¿¾È ´ëü½ÃÅ´. #ifdef _GAMESERVER _ASSERT( m_ParentSkillInfo.hSkillUser ); if( !m_ParentSkillInfo.hSkillUser ) { g_Log.Log( LogType::_ERROR, L"CDnPoisonExplosionBlow::OnBegin - Áßµ¶ Æø¹ß »óÅÂÈ¿°ú ¾×ÅͰ¡ À¯È¿ÇÏÁö ¾Ê¾Æ¼­ ¹ßµ¿ ½ÇÆÐ..\n" ); SetState( STATE_BLOW::STATE_END ); return; } m_iOriAttackMMin = m_hActor->GetAttackMMin(); m_iOriAttackMMax = m_hActor->GetAttackMMax(); m_hActor->SetAttackMMin( m_ParentSkillInfo.hSkillUser->GetAttackMMin() ); m_hActor->SetAttackMMax( m_ParentSkillInfo.hSkillUser->GetAttackMMax() ); // ¸ó½ºÅͶó¸é Ŭ¶ó¿¡¼­ µ¥¹ÌÁö Ç¥½Ã¸¦ À§ÇØ ¼ÂÆÃ. if( m_hActor && CDnActorState::Reserved6 < m_hActor->GetActorType() ) static_cast(m_hActor.GetPointer())->SlaveOf( m_ParentSkillInfo.hSkillUser->GetUniqueID() ); #endif // Áö¼Ó½Ã°£Àº Æø¹ß ¾×¼ÇÀÇ Áö¼Ó½Ã°£À¸·Î ó¸®ÇÑ´Ù. float fFPS = 60.0f; //m_StateBlow.fDurationTime = (float)m_pActionElement->dwLength / fFPS; m_StateBlow.fDurationTime = m_ActionDurationTime != 0 ? (float)m_ActionDurationTime / fFPS : 0.0f; // ¹Ù·Î Á¾·á°¡ µÉ ¼ö ÀÖÀ¸¹Ç·Î Á¤»ó »óÅÂÀ϶§¸¸ Ãß°¡ if (STATE_BLOW::STATE_BEGIN == GetBlowState()) m_hActor->AddStateBlowSignal(this->GetMySmartPtr()); OutputDebug( "CDnPoisonExplosionBlow::OnBegin\n" ); } void CDnPoisonExplosionBlow::Process( LOCAL_TIME LocalTime, float fDelta ) { CDnBlow::Process( LocalTime, fDelta ); } void CDnPoisonExplosionBlow::OnEnd( LOCAL_TIME LocalTime, float fDelta ) { #ifdef _GAMESERVER m_hActor->SetAttackMMin( m_iOriAttackMMin ); m_hActor->SetAttackMMax( m_iOriAttackMMax ); // ¸ó½ºÅͶó¸é Ŭ¶ó¿¡¼­ µ¥¹ÌÁö Ç¥½Ã¸¦ À§ÇØ ¼ÂÆÃÇÑ °Í ¿ø»ó º¹±¸. //if( CDnActorState::Reserved6 < m_hActor->GetActorType() ) if( m_hActor && m_hActor->IsMonsterActor() ) { DWORD dwInvalidMasterActorID = UINT_MAX; static_cast(m_hActor.GetPointer())->SlaveOf( dwInvalidMasterActorID ); } #endif m_hActor->RemoveStateBlowSignal(this->GetMySmartPtr()); OutputDebug( "CDnPoisonExplosionBlow::OnEnd\n" ); } //#ifdef _GAMESERVER // //#endif void CDnPoisonExplosionBlow::SignalProcess( LOCAL_TIME LocalTime, float fDelta ) { // ½ÇÁ¦ ¾×¼ÇÀ» ½ÇÇàÇÏÁö ¾Ê°í ½Ã±×³Îµé¸¸ ½ÇÇà½Ã۵µ·Ï ÇÑ´Ù. float fFPS = 60.0f; float fPrevFrame = m_fFrame; m_fFrame += (fDelta * fFPS); //if(m_pActionElement->dwLength < (DWORD)m_fFrame ) if (m_ActionDurationTime < (DWORD)m_fFrame) { m_fFrame = 1.0f; fPrevFrame = -0.1f; // ¾×¼ÇÀ» ´Ù ½ÇÇàÇß´Ù¸é ´õ ÀÌ»ó ½Ã±×³Î 󸮸¦ ÇÏÁö ¾Ê°í »óÅÂÈ¿°ú°¡ ³¡³­´Ù. // ¾×¼Ç ±æÀÌ ¸¸Å­ Áö¼Ó½Ã°£À» ¼³Á¤ÇßÀ¸¹Ç·Î °ð »óÅÂÈ¿°ú Á¾·áµÊ. return; } if( 0.0f == fPrevFrame ) fPrevFrame = -(m_fFrame * 0.1f); CEtActionSignal *pSignal = NULL; #if defined(PRE_FIX_55378) m_hActor->SetChargerAction(POISON_EXPLOSION_ACTION_NAME); #endif // PRE_FIX_55378 #if defined(PRE_FIX_62309) #if defined(_GAMESERVER) //#62309 //½Ã±×³Î ÇÁ·Î¼¼¼­ µ¹¸é¼­ OnSignal·Î Hit½Ã ¼Ó¼ºÀÌ ¼³Á¤µÇÁö ¾ÊÀ» ¼ö ÀÖ´Ù. //½Ã±×³Î ÇÁ·Î¼¼¼­ È£ÃâÀü¿¡ °­Á¦¼Ó¼ºÀ» ¼³Á¤ ÇØ ³õ°í, Hit½Ã±×³Î 󸮽ÿ¡ ¼³Á¤µÈ ¼Ó¼º°ªÀ¸·Î //°­Á¦¼³Á¤ Çϵµ·Ï ÇÑ´Ù.. m_hActor->PushForceHitElement(m_ParentSkillInfo.eSkillElement); #endif // _GAMESERVER #endif // PRE_FIX_62309 //for( DWORD i=0; i < m_pActionElement->pVecSignalList.size(); i++ ) for( DWORD i=0; i < m_vlpSignalList.size(); i++ ) { //pSignal = m_pActionElement->pVecSignalList[i]; pSignal = m_vlpSignalList[i]; if( pSignal->CheckSignal( fPrevFrame, m_fFrame ) == true ) { LOCAL_TIME StartTime = LocalTime - (LOCAL_TIME)( 1000.f / fFPS * ( m_fFrame - pSignal->GetStartFrame() ) ); LOCAL_TIME EndTime = LocalTime + (LOCAL_TIME)( 1000.f / fFPS * ( pSignal->GetEndFrame() - m_fFrame ) ); m_hActor->OnSignal( (SignalTypeEnum)pSignal->GetSignalIndex(), pSignal->GetData(), LocalTime, StartTime, EndTime, pSignal->GetSignalListArrayIndex() ); } } #if defined(PRE_FIX_62309) #if defined(_GAMESERVER) m_hActor->PopForceHitElement(); #endif // _GAMESERVER #endif // PRE_FIX_62309 #if defined(PRE_FIX_55378) m_hActor->SetChargerAction(NULL); #endif // PRE_FIX_55378 } #if defined(PRE_ADD_PREFIX_SYSTE_RENEW) void CDnPoisonExplosionBlow::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 CDnPoisonExplosionBlow::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