#include "StdAfx.h" #include "DnShockInfectionBlow.h" #include "EtActionSignal.h" #include "DnProjectile.h" #if _GAMESERVER #include "DnGameServerManager.h" #else #include "DnLocalPlayerActor.h" #include "DnInterface.h" #include "DnMainDlg.h" #endif #define SHOCK_INFECTION_ACTION_NAME "Skill_ShockInfection" #if !defined( USE_BOOST_MEMPOOL ) #ifdef _DEBUG #define new new(_NORMAL_BLOCK,__FILE__,__LINE__) #endif #endif // #if !defined( USE_BOOST_MEMPOOL ) CDnShockInfectionBlow::CDnShockInfectionBlow( DnActorHandle hActor, const char* szValue ) : CDnBlow( hActor ) #ifdef _GAMESERVER , m_dwCoolTime(0) , m_LastActivateTime( 0 ) #else , m_pLocalPlayerActor( NULL ) #endif // #ifdef _GAMESERVER { m_StateBlow.emBlowIndex = STATE_BLOW::BLOW_168; SetValue( szValue ); m_fHitApplyPercent = 0.0f; m_fLimitRadius = 0.0f; m_fShockProb = 0.0f; m_nShockDurationTime = 0; SecureZeroMemory( &m_ProjectileSignalInfo, sizeof(m_ProjectileSignalInfo) ); // ÀÎÀÚ°¡ ÃÑ 4°³ÀÓ. // °¨ÀüÈ®·ü;°¨ÀüÁö¼Ó½Ã°£;¹üÀ§;¹ß»çü È÷Æ® ½Ã±×³Î¿¡ Àû¿ëÇÒ µ¥¹ÌÁö% string strValue( szValue ); // ½ºÆ®¸µÀ» °ø¹é´ÜÀ§·Î ºÐÇÒÇÑ ÈÄ std::vector vlTokens; TokenizeA( strValue, vlTokens, ";" ); bool bValidArgument = (4 == (int)vlTokens.size()); _ASSERT( bValidArgument && "°¨Àü ÀüÀÌ »óÅÂÈ¿°ú ÀÎÀÚ ¼ÂÆÃÀÌ À߸ø µÇ¾ú½À´Ï´Ù." ); if( bValidArgument ) { string& strShockProb = vlTokens.at( 0 ); string& strShockDuration = vlTokens.at( 1 ); string& strRadius = vlTokens.at( 2 ); string& strProjectileHitSignalPercent = vlTokens.at( 3 ); m_fShockProb = (float)atof( strShockProb.c_str() ); m_nShockDurationTime = (int)atoi( strShockDuration.c_str() ); m_fLimitRadius = (float)atof( strRadius.c_str() ); m_fHitApplyPercent = (float)atof( strProjectileHitSignalPercent.c_str() ); //// ¿ì¼± Å×½ºÆ®¿ë. //m_fShockProb = 1.0f; //m_nShockDurationTime = 100000; //m_fLimitRadius = 1000.0f; //m_fHitApplyPercent = 1.0f; //////////////////////////////////////////////////////////////////////////// } // °¨Àü ÀüÀÌ¿¡¼­ »ç¿ëÇÒ ¹ß»çü ½Ã±×³Î Á¤º¸¸¦ ¹Ì¸® ¾à¼ÓÇØµÐ ¾×¼Ç¿¡¼­ ¹ß»çü Á¤º¸¸¦ ²¨³»¿Â´Ù. // ÀÌ »óÅÂÈ¿°ú´Â self ·Î Ãß°¡µÇ´Â °ÍÀ̱⠶§¹®¿¡ m_hActor ¿¡¼­ ¾ò¾î¿À¸é µÈ´Ù. CDnActionBase::ActionElementStruct* pActionElement = m_hActor->GetElement( SHOCK_INFECTION_ACTION_NAME ); bool bValid = false; if( pActionElement ) { if( false == pActionElement->pVecSignalList.empty() ) { CEtActionSignal* pSignal = pActionElement->pVecSignalList.front(); if( STE_Projectile == pSignal->GetSignalIndex() ) { #ifdef PRE_FIX_MEMOPT_SIGNALH CopyShallow_ProjectileStruct(m_ProjectileSignalInfo, static_cast(pSignal->GetData())); #else m_ProjectileSignalInfo = *static_cast(pSignal->GetData()); #endif #ifdef _GAMESERVER // °¨Àü »óÅ ȿ°ú m_AddtionalSE.nID = STATE_BLOW::BLOW_043; m_AddtionalSE.ApplyType = CDnSkill::ApplyTarget; m_AddtionalSE.nDurationTime = m_nShockDurationTime; m_AddtionalSE.szValue = "1.0"; #else // »óÅÂÈ¿°ú ÀÌÆåÆ® ºÙÀÌ°í ¸»°í¸¦ ÀÌ Å¬·¡½º¿¡¼­Á÷Á¢ ÄÁÆ®·Ñ ÇÑ´Ù. UseTableDefinedGraphicEffect( false ); #endif // #ifdef _GAMESERVER bValid = true; } } } // ¸®¼Ò½º ¼ÂÆÃÀÌ À߸øµÇ¾î »óÅÂÈ¿°ú ¹Ù·Î Á¾·áµÊ. if( false == bValid ) { SetState( STATE_BLOW::STATE_END ); } //m_fRate = 1.0f; //m_fLimitRadius = 1000.0f; //m_nDurationTime = 5000; //m_fHitApplyPercent = 1.0f; //////////////////////////////////////////////////////////////////////////// //m_OffSet = EtVector3(0.0f, 0.0f, 0.0f); //m_Direction = EtVector3(0.0f, 0.0f, 1.0f); //m_DestPos = EtVector3(0.0f, 0.0f, 0.0f); //m_nOrbitType = CDnProjectile::Homing; //m_nTargetType = CDnProjectile::Target; //m_VelocityType = CDnProjectile::Accell; //m_fProjectileSpeed = 1000.0f; //m_nProjectileValidTime = 5000; //////////////////////////////////////////////////////////////////////////// //memset(&m_ProjectileSignalInfo, 0, sizeof(m_ProjectileSignalInfo)); //m_ProjectileSignalInfo.nWeaponTableID = 2000; //m_ProjectileSignalInfo.nProjectileIndex = -1; //m_ProjectileSignalInfo.nOrbitType = CDnProjectile::Homing; //m_ProjectileSignalInfo.nTargetType = CDnProjectile::Target; //m_ProjectileSignalInfo.nDestroyOrbitType = CDnProjectile::Instantly; //m_ProjectileSignalInfo.bTraceHitTarget = FALSE; //m_ProjectileSignalInfo.vOffset = &m_OffSet; //m_ProjectileSignalInfo.vDirection = &m_Direction; //m_ProjectileSignalInfo.vDestPosition = &m_DestPos; //// °¨Àü »óÅ ȿ°ú //m_AddtionalSE.nID = STATE_BLOW::BLOW_043; //m_AddtionalSE.ApplyType = CDnSkill::ApplyTarget; //m_AddtionalSE.nDurationTime = m_nDurationTime; //m_AddtionalSE.szValue = "1.0;1.0"; //m_bCreateProjectile = false; #ifdef _GAMESERVER AddCallBackType( SB_ONTARGETHIT ); #endif } CDnShockInfectionBlow::~CDnShockInfectionBlow(void) { } void CDnShockInfectionBlow::OnBegin( LOCAL_TIME LocalTime, float fDelta ) { #ifdef _GAMESERVER // ÄðŸÀÓÀ» ºÎ¸ð ½ºÅ³ÀÇ Á¤º¸¸¦ ±×´ë·Î Ȱ¿ëÇÑ´Ù. if( m_ParentSkillInfo.hSkillUser ) { DnSkillHandle hParentSkill = m_ParentSkillInfo.hSkillUser->FindSkill( m_ParentSkillInfo.iSkillID ); m_dwCoolTime = DWORD(hParentSkill->GetDelayTime() * 1000.0f); } #else m_pLocalPlayerActor = dynamic_cast( m_hActor.GetPointer() ); if( !m_hParentSkillForCoolTime && m_pLocalPlayerActor ) { m_hParentSkillForCoolTime = CDnSkill::CreateSkill( m_hActor, m_ParentSkillInfo.iSkillID, #if defined(PRE_FIX_NEXTSKILLINFO) m_ParentSkillInfo.nSkillLevel); #else m_ParentSkillInfo.iSkillLevelID - m_ParentSkillInfo.iSkillLevelIDOffset + 1 ); #endif // PRE_FIX_NEXTSKILLINFO } #endif __super::OnBegin(LocalTime, fDelta); } void CDnShockInfectionBlow::Process( LOCAL_TIME LocalTime, float fDelta ) { CDnBlow::Process( LocalTime, fDelta ); #ifdef _GAMESERVER #else if( m_pLocalPlayerActor ) { // ÄðŸÀÓ ÁøÇà. m_hParentSkillForCoolTime->Process( LocalTime, fDelta ); } #endif // _GAMESERVER //if (m_bCreateProjectile) //{ // CreateProjectile(); // m_bCreateProjectile = false; //} //OutputDebug( "CDnFireBurnBlow::Process, Value:%2.2f (HP : %d ) \n", m_fValue, m_hActor->GetHP()); } //void CDnShockInfectionBlow::DoShockInfection( DnActorHandle hTargetActor ) //{ //#ifdef _GAMESERVER // m_LastActivateTime = m_hActor->GetLocalTime(); // CreateProjectileOnServer( hTargetActor ); ////#else //// CreateProjectileOnClient(); //#endif //} #if defined(_GAMESERVER) void CDnShockInfectionBlow::DoShockInfection( DnActorHandle hHitTargetActor ) { if( !hHitTargetActor ) return; m_LastActivateTime = m_hActor->GetLocalTime(); DNVector(DnActorHandle) vlActorsInRange; if (!hHitTargetActor->ScanActor( hHitTargetActor->GetRoom(), *hHitTargetActor->GetPosition(), m_fLimitRadius, vlActorsInRange )) return; // ¿ì¼± Á¦ÀÏ °¡±î¿î ¾×ÅÍ ¼±ÅÃ.. ÃßÈÄ¿¡ ´Ù¸¥ ±ÔÄ¢ÀÌ µé¾î°£´Ù¸é ±×·¸°Ô ó¸®ÇÑ´Ù. float fShortestDistanceSQ = FLT_MAX; DnActorHandle hActorToInfection; DWORD dwNumActors = (DWORD)vlActorsInRange.size(); for( DWORD dwActor = 0; dwActor < dwNumActors; ++dwActor ) { DnActorHandle hActor = vlActorsInRange.at( dwActor ); if( false == (hActor->IsShow() && hActor->IsProcess()) ) continue; // °°Àº ¾×ÅÍ ¸»°í if( hActor == hHitTargetActor ) continue; // npc ¾×ÅÍ´Â Á¦¿Ü if( hActor->IsNpcActor() ) continue; // ´Ù¸¥ ÆÀÀÎ °æ¿ì¸¸.. if( hActor->GetTeam() != m_hActor->GetTeam()) { EtVector3 vDistance = (*m_hActor->GetPosition()) - (*hActor->GetPosition()); float fLengthSQ = EtVec3LengthSq( &vDistance ); if( fLengthSQ < fShortestDistanceSQ ) { fShortestDistanceSQ = fLengthSQ; hActorToInfection = hActor; } } } if( hActorToInfection ) { ProjectileStruct* pProjectileSignalInfo = &m_ProjectileSignalInfo; // ÇÁ·ÎÁ§Å¸ÀÏ ¹ß»ç °ü·Ã ±âŸ ¼³Á¤µé. DnSkillHandle hSkill = m_hActor->FindSkill( m_ParentSkillInfo.iSkillID ); if( !hSkill ) return; MatrixEx Cross = *m_hActor->GetMatEx(); Cross.m_vPosition.y += m_hActor->GetHeight() / 2.0f; CDnProjectile *pProjectile = new CDnProjectile( GetRoom(), m_hActor ); pProjectile->SetPierce( pProjectileSignalInfo->bPierce == TRUE ? true : false ); pProjectile->SetMaxHitCount( pProjectileSignalInfo->nMaxHitCount ); if( pProjectileSignalInfo->nWeaponTableID > 0 ) { if( pProjectileSignalInfo->nProjectileIndex != -1 ) { DnWeaponHandle hWeapon = CDnWeapon::GetSmartPtr( (CMultiRoom*)g_pGameServerManager->GetRootRoom(), pProjectileSignalInfo->nProjectileIndex ); if( hWeapon ) *(CDnWeapon*)pProjectile = *hWeapon.GetPointer(); } } int nLength = pProjectile->GetWeaponLength(); if( pProjectileSignalInfo->bIncludeMainWeaponLength ) { DnWeaponHandle hWeapon = m_hActor->GetWeapon(0); if ( hWeapon ) nLength += hWeapon->GetWeaponLength(); } // °¨Àü ÀüÀ̰¡ Àß µÇµµ·Ï ÃÖ¼ÒÇÑ ¹üÀ§°ª ¸¸Å­ÀÇ »ç°Å¸®¸¦ ÁØ´Ù. if( nLength < (int)m_fLimitRadius ) nLength = (int)m_fLimitRadius; pProjectile->SetWeaponLength( nLength ); pProjectile->SetWeaponType( (CDnWeapon::WeaponTypeEnum)( pProjectile->GetWeaponType() | CDnWeapon::Projectile ) ); pProjectile->SetSpeed( pProjectileSignalInfo->fSpeed ); pProjectile->SetTargetPosition( *hActorToInfection->GetPosition() ); pProjectile->SetTargetActor( hActorToInfection ); pProjectile->Initialize( Cross, static_cast(pProjectileSignalInfo->nOrbitType), static_cast(pProjectileSignalInfo->nDestroyOrbitType), static_cast(pProjectileSignalInfo->nTargetType) ); pProjectile->SetValidTime( pProjectileSignalInfo->nValidTime ); pProjectile->SetVelocityType( static_cast(pProjectileSignalInfo->VelocityType) ); pProjectile->SetParentSkill( hSkill ); //m_ParentSkillInfo.hPrevAttacker = m_hActor; CDnSkill::SkillInfo ParentSkillInfo = m_ParentSkillInfo; char szBuff[128] = {0, }; _snprintf_s(szBuff, _countof(szBuff), _TRUNCATE, "%d", 402 ); ParentSkillInfo.szEffectOutputIDToClient = szBuff; // ¹ß»çüÀÇ shooter ´Â ÀÌ »óÅÂÈ¿°ú¸¦ °¡Áø ¾×ÅÍÀÌ°í °¨Àü ´ë»óÀº Àû±ºÀ̹ǷΠÀÌ·¸°Ô º¸³»Áà¾ß Ŭ¶óÀÌ¾ðÆ®¿¡¼­ ÀÌÆåÆ®°¡ Á¦´ë·Î ºÙ´Â´Ù. // ÀÌ »óÅÂÈ¿°ú¸¦ »ç¿ëÇÏ´Â ÁÖü´Â self ·Î ÀÌ »óÅÂÈ¿°ú¸¦ °®°í ÀÖ´Ù. ParentSkillInfo.eTargetType = CDnSkill::TargetTypeEnum::Enemy; pProjectile->SetParentSkillInfo( ParentSkillInfo ); pProjectile->FromSkill( true ); pProjectile->SetHitApplyPercent( m_fHitApplyPercent ); // °¨Àü »óÅ ȿ°ú Ãß°¡.. pProjectile->AddStateEffect( m_AddtionalSE ); boost::shared_ptr pActorStateSnapshotToPass = boost::shared_ptr(new CDnState); *pActorStateSnapshotToPass = *static_cast( m_ParentSkillInfo.hSkillUser.GetPointer() ); pActorStateSnapshotToPass->SetAttackMMax( m_hActor->GetAttackMMaxWithoutSkill() ); pActorStateSnapshotToPass->SetAttackMMin( m_hActor->GetAttackMMinWithoutSkill() ); pProjectile->SetShooterStateSnapshot( pActorStateSnapshotToPass ); pProjectile->PostInitialize(); #if defined(PRE_FIX_65287) float fFinalDamageRate = 0.0f; if (m_hActor && m_hActor->IsAppliedThisStateBlow(STATE_BLOW::BLOW_050)) { DNVector(DnBlowHandle) vlhBlows; m_hActor->GatherAppliedStateBlowByBlowIndex( STATE_BLOW::BLOW_050, vlhBlows ); int iNumBlow = (int)vlhBlows.size(); for( int i = 0; i < iNumBlow; ++i ) { fFinalDamageRate += vlhBlows[i]->GetFloatValue(); } } pProjectile->SetShooterFinalDamageRate(fFinalDamageRate); #endif // PRE_FIX_65287 // ±Ùó¿¡ °¡±î¿î ´ë»ó¿¡°Ô ¹ß»çü¸¦ º¸³»µµ·Ï Ŭ¶ó¿¡ ÆÐŶÀ» º¸³»ÁØ´Ù. // ´ë»óÀº ¼­¹ö¿¡¼­ ¼±ÅÃµÈ ¾×ÅÍ·Î. BYTE pBuffer[ 128 ] = { 0 }; CPacketCompressStream Stream( pBuffer, 128 ); DWORD dwTargetActorUniqueID = hHitTargetActor->GetUniqueID(); DWORD dwActorToInfection = hActorToInfection->GetUniqueID(); int nBlowID = GetBlowID(); Stream.Write( &dwTargetActorUniqueID, sizeof(dwTargetActorUniqueID) ); Stream.Write( &dwActorToInfection, sizeof(dwActorToInfection) ); Stream.Write( &nBlowID, sizeof(nBlowID) ); //Stream.Write( &m_bCreateProjectile, sizeof(m_bCreateProjectile)); m_hActor->Send( eActor::SC_SHOCK_INFECTION, &Stream ); } } #else void CDnShockInfectionBlow::DoShockInfection( DnActorHandle hHitTargetActor, DnActorHandle hActorToInfection ) { if( hHitTargetActor && hActorToInfection ) { // ¼­¹ö¿¡¼­ ÄðŸÀÓ ÆÐ¸µÀÌ ¼º°øÇßÀ» °æ¿ì µû·Î ÆÐŶÀ¸·Î º¸³»¿Í¼­ È£ÃâµÈ´Ù. // ·ÎÄà Ŭ¶óÀ̾ðÆ®À϶§¸¸ ÄðŸÀÓ º¸¿©ÁÖ¸é µÈ´Ù. if( m_pLocalPlayerActor ) { // ÄðŸÀÓ¸¸ ÁøÇà½ÃÄÑÁÜ. È­¸é Ç¥½Ã¿ë m_hParentSkillForCoolTime->OnBeginCoolTime(); if( m_hParentSkillForCoolTime->HasCoolTime() ) { CDnMainDlg *pMainDlg = (CDnMainDlg*)GetInterface().GetMainBarDialog(); if( pMainDlg ) { pMainDlg->AddPassiveSkill( m_hParentSkillForCoolTime ); } } } // ÇÁ·ÎÁ§Å¸ÀÏ ¹ß»ç °ü·Ã ±âŸ ¼³Á¤µé. CDnProjectile* pProjectile = CDnProjectile::CreateProjectile( m_hActor, *hHitTargetActor->GetMatEx(), &m_ProjectileSignalInfo, EtVector3( 0.0f, 0.0f, 0.0f), hActorToInfection ); } } #endif // _GAMESERVER void CDnShockInfectionBlow::OnEnd( LOCAL_TIME LocalTime, float fDelta ) { __super::OnEnd(LocalTime, fDelta); } #if defined(_GAMESERVER) void CDnShockInfectionBlow::OnTargetHit( DnActorHandle hTargetActor ) { if (!m_hActor) return; if (!hTargetActor || hTargetActor->IsDie()) return; if (hTargetActor->IsImmuned(m_StateBlow.emBlowIndex)) return; // ÇöÀç Àû¿ëµÇ°í ÀÖ´Â ³» ¾×¼ÇÀÇ È÷Æ® ½Ã±×³Î Á¤º¸¸¦ ¾ò¾î¿Â´Ù. CDnDamageBase::SHitParam* pHitParameter = m_hActor->GetHitParam(); // Àû¿ëµÇ´Â ±¸°£ÀÇ ±âÁØÀº È÷Æ®½Ã±×³ÎÀÇ ±¸°£°ú ÀÏÄ¡ÇÑ´Ù. // Çѹø ÄðŸÀÓ¿¡ ÇϳªÀÇ È÷Æ®½Ã±×³Î¿¡ Àû¿ëµÈ´Ù. // first hit Ç÷¡±×°¡ ÄÑÁ® ÀÖ´Ù¸é ÀÌ È÷Æ® ½Ã±×³ÎÀÌ Ã³À½À¸·Î hit µÈ °ÍÀ̹ǷΠ// ÄðŸÀÓÀ» µ¹·ÁÁֱ⠽ÃÀÛÇÑ´Ù. ´ÙÀ½ FirstHit Ç÷¡±×°¡ ¿Ã ¶§´Â ÄðŸÀÓ °£°ÝÀ» // Ã¼Å©ÇØ¼­ ÇØ´ç °£°Ý¸¸Å­ ½Ã°£ÀÌ Áö³ªÁö ¾Ê¾Ò´Ù¸é °¨Àü ÀüÀ̸¦ ½ÃŰÁö ¾Êµµ·Ï ÇÑ´Ù. bool bNowActivate = true; if( pHitParameter->bFirstHit ) { LOCAL_TIME NowLocalTime = m_hActor->GetLocalTime(); if( NowLocalTime - m_LastActivateTime < m_dwCoolTime ) { bNowActivate = false; } } if( bNowActivate ) { //°¨Àü »óŰ¡ ¾Æ´Ï¸é ½ºÅµ.. if (!hTargetActor->IsAppliedThisStateBlow(STATE_BLOW::BLOW_043)) return; //ºû ¼Ó¼º °ø°ÝÀÌ ¾Æ´Ï¸é ½ºÅµ CDnDamageBase::SHitParam* pHitParam = hTargetActor->GetHitParam(); if( NULL == pHitParam || CDnState::Light != pHitParam->HasElement ) return; //È®·ü °è»ê.. bool bExecuteable = rand() % 10000 <= (m_fShockProb * 10000.0f); if (!bExecuteable) return; DoShockInfection( hTargetActor ); } //ÀÌ »óÅÂÈ¿°úÀÇ m_bCreateProjectile¸¦ ¹Ù²Ù´Â ÆÐŶÀ» º¸³½´Ù.. //m_bCreateProjectile = true; } #endif // _GAMESERVER #if defined(PRE_ADD_PREFIX_SYSTE_RENEW) void CDnShockInfectionBlow::AddStateEffectValue(const char* szOrigValue, const char* szAddValue, std::string& szNewValue) { char szBuff[128] = {0, }; //ÇÊ¿äÇÑ º¯¼ö float fShockProb[2] = {0.0f, }; int nShockDuration[2] = { 0, }; float fLimitRadius[2] = { 0.0f, }; float fHitApplyPercent[2] = { 0.0f, }; // ÀÎÀÚ°¡ ÃÑ 4°³ÀÓ. // °¨ÀüÈ®·ü;°¨ÀüÁö¼Ó½Ã°£;¹üÀ§;¹ß»çü È÷Æ® ½Ã±×³Î¿¡ Àû¿ëÇÒ µ¥¹ÌÁö% std::string strValue( szOrigValue ); // ½ºÆ®¸µÀ» °ø¹é´ÜÀ§·Î ºÐÇÒÇÑ ÈÄ std::vector vlTokens[2]; TokenizeA( strValue, vlTokens[0], ";" ); if( (int)vlTokens[0].size() == 4 ) { fShockProb[0] = (float)atof( vlTokens[0][0].c_str() ); nShockDuration[0] = (int)atoi( vlTokens[0][1].c_str() ); fLimitRadius[0] = (float)atof( vlTokens[0][2].c_str() ); fHitApplyPercent[0] = (float)atof( vlTokens[0][3].c_str() ); } ////////////////////////////////////////////////////////////////////////// strValue = szAddValue; TokenizeA( strValue, vlTokens[1], ";" ); if( (int)vlTokens[1].size() == 4 ) { fShockProb[1] = (float)atof( vlTokens[1][0].c_str() ); nShockDuration[1] = (int)atoi( vlTokens[1][1].c_str() ); fLimitRadius[1] = (float)atof( vlTokens[1][2].c_str() ); fHitApplyPercent[1] = (float)atof( vlTokens[1][3].c_str() ); } ////////////////////////////////////////////////////////////////////////// float fResultShockProb = fShockProb[0] + fShockProb[1]; int nResultShockDuration = max(nShockDuration[0], nShockDuration[1]); float fResultLimitRadius = max(fLimitRadius[0], fLimitRadius[1]); float fResultHitApplyPrecent = fHitApplyPercent[0] + fHitApplyPercent[1]; sprintf_s(szBuff, "%f;%d;%f;%f", fResultShockProb, nResultShockDuration, fResultLimitRadius, fResultHitApplyPrecent); szNewValue = szBuff; } void CDnShockInfectionBlow::RemoveStateEffectValue(const char* szOrigValue, const char* szAddValue, std::string& szNewValue) { char szBuff[128] = {0, }; //ÇÊ¿äÇÑ º¯¼ö float fShockProb[2] = {0.0f, }; int nShockDuration[2] = { 0, }; float fLimitRadius[2] = { 0.0f, }; float fHitApplyPercent[2] = { 0.0f, }; // ÀÎÀÚ°¡ ÃÑ 4°³ÀÓ. // °¨ÀüÈ®·ü;°¨ÀüÁö¼Ó½Ã°£;¹üÀ§;¹ß»çü È÷Æ® ½Ã±×³Î¿¡ Àû¿ëÇÒ µ¥¹ÌÁö% std::string strValue( szOrigValue ); // ½ºÆ®¸µÀ» °ø¹é´ÜÀ§·Î ºÐÇÒÇÑ ÈÄ std::vector vlTokens[2]; TokenizeA( strValue, vlTokens[0], ";" ); if( (int)vlTokens[0].size() == 4 ) { fShockProb[0] = (float)atof( vlTokens[0][0].c_str() ); nShockDuration[0] = (int)atoi( vlTokens[0][1].c_str() ); fLimitRadius[0] = (float)atof( vlTokens[0][2].c_str() ); fHitApplyPercent[0] = (float)atof( vlTokens[0][3].c_str() ); } ////////////////////////////////////////////////////////////////////////// strValue = szAddValue; TokenizeA( strValue, vlTokens[1], ";" ); if( (int)vlTokens[1].size() == 4 ) { fShockProb[1] = (float)atof( vlTokens[1][0].c_str() ); nShockDuration[1] = (int)atoi( vlTokens[1][1].c_str() ); fLimitRadius[1] = (float)atof( vlTokens[1][2].c_str() ); fHitApplyPercent[1] = (float)atof( vlTokens[1][3].c_str() ); } ////////////////////////////////////////////////////////////////////////// float fResultShockProb = fShockProb[0] - fShockProb[1]; int nResultShockDuration = min(nShockDuration[0], nShockDuration[1]); float fResultLimitRadius = min(fLimitRadius[0], fLimitRadius[1]); float fResultHitApplyPrecent = fHitApplyPercent[0] - fHitApplyPercent[1]; sprintf_s(szBuff, "%f;%d;%f;%f", fResultShockProb, nResultShockDuration, fResultLimitRadius, fResultHitApplyPrecent); szNewValue = szBuff; } #endif // PRE_ADD_PREFIX_SYSTE_RENEW