#include "StdAfx.h" #include "DnFrostbiteBlow.h" #include "DnFrameBlow.h" #include "DnBasicBlow.h" #include "DnTableDB.h" #include "DnMonsterActor.h" #include "DnWorld.h" #ifdef _GAMESERVER #include "DnGameRoom.h" #include "DnGameDataManager.h" #include "DnUserSession.h" #endif #if !defined( USE_BOOST_MEMPOOL ) #ifdef _DEBUG #define new new(_NORMAL_BLOCK,__FILE__,__LINE__) #endif #endif // #if !defined( USE_BOOST_MEMPOOL ) CDnFrostbiteBlow::CDnFrostbiteBlow( DnActorHandle hActor, const char* szValue ) : CDnBlow( hActor ), m_fFrameBlowArg( 0.0f ), m_pMoveSpeedBlow( NULL ), m_pIceDefenseBlow( NULL ), m_bNestMap( false ) { m_StateBlow.emBlowIndex = STATE_BLOW::BLOW_144; SetValue( szValue ); m_fValue = 0.0f; #ifdef _GAMESERVER CDNGameRoom* pGameRoom = static_cast(m_hActor->GetRoom()); if( false == pGameRoom->bIsPvPRoom() ) { UINT uiSessionID = 0; pGameRoom->GetLeaderSessionID( uiSessionID ); CDNUserSession *pUserSession = pGameRoom ? pGameRoom->GetUserSession(uiSessionID) : NULL; if( pUserSession ) { const TMapInfo* pMapData = g_pDataManager->GetMapInfo( pUserSession->GetMapIndex() ); if( pMapData ) #if defined(PRE_ADD_DRAGON_FELLOWSHIP) m_bNestMap = CDnBlow::CheckEffectIgnoreMapType(pMapData->MapType, pMapData->MapSubType); #else // #if defined(PRE_ADD_DRAGON_FELLOWSHIP) m_bNestMap = (GlobalEnum::MAP_DUNGEON == pMapData->MapType) && ((GlobalEnum::MAPSUB_NEST == pMapData->MapSubType) ||(GlobalEnum::MAPSUB_NESTNORMAL == pMapData->MapSubType)); #endif // #if defined(PRE_ADD_DRAGON_FELLOWSHIP) } } #else #if defined(PRE_ADD_DRAGON_FELLOWSHIP) m_bNestMap = CDnBlow::CheckEffectIgnoreMapType(); #else // #if defined(PRE_ADD_DRAGON_FELLOWSHIP) CDnWorld* pWorld = CDnWorld::GetInstancePtr(); m_bNestMap = (CDnWorld::MapTypeEnum::MapTypeDungeon == pWorld->GetMapType()) && ((CDnWorld::MapSubTypeEnum::MapSubTypeNest == pWorld->GetMapSubType() || CDnWorld::MapSubTypeEnum::MapSubTypeNestNormal == pWorld->GetMapSubType())); #endif // #if defined(PRE_ADD_DRAGON_FELLOWSHIP) #endif string strValue( szValue ); std::vector vlTokens; TokenizeA( strValue, vlTokens, ";" ); // ÀÎÀÚ´Â 3°³¸¦ ¹Þ´Â´Ù. À̵¿ ¼Óµµ / ÇÁ·¹ÀÓ Áõ°¨ / ³Ã±â ÀúÇ× Áõ°¨ % ÀÓ. ¸ðµÎ (1.0f -> 100%) bool bValidArgument = (3 == (int)vlTokens.size()); _ASSERT( bValidArgument && "¾óÀ½ °¨¿Á »óÅÂÈ¿°ú ÀÎÀÚ ¼ÂÆÃÀÌ À߸øµÇ¾ú½À´Ï´Ù." ); if( bValidArgument ) { string strMoveSpeedArg = vlTokens.at( 0 ); string strFrameBlowArg = vlTokens.at( 1 ); string strIceDefenseArg = vlTokens.at( 2 ); m_pIceDefenseBlow = new CDnBasicBlow( hActor, strIceDefenseArg.c_str() ); m_pIceDefenseBlow->SetBlow( STATE_BLOW::BLOW_037 ); //bool bIgnoreActionEffect = false; if( m_bNestMap ) { // #27679 ³×ÀÓµå, º¸½º, 8ÀÎ ³×½ºÆ®º¸½º¿¡°Ô´Â È¿°ú´Â Àû¿ëµÇ³ª ½ÇÁ¦·Î °áºùÀÇ ºÎ°¡È¿°ú°¡ Àû¿ëµÇÁø ¾Ê´Â´Ù. bool bBossMonster = true; if( m_hActor->IsMonsterActor() ) { CDnMonsterActor* pMonsterActor = static_cast(m_hActor.GetPointer()); if( (CDnMonsterState::Boss == pMonsterActor->GetGrade() || CDnMonsterState::BossHP4 == pMonsterActor->GetGrade() || CDnMonsterState::NestBoss == pMonsterActor->GetGrade() || CDnMonsterState::NestBoss8 == pMonsterActor->GetGrade()) ) { m_pMoveSpeedBlow = NULL; bBossMonster = true; m_bIgnoreEffectAction = true; // ³Ã±â ÀúÇ× °¨¼Ò´Â ³×ÀÓµå±Þ ÀÌ»óÀÇ ¸÷¿¡°Ôµµ Àû¿ë½ÃÅ´.. } } } // #51048 »óÅÂÈ¿°ú°¡ ÀÖ´Â °æ¿ì ³×½ºÆ® ³×ÀÓµå±Þ ¸ó½ºÅ͵é°ú µ¿ÀÏÇÑ Ãë±ÞÀ» ¹Þ´Â´Ù. // µ¶¸³ÀûÀ¸·Î »óÅÂÈ¿°ú°¡ ¹ÚÈ÷´Â °ÍÀ̹ǷΠ¸Ê°ú °ü°è ¾ø´Ù. if( m_hActor->IsAppliedThisStateBlow(STATE_BLOW::BLOW_235) ) { m_bIgnoreEffectAction = true; } if( false == m_bIgnoreEffectAction ) { // ÀÏ¹Ý ´øÀü¿¡¼­´Â »ó°ü¾øÀÌ µ¿»óÀÇ ¸ðµç È¿°ú°¡ ´Ù µé¾î°¨. m_pMoveSpeedBlow = new CDnBasicBlow( hActor, strMoveSpeedArg.c_str() ); m_pMoveSpeedBlow->SetBlow( STATE_BLOW::BLOW_076 ); // À̵¿¼Óµµ º¯È­ ºñÀ². m_fFrameBlowArg = (float)atof( strFrameBlowArg.c_str() ); } } } CDnFrostbiteBlow::~CDnFrostbiteBlow( void ) { SAFE_DELETE( m_pMoveSpeedBlow ); SAFE_DELETE( m_pIceDefenseBlow ); } void CDnFrostbiteBlow::OnBegin( LOCAL_TIME LocalTime, float fDelta ) { // µ¿»ó Áö¼Ó½Ã°£ = <È¿°úÁö¼Ó½Ã°£> * ( 1 - ¹°¼Ó¼º³»¼º * »óź¸Àü weight °ª ) float fGlobalStateEffectWeight = CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::StateRevision ); float fIceResistance = m_hActor->GetElementDefense(CDnState::Ice); // Áö¼Ó½Ã°£À» ³»¼º¿¡ µû¶ó ÁÙ¿©ÁØ´Ù. m_StateBlow.fDurationTime = m_StateBlow.fDurationTime * (1.0f - fIceResistance*fGlobalStateEffectWeight); if( m_pMoveSpeedBlow ) { m_pMoveSpeedBlow->SetParentSkillInfo(&m_ParentSkillInfo); // »ç½Ç Æ÷ÇԵǾî ÀÖ´Â »óÅÂÈ¿°úµéÀº ÀÌ °´Ã¼¿Í ¿î¸íÀ» °°ÀÌ ÇÏ±â ‹š¹®¿¡ Áö¼Ó½Ã°£À» »ç¿ëÇÏÁø ¾ÊÁö¸¸ // Á¤È®ÇÏ°Ô ¸ÂÃçÁÖ±â À§ÇØ Áö¼Ó½Ã°£À» ¼ÂÆÃÇØÁØ´Ù. m_hActor->UpdateFPS(); m_pMoveSpeedBlow->SetDurationTime( m_StateBlow.fDurationTime ); m_pMoveSpeedBlow->OnBegin( LocalTime, fDelta ); } if( m_pIceDefenseBlow ) { m_pIceDefenseBlow->SetParentSkillInfo(&m_ParentSkillInfo); m_pIceDefenseBlow->SetDurationTime( m_StateBlow.fDurationTime ); m_pIceDefenseBlow->OnBegin( LocalTime, fDelta ); } #ifdef _GAMESERVER #ifdef PRE_MOD_FROSTBITE_EXCEPTION // ¾ÆÀ̽ÃÇÁ·¢¼Ç¿¡¼­ °­Á¦·Î ´À·ÁÁö°ÔÇÑ 25, 76¹ø »óÅÂÈ¿°ú¸¦ Á¦°ÅÇÔ // ³ªÁß¿¡ ¾ÆÀ̽ÃÇÁ·¢¼Ç °ü·ÃÇØ¼­ ¼öÁ¤ÇÒ ¶§ °í·ÁÇÒ °Í! DNVector( DnBlowHandle ) vlFrameSpeedBlow; m_hActor->GatherAppliedStateBlowByBlowIndex( STATE_BLOW::BLOW_025, vlFrameSpeedBlow ); for( DWORD n=0; nGetParentSkillInfo()->iSkillID == 2212 ) m_hActor->CmdRemoveStateEffectFromID( vlFrameSpeedBlow[n]->GetBlowID() ); } DNVector( DnBlowHandle ) vlMoveSpeedBlow; m_hActor->GatherAppliedStateBlowByBlowIndex( STATE_BLOW::BLOW_076, vlMoveSpeedBlow ); for( DWORD n=0; nGetParentSkillInfo()->iSkillID == 2212 ) m_hActor->CmdRemoveStateEffectFromID( vlMoveSpeedBlow[n]->GetBlowID() ); } #endif // PRE_MOD_FROSTBITE_EXCEPTION // Ŭ¶óÀÌ¾ðÆ®¿¡°Ôµµ ÀÌ »óÅÂÈ¿°úÀÇ Áö¼Ó½Ã°£À» ¹æ±Ý ¾÷µ¥ÀÌÆ® µÈ °ÍÀ¸·Î ¹Ù²ãÁØ´Ù. // PVP °°Àº º¸Á¤Å×ÀÌºí °ªÀ» ÂüÁ¶¹Þ´Â °æ¿ì , ¼­¹ö¿Í Ŭ¶óÀ̾ðÆ®ÀÇ µ¿±â°¡ Ʋ¾îÁö´Â°æ¿ì°¡ »ý±ä´Ù. m_hActor->CmdModifyStateEffect( GetBlowID(), m_StateBlow ); #endif OutputDebug( "CDnFrostbiteBlow::OnBegin Value:%2.2f\n", m_fValue ); } void CDnFrostbiteBlow::OnDuplicate( const STATE_BLOW& StateBlowInfo ) { // MoveSpeedBlow °¡ NULL ÀÌ¸é ³×ÀÓµå±Þ ÀÌ»ó º¸½º. if( m_pMoveSpeedBlow ) { m_hActor->UpdateFPS(); m_pMoveSpeedBlow->Duplicate( StateBlowInfo ); } if( m_pIceDefenseBlow ) m_pIceDefenseBlow->Duplicate( StateBlowInfo ); } void CDnFrostbiteBlow::Process( LOCAL_TIME LocalTime, float fDelta ) { CDnBlow::Process( LocalTime, fDelta ); if( m_pMoveSpeedBlow ) m_pMoveSpeedBlow->Process( LocalTime, fDelta ); if( m_pIceDefenseBlow ) m_pIceDefenseBlow->Process( LocalTime, fDelta ); } void CDnFrostbiteBlow::OnEnd( LOCAL_TIME LocalTime, float fDelta ) { if( m_pMoveSpeedBlow ) { // Á¦Çѽð£ÀÌ Á¤ÇØÁ® ÀÖÁö ¾ÊÀ» °æ¿ì STATE_DURATION À¸·Î µÇ¾îÀÖ´Â °æ¿ì°¡ À־ UpdateFPS() ¿¡¼­ À¯È¿ÇÑ »óÅÂÈ¿°ú·Î // ºÐ·ùµÇ¾î ÇÁ·¹ÀÓ ¼Óµµ°ªÀÌ Àû¿ëµÇ¾î ¹ö¸®´Â °æ¿ì°¡ »ý±è. SetState( STATE_BLOW::STATE_END ); m_hActor->UpdateFPS(); m_pMoveSpeedBlow->OnEnd( LocalTime, fDelta ); } if( m_pIceDefenseBlow ) m_pIceDefenseBlow->OnEnd( LocalTime, fDelta ); OutputDebug( "CDnFrostbiteBlow::OnEnd Value:%2.2f\n", m_fValue ); } #if defined(PRE_ADD_PREFIX_SYSTE_RENEW) void CDnFrostbiteBlow::AddStateEffectValue(const char* szOrigValue, const char* szAddValue, std::string& szNewValue) { char szBuff[128] = {0, }; //ÆÄ½Ì¿¡ ÇÊ¿äÇÑ º¯¼ö ¼±¾ð std::vector vlTokens[2]; string strArgument[2]; //ÇÊ¿äÇÑ °ª º¯¼ö float fMoveSpeed[2] = {0.0f, }; float fFrame[2] = {0.0f, }; float fIceDefense[2] = {0.0f, }; ////////////////////////////////////////////////////////////////////////// //ù¹øÂ° ¹®ÀÚ¿­ ÆÄ½Ì. strArgument[0] = szOrigValue; TokenizeA( strArgument[0], vlTokens[0], ";" ); if( vlTokens[0].size() == 3 ) { fMoveSpeed[0] = (float)atof( vlTokens[0][0].c_str() ); fFrame[0] = (float)atof( vlTokens[0][1].c_str() ); fIceDefense[0] = (float)atof( vlTokens[0][2].c_str() ); } ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// //µÎ¹øÂ° ¹®ÀÚ¿­ ÆÄ½Ì strArgument[1] = szAddValue; TokenizeA( strArgument[1], vlTokens[1], ";" ); if( vlTokens[1].size() == 3 ) { fMoveSpeed[1] = (float)atof( vlTokens[1][0].c_str() ); fFrame[1] = (float)atof( vlTokens[1][1].c_str() ); fIceDefense[1] = (float)atof( vlTokens[1][2].c_str() ); } ////////////////////////////////////////////////////////////////////////// //µÎ °ªÀ» ´õÇÑ´Ù. float fResultMoveSpeed = fMoveSpeed[0] + fMoveSpeed[1]; float fResultFrame = fFrame[0] + fFrame[1]; float fResultIceDefence = fIceDefense[0] + fIceDefense[1]; sprintf_s(szBuff, "%f;%f;%f", fResultMoveSpeed, fResultFrame, fResultIceDefence); szNewValue = szBuff; } void CDnFrostbiteBlow::RemoveStateEffectValue(const char* szOrigValue, const char* szAddValue, std::string& szNewValue) { char szBuff[128] = {0, }; //ÆÄ½Ì¿¡ ÇÊ¿äÇÑ º¯¼ö ¼±¾ð std::vector vlTokens[2]; string strArgument[2]; //ÇÊ¿äÇÑ °ª º¯¼ö float fMoveSpeed[2] = {0.0f, }; float fFrame[2] = {0.0f, }; float fIceDefense[2] = {0.0f, }; ////////////////////////////////////////////////////////////////////////// //ù¹øÂ° ¹®ÀÚ¿­ ÆÄ½Ì. strArgument[0] = szOrigValue; TokenizeA( strArgument[0], vlTokens[0], ";" ); if( vlTokens[0].size() == 3 ) { fMoveSpeed[0] = (float)atof( vlTokens[0][0].c_str() ); fFrame[0] = (float)atof( vlTokens[0][1].c_str() ); fIceDefense[0] = (float)atof( vlTokens[0][2].c_str() ); } ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// //µÎ¹øÂ° ¹®ÀÚ¿­ ÆÄ½Ì strArgument[1] = szAddValue; TokenizeA( strArgument[1], vlTokens[1], ";" ); if( vlTokens[1].size() == 3 ) { fMoveSpeed[1] = (float)atof( vlTokens[1][0].c_str() ); fFrame[1] = (float)atof( vlTokens[1][1].c_str() ); fIceDefense[1] = (float)atof( vlTokens[1][2].c_str() ); } ////////////////////////////////////////////////////////////////////////// //µÎ °ªÀ» ´õÇÑ´Ù. float fResultMoveSpeed = fMoveSpeed[0] - fMoveSpeed[1]; float fResultFrame = fFrame[0] - fFrame[1]; float fResultIceDefence = fIceDefense[0] - fIceDefense[1]; sprintf_s(szBuff, "%f;%f;%f", fResultMoveSpeed, fResultFrame, fResultIceDefence); szNewValue = szBuff; } #endif // PRE_ADD_PREFIX_SYSTE_RENEW #if defined(PRE_FIX_51048) void CDnFrostbiteBlow::RemoveDebufAction(LOCAL_TIME LocalTime, float fDelta) { //ÀÌ »óÅÂÈ¿°ú°¡ Àû¿ë µÇ¾î ÀÖ´Â °æ¿ì ¾Æ·¡ º¯¼ö °ªÀ¸·Î CDnActor::UpdateFPSÇÔ¼ö¿¡¼­ Frameº¯°æÀ» Àû¿ë½ÃŲ´Ù. //MoveSpeed»óÅÂÈ¿°ú Á¦°Å µÉ¶§ ÀÌ °ªµµ ÃʱâÈ­°¡ ÇÊ¿ä ÇÏ´Ù. m_fFrameBlowArg = 0.0f; if (m_pMoveSpeedBlow) { m_hActor->UpdateFPS(); m_pMoveSpeedBlow->OnEnd( LocalTime, fDelta ); } SAFE_DELETE(m_pMoveSpeedBlow); } #endif // PRE_FIX_51048