#include "StdAfx.h" #include "DnPlagueBlow.h" #ifdef _DEBUG #define new new(_NORMAL_BLOCK,__FILE__,__LINE__) #endif const LOCAL_TIME PLAGUE_DAMAGE_INTERVAL = 2000; CDnPlagueBlow::CDnPlagueBlow( DnActorHandle hActor, const char* szValue ) : CDnBlow( hActor ), m_IntervalChecker( hActor, GetMySmartPtr() ), m_fDamageProb( 0.f ), m_nPlageProbability( 0 ), m_fDamageAbsolute( 0.f ), m_fPlagueRange( 0.f ), m_fEffectLength( 0.f ), m_bEffecting( false ) #ifdef _GAMESERVER ,m_fIntervalDamage( 0.0f ) #endif { m_StateBlow.emBlowIndex = STATE_BLOW::BLOW_136; SetValue( szValue ); std::vector tokens; TokenizeA( szValue, tokens , ";" ); if( tokens.size() == 2 ) { m_nPlageProbability = 100; m_fDamageProb = (float)atof( tokens[0].c_str() ); m_fPlagueRange = (float)atof( tokens[1].c_str() ); } else if( tokens.size() == 4 ) { m_nPlageProbability = (float)atof( tokens[0].c_str() ) * 100.f; m_fDamageProb = (float)atof( tokens[1].c_str() ); m_fDamageAbsolute = (float)atof( tokens[2].c_str() ); m_fPlagueRange = (float)atof( tokens[3].c_str() ); } #ifdef _GAMESERVER // Àü¿°µÇ¾î¿Â °æ¿ì µ¥¹ÌÁö ºñÀ²ÀÌ 1.0 À» ³ÑÀ» °ÍÀÌ´Ù. ÀÌ °æ¿ì¿£ ±×´ë·Î µ¥¹ÌÁö Àû¿ëÇØÁÖ¸é µÈ´Ù. if( m_fDamageProb < 1.0f ) m_fIntervalDamage = (m_hActor->GetLastDamage() * m_fDamageProb) + m_fDamageAbsolute; else m_fIntervalDamage = m_fDamageProb; #endif #ifndef _GAMESERVER UseTableDefinedGraphicEffect( false ); #endif } CDnPlagueBlow::~CDnPlagueBlow(void) { } #ifdef _GAMESERVER bool CDnPlagueBlow::CanBegin( void ) { return true; } #endif bool CDnPlagueBlow::OnCustomIntervalProcess( void ) { #ifdef _GAMESERVER if( 0.0f < m_fIntervalDamage ) { #if defined(PRE_FIX_61382) DnActorHandle hActor = CDnActor::GetOwnerActorHandle(m_hActor); if (hActor && hActor->IsDie() == false) { m_hActor->RequestDamageFromStateBlow(GetMySmartPtr(), (int)m_fIntervalDamage); } #else if (m_hActor->IsDie() == false) { m_hActor->RequestDamageFromStateBlow(GetMySmartPtr(), (int)m_fIntervalDamage); } #endif // PRE_FIX_61382 } // ÁÖº¯¿¡ ¿Å±æ¸¸ÇÑ ´ë»óÀÌ ÀÖ´ÂÁö ¾Æ±ºÁß¿¡¼­ ã´Â´Ù. // ¿Å±â°Ô µÇ¸é °°Àº µ¥¹ÌÁö·Î 󸮵ǵµ·Ï ÇÑ´Ù. DNVector( DnActorHandle ) vlActorsInRange; CDnActor::ScanActor( m_hActor->GetRoom(), *m_hActor->GetPosition(), m_fPlagueRange, vlActorsInRange ); // °¡Àå °¡±î¿î ´ë»ó¿¡°Ô ¿Å±è. ÀÌ¹Ì Àü¿°º´ »óÅÂÈ¿°ú°¡ °É¸° ´ë»ó¿¡°Ô´Â ¿Å±âÁö ¾Ê´Â´Ù. float fShortestLengthSQ = FLT_MAX; int iNumActorsInRange = (int)vlActorsInRange.size(); DnActorHandle hResultTarget; for( int i = 0; i < iNumActorsInRange; ++i ) { DnActorHandle hActor = vlActorsInRange.at( i ); // ¾Æ±º¿¡°Ô¸¸. if( hActor->GetTeam() == m_hActor->GetTeam() ) { // ÀÌ¹Ì Àü¿°µÈ »óÅÂÀÎ ¾Öµé »©°í. if( false == hActor->IsAppliedThisStateBlow( STATE_BLOW::BLOW_136 ) ) { int iRandVal = _rand(GetRoom()) % 100; if( iRandVal < m_nPlageProbability ) { EtVector3 vLength = *hActor->GetPosition() - *m_hActor->GetPosition(); float fLengthSQ = EtVec3LengthSq( &vLength ); if( fLengthSQ < fShortestLengthSQ ) { fShortestLengthSQ = fLengthSQ; hResultTarget = hActor; break; } } } } } if( hResultTarget ) { // °á°ú·Î ³ª¿Â ¾×ÅͰ¡ ÀÖ´Ù¸é Àü¿°º´ »óÅÂÈ¿°ú Ãß°¡. // °ø°Ý ´çÇØ¼­ °É¸®´Â °Ô ¾Æ´Ï¶ó Àü¿°µÇ´Â °ÍÀ̹ǷΠ°áÁ¤µÈ µ¥¹ÌÁö¸¦ ±×´ë·Î Àü´ÞÇÑ´Ù. char acBuf[ STATE_BLOW_ARGUMENT_MAX_SIZE ] = { 0 }; sprintf_s( acBuf, sizeof(acBuf), "%2.2f;%2.2f", m_fIntervalDamage, m_fPlagueRange ); hResultTarget->CmdAddStateEffect( &m_ParentSkillInfo, m_StateBlow.emBlowIndex, int(m_fOriginalDurationTime*1000.0f), acBuf ); } #else _AttachGraphicEffect(); if( m_hEtcObjectEffect ) { CEtActionBase::ActionElementStruct* pStruct = m_hEtcObjectEffect->GetElement( "Idle" ); if( pStruct ) { m_fEffectLength = (float)pStruct->dwLength / 1000.0f; } _SetDiffuse( 0.0f, 1.0f, 0.0f, 1.0f ); m_bEffecting = true; } #endif return true; } void CDnPlagueBlow::OnBegin( LOCAL_TIME LocalTime, float fDelta ) { #ifdef _GAMESERVER if( m_fIntervalDamage < 1.0f ) { SetState( STATE_BLOW::STATE_END ); OutputDebug( "CDnPlagueBlow::OnBegin - Damage is too small. ( < 1) Plague Fail\n" ); } #endif m_IntervalChecker.OnBegin( LocalTime, PLAGUE_DAMAGE_INTERVAL ); m_fEffectLength = 0.0f; m_bEffecting = false; m_fOriginalDurationTime = m_StateBlow.fDurationTime; } void CDnPlagueBlow::Process( LOCAL_TIME LocalTime, float fDelta ) { CDnBlow::Process( LocalTime, fDelta ); #ifndef _GAMESERVER if( m_bEffecting ) { m_fEffectLength -= fDelta; if( m_fEffectLength < 0.0f ) { m_fEffectLength = 0.0f; _SetDiffuse( 1.0f, 1.0f, 1.0f, 1.0f ); m_bEffecting = false; } } #endif // ³»ºÎ¿¡¼­ Die 󸮰¡ µÇ±â ¶§¹®¿¡ º»ÀÎÀÌ Die µÇ´Â °æ¿ìµµ ÀÖÀ¸¹Ç·Î º»ÀÎÀÇ ÀÌ »óÅÂÈ¿°ú°¡ ¹«È¿È­ µÉ ¼ö ÀÖ´Ù. // µû¶ó¼­ ¸Ç ¸¶Áö¸·¿¡ µÎµµ·ÏÇÑ´Ù. m_IntervalChecker.Process( LocalTime, fDelta ); } void CDnPlagueBlow::OnEnd( LOCAL_TIME LocalTime, float fDelta ) { // LocalTime ÀÌ 0À¸·Î È£ÃâµÇ¸é »èÁ¦, Áßøó¸® µîÀ» À§ÇÑ °­Á¦ Á¾·áÀÓ. if( LocalTime != 0 ) m_IntervalChecker.OnEnd( LocalTime, fDelta ); #ifndef _GAMESERVER _SetDiffuse( 1.0f, 1.0f, 1.0f, 1.0f ); _DetachGraphicEffect(); #endif } #if defined(_GAMESERVER) void CDnPlagueBlow::OnDuplicate( const STATE_BLOW& StateBlowInfo ) { // TODO: ÁßøµÇ¾úÀ» ¶§ ¾î¶»°Ô ÇÒ±î? } #endif #if defined(PRE_ADD_PREFIX_SYSTE_RENEW) void CDnPlagueBlow::AddStateEffectValue(const char* szOrigValue, const char* szAddValue, std::string& szNewValue) { std::string strArgument[2]; strArgument[0] = szOrigValue; strArgument[1] = szAddValue; std::vector vlOriginTokens, vlNewTokens; TokenizeA( strArgument[0], vlOriginTokens, ";" ); TokenizeA( strArgument[1], vlNewTokens, ";" ); if( vlOriginTokens.size() == vlNewTokens.size() ) { std::string strResult; for( DWORD i=0; i vlOriginTokens, vlNewTokens; TokenizeA( strArgument[0], vlOriginTokens, ";" ); TokenizeA( strArgument[1], vlNewTokens, ";" ); if( vlOriginTokens.size() == vlNewTokens.size() ) { std::string strResult; for( DWORD i=0; i