#include "StdAfx.h" #include "DnUsingSkillWhenDieBlow.h" #include "DnMonsterActor.h" #include "DnInvincibleBlow.h" #ifdef _DEBUG #define new new(_NORMAL_BLOCK,__FILE__,__LINE__) #endif CDnUsingSkillWhenDieBlow::CDnUsingSkillWhenDieBlow( DnActorHandle hActor, const char* szValue ) : CDnBlow( hActor ), m_bUsedDieSkill( false ), m_bDead( false ) { m_StateBlow.emBlowIndex = STATE_BLOW::BLOW_137; SetValue( szValue ); m_fValue = (float)atof( szValue ); } CDnUsingSkillWhenDieBlow::~CDnUsingSkillWhenDieBlow( void ) { } #ifdef _GAMESERVER bool CDnUsingSkillWhenDieBlow::CanBegin( void ) { bool bResult = true; // ½ºÅ³À» °®°í ÀÖÁö ¾Ê´Ù¸é »óÅÂÈ¿°ú¸¦ ¹Ù·Î ³¡³½´Ù. DnSkillHandle hSkill = m_hActor->FindSkill( (int)m_fValue ); if( !hSkill ) { OutputDebug( "CDnUsingSkillWhenDieBlow::CanBegin - Don't have skill\n" ); bResult = false; } return bResult; } #endif void CDnUsingSkillWhenDieBlow::OnBegin( LOCAL_TIME LocalTime, float fDelta ) { _ASSERT( m_hActor->IsMonsterActor() && "Á×À¸¸é¼­ ƯÁ¤ ½ºÅ³ »ç¿ëÇÏ´Â »óÅÂÈ¿°ú´Â ¸ó½ºÅ͸¸ °¡´ÉÇÕ´Ï´Ù." ); if( false == m_hActor->IsMonsterActor() ) SetState( STATE_BLOW::STATE_END ); // hp °¡ 0 ÀÎÁö ¾Æ´ÑÁö ÆÇ´ÜÇØ¼­ Á×Àº °æ¿ì¶ó¸é °ÔÀÓ¼­¹ö¿¡¼­ // CDnActor::Die() È£ÃâµÉ ¶§ hp 1 ·Î º¹±¸ ½ÃÄÑÁÖ°í ÇÔ¼ö 󸮸¦ À¯¿¹½ÃŲ´Ù. // »ç¿ëµÈ ½ºÅ³ÀÌ Á¾·áµÇ¸é ±×¶§ Á×ÀδÙ.. // Á×Àº ½ÃÁ¡ºÎÅÍ ¹«Àû »óÅÂÈ¿°ú Àû¿ë.. OutputDebug( "CDnUsingSkillWhenDieBlow::OnBegin\n"); } void CDnUsingSkillWhenDieBlow::OnDie( void ) { // ¼­¹ö Ŭ¶ó µ¿ÀÏÇÏ°Ô Á×Àº ½ÃÁ¡ºÎÅÍ ¹«Àû »óÅÂÈ¿°ú Àû¿ë.. m_hActor->SetHP( 1 ); m_bDead = true; // °ÔÀÓ¼­¹ö¿¡¼­ hp ¸¦ 1·Î ÁöÁ¤Çϰí, ÁöÁ¤µÈ ½ºÅ³À» ½ÇÇà. // ¸ó½ºÅÍ ai ´Â Á¤Áö½ÃŲ´Ù. #ifdef _GAMESERVER CDnMonsterActor* pMonsterActor = static_cast(m_hActor.GetPointer()); pMonsterActor->SetAIState( MAAiReceiver::Disable ); m_hActor->CmdAddStateEffect( NULL, STATE_BLOW::BLOW_069, 0, "10", false , false); m_hActor->CmdAddStateEffect( NULL, STATE_BLOW::BLOW_099, -1, "", false, false ); #endif } void CDnUsingSkillWhenDieBlow::Process( LOCAL_TIME LocalTime, float fDelta ) { CDnBlow::Process( LocalTime, fDelta ); #ifdef _GAMESERVER if( m_bDead ) { #endif if( false == m_bUsedDieSkill ) { // Á×À¸¸é¼­ ½ºÅ³ÀÌ »ç¿ëµÇ¾ú´ÂÁö üũÇÑ´Ù. // ½ºÅ³ »ç¿ëÀº Stand ¾×¼ÇÀÏ ¶§ »ç¿ëÇϵµ·Ï ±âÁØÀ» Á¤ÇÑ´Ù. DnSkillHandle hSkill = m_hActor->GetProcessSkill(); if( hSkill && (hSkill->GetClassID() == (int)m_fValue) ) { m_bUsedDieSkill = true; } #ifdef _GAMESERVER else { // °øÁß¿¡¼­ ½ºÅ³À» »ç¿ëÇÏ°Ô µÇ´Â °æ¿ì´Â ÀÏ´Ü ±¸ÇöÇØ³õ°í º¸µµ·Ï ÇÏÀÚ. // ¾Æ¸¶µµ ¶¥¿¡ ÂøÁöÇÒ ‹š ±îÁö ½ºÅ³ »ç¿ëÀ» À¯º¸ÇؾßÇÒ µí. if( strstr( m_hActor->GetCurrentAction(), "Stand") ) { m_hActor->UseSkill( (int)m_fValue, false ); //#44884 ¸ó½ºÅÍÀÇ DieSkill »ç¿ë½Ã ¼­¹ö/Ŭ¶óÀÌ¾ðÆ® µ¿±âÈ­ ¹®Á¦ ¹ß»ý //Ŭ¶óÀÌ¾ðÆ®¿¡¼­ üũ°¡ µÇÁö ¾Ê´Â °æ¿ì°¡ ¹ß»ýÇÔ. //¼­¹ö¿¡¼­ ½ºÅ³ »ç¿ëÇϰí Ŭ¶óÀÌ¾ðÆ®·Î µ¿±âÈ­ ÆÐŶ º¸³¿.. //±âÁ¸ »óÅÂÈ¿°ú ShowStateEffect ÇÔ¼ö¸¦ ÀÌ¿ë Çϵµ·Ï.. BYTE pBuffer[128]; CPacketCompressStream Stream( pBuffer, 128 ); DWORD dwUniqueID = m_hActor ? m_hActor->GetUniqueID() : -1; STATE_BLOW::emBLOW_INDEX blowIndex = STATE_BLOW::BLOW_137; bool bShowEffect = true; Stream.Write( &dwUniqueID, sizeof(dwUniqueID) ); Stream.Write( &blowIndex, sizeof(blowIndex)); Stream.Write( &bShowEffect, sizeof(bShowEffect)); m_hActor->Send(eActor::SC_SHOW_STATE_EFFECT, &Stream); } else if( !m_hActor->IsAir() ) { m_hActor->CmdAction("Stand"); } } #endif } if( m_bUsedDieSkill ) { // HP ¸¦ 0 À¸·Î ¸¸µé°í Á×´Â ¾×¼Ç ³ª¿À¸é¼­ °´Ã¼ »èÁ¦. // HP °¡ 0 ÀÌ µÇ¸é, ProcessDie ¿¡¼­ destroy °¡ ¼ÂÆÃµÈ´Ù. if( false == m_hActor->IsProcessSkill() ) { m_hActor->SetActionQueue( "Die" ); m_hActor->SetHP( 0 ); #if defined(PRE_FIX_44884) //ÃÖÁ¾ÀûÀ¸·Î ¿©±â¿¡¼­ OnDie¸¦ È£Ãâ ÇÑ´Ù.. //Ŭ¶óÀÌ¾ðÆ® CDnActor::OnDie°¡ protected·Î ¼±¾ð µÇ¾î À־ //ÀÌ »óÅÂÈ¿°ú´Â ¸ó½ºÅÍ ¾×Å͸¸ µ¿ÀÛ ÇÏ´Â ¼³Á¤À̶ó ¸ó½ºÅÍ ¾×ÅͷΠij½ºÆÃ ÇØ¼­ OnDieÈ£Ãâ ÇÑ´Ù. CDnMonsterActor* pMonsterActor = static_cast(m_hActor.GetPointer()); if (pMonsterActor) pMonsterActor->OnDie(m_FinalHitterActor); SetState(STATE_BLOW::STATE_END); #endif // PRE_FIX_44884 #ifndef _GAMESERVER m_hActor->SetDieDelta( 3.0f ); #endif } } #ifdef _GAMESERVER } #endif } void CDnUsingSkillWhenDieBlow::OnEnd( LOCAL_TIME LocalTime, float fDelta ) { OutputDebug( "CDnUsingSkillWhenDieBlow::OnEnd\n"); } #if defined(PRE_ADD_PREFIX_SYSTE_RENEW) void CDnUsingSkillWhenDieBlow::AddStateEffectValue(const char* szOrigValue, const char* szAddValue, std::string& szNewValue) { char szBuff[128] = {0, }; szNewValue = szOrigValue; } void CDnUsingSkillWhenDieBlow::RemoveStateEffectValue(const char* szOrigValue, const char* szAddValue, std::string& szNewValue) { char szBuff[128] = {0, }; szNewValue = szOrigValue; } #endif // PRE_ADD_PREFIX_SYSTE_RENEW