#include "StdAfx.h" #include "DnStateBlow.h" #include "DnCreateBlow.h" #include "DnBlow.h" #include "DnImmuneBlow.h" #include "DnAllImmuneBlow.h" #include "DnUsingSkillWhenDieBlow.h" #include "DnTableDB.h" #include "DnPlayerActor.h" #include "DnProbInvincibleAtBlow.h" #include "DnIgnoreEffectBlow.h" #include "DnComboDamageLimitBlow.h" #include "DnPileAddEffectBlow.h" #ifdef PRE_ADD_DECREASE_EFFECT #include "DnPuppetBlow.h" #endif // PRE_ADD_DECREASE_EFFECT #ifdef PRE_FIX_MEMOPT_EXT #ifndef _GAMESERVER #include "DnCommonUtil.h" #endif #endif #ifdef _DEBUG #define new new(_NORMAL_BLOCK,__FILE__,__LINE__) #endif #ifndef _GAMESERVER std::map CDnStateBlow::s_nMapEffectOutputInfo; bool CDnStateBlow::s_bStopProcess = false; #else STATIC_DECL_INIT( CDnStateBlow, bool, s_bStopProcess ) = { false, }; #endif #ifndef _GAMESERVER int CDnStateBlow::s_iStateBlowIDCount = 0; #else STATIC_DECL_INIT( CDnStateBlow, int, s_iStateBlowIDCount ) = { 0, }; #endif CDnStateBlow::CDnStateBlow( DnActorHandle hActor ) { m_hActor = hActor; ZeroMemory( m_aiApplied, sizeof(m_aiApplied) ); #ifndef _GAMESERVER m_bAllowDiffuseVariation = true; _LoadStateEffectOutputInfo(); #endif m_bLockStateBlowList = false; m_bLockRemoveReservedList = false; } CDnStateBlow::~CDnStateBlow(void) { DelAllStateBlow(); } bool CDnStateBlow::InitializeClass() { #ifndef _GAMESERVER _LoadStateEffectOutputInfo(); #endif return true; } void CDnStateBlow::ReleaseClass() { #ifndef _GAMESERVER _ReleaseStateEffectOutputInfo(); #endif } #ifndef _GAMESERVER void CDnStateBlow::_LoadStateEffectOutputInfo( void ) { if( !s_nMapEffectOutputInfo.empty() ) return; DNTableFileFormat* pStateEffectTable = CDnTableDB::GetInstancePtr()->GetTable( CDnTableDB::TSTATEEFFECT ); #ifdef PRE_FIX_MEMOPT_EXT DNTableFileFormat* pFileNameSox = CDnTableDB::GetInstancePtr()->GetTable(CDnTableDB::TFILE); if (pFileNameSox == NULL) return; #endif int iNumItem = pStateEffectTable->GetItemCount(); for( int i=0; iGetItemID(i); EffectOutputInfo* pNewInfo = new EffectOutputInfo; int iStateEffectIndex = pStateEffectTable->GetFieldFromLablePtr( iItem, "_StateEffectIndex" )->GetInteger(); _ASSERT( pNewInfo->iStateEffectIndex < STATE_BLOW::BLOW_MAX ); pNewInfo->iStateEffectIndex = iStateEffectIndex; pNewInfo->iShowTimingType = pStateEffectTable->GetFieldFromLablePtr( iItem, "_ShowTimingType" )->GetInteger(); pNewInfo->iOutputType = pStateEffectTable->GetFieldFromLablePtr( iItem, "_EffectOutputType" )->GetInteger(); pNewInfo->iPlayType = pStateEffectTable->GetFieldFromLablePtr( iItem, "_EffectPlayType" )->GetInteger(); #ifdef PRE_FIX_MEMOPT_EXT CommonUtil::GetFileNameFromFileEXT(pNewInfo->strSkinFileName, pStateEffectTable, iItem, "_EffectSkinFileName", pFileNameSox); CommonUtil::GetFileNameFromFileEXT(pNewInfo->strAniFileName, pStateEffectTable, iItem, "_EffectAniFileName", pFileNameSox); CommonUtil::GetFileNameFromFileEXT(pNewInfo->strActFileName, pStateEffectTable, iItem, "_EffectActFileName", pFileNameSox); #else pNewInfo->strSkinFileName = pStateEffectTable->GetFieldFromLablePtr( iItem, "_EffectSkinFileName" )->GetString(); pNewInfo->strAniFileName = pStateEffectTable->GetFieldFromLablePtr( iItem, "_EffectAniFileName" )->GetString(); pNewInfo->strActFileName = pStateEffectTable->GetFieldFromLablePtr( iItem, "_EffectActFileName" )->GetString(); #endif pNewInfo->strActorActionName = pStateEffectTable->GetFieldFromLablePtr( iItem, "_ActorActionName" )->GetString(); pNewInfo->iUseDiffuseVariationMethod = pStateEffectTable->GetFieldFromLablePtr( iItem, "_UseDiffuseVariation" )->GetInteger(); pNewInfo->afDiffuseRed[ 0 ] = (float)pStateEffectTable->GetFieldFromLablePtr( iItem, "_DiffuseR1" )->GetFloat(); pNewInfo->afDiffuseBlue[ 0 ] = (float)pStateEffectTable->GetFieldFromLablePtr( iItem, "_DiffuseG1" )->GetFloat(); pNewInfo->afDiffuseGreen[ 0 ] = (float)pStateEffectTable->GetFieldFromLablePtr( iItem, "_DiffuseB1" )->GetFloat(); pNewInfo->afDiffuseRed[ 1 ] = (float)pStateEffectTable->GetFieldFromLablePtr( iItem, "_DiffuseR2" )->GetFloat(); pNewInfo->afDiffuseBlue[ 1 ] = (float)pStateEffectTable->GetFieldFromLablePtr( iItem, "_DiffuseG2" )->GetFloat(); pNewInfo->afDiffuseGreen[ 1 ] = (float)pStateEffectTable->GetFieldFromLablePtr( iItem, "_DiffuseB2" )->GetFloat(); pNewInfo->fDiffuseChangeSpeed = (float)pStateEffectTable->GetFieldFromLablePtr( iItem, "_DiffuseChangeSpeed" )->GetFloat(); // ; ·Î ±¸ºÐµÈ À妽º °ªµéÀ» ¹Þ¾Æ¿È const char* pIndices = pStateEffectTable->GetFieldFromLablePtr( iItem, "_LinkBoneIndex" )->GetString(); string strIndices( pIndices ); if( (int)strIndices.length() > 0 ) { int nFoundPos = -1; if( strIndices.at(strIndices.length()-1) != ';' ) strIndices.push_back( ';' ); while( true ) { int nStartPos = nFoundPos + 1; nFoundPos = (int)strIndices.find_first_of( ';', nStartPos ); if( nFoundPos != (int)string::npos ) { string strIndex( strIndices.substr(nStartPos, nFoundPos-nStartPos) ); pNewInfo->vlDummyBoneIndices.push_back( atoi(strIndex.c_str()) ); } else break; } } s_nMapEffectOutputInfo.insert( make_pair( iItem, pNewInfo ) ); } } void CDnStateBlow::_ReleaseStateEffectOutputInfo( void ) { SAFE_DELETE_PMAP( TMapEffectOutputInfo, s_nMapEffectOutputInfo ); } void CDnStateBlow::_ProcessDuplicateEffectBoneRotateShow( LOCAL_TIME LocalTime, float fDelta ) { // ÇÁ·Î¼¼½º¸¦ Çϱâ Àü¿¡ À¯È¿ÇÏÁö ¾ÊÀº ÀÌÆåÆ®´Â Á¦°Å. for( int i = 0; i < CDnActor::Max_FX_Dummy_Bone; ++i ) { list& listBoneEffect = m_aListBoneEffectStatus[ i ]; list::iterator iter = listBoneEffect.begin(); for( iter; iter != listBoneEffect.end(); ) { if( !iter->hEffect ) { bool bNextShow = iter->bShow; iter = listBoneEffect.erase( iter ); if( listBoneEffect.end() != iter ) if( bNextShow ) iter->Show( bNextShow ); continue; } ++iter; } } for( int i = 0; i < CDnActor::Max_FX_Dummy_Bone; ++i ) { list& listBoneEffect = m_aListBoneEffectStatus[ i ]; // º¹¼ö°³°¡ °ãÃÄÀÖ´Â º»Àº ±³Â÷Ãâ·Â 󸮸¦ ÇØÁØ´Ù. if( 1 < (int)listBoneEffect.size() ) { list::iterator iter = listBoneEffect.begin(); for( iter; iter != listBoneEffect.end(); ++iter ) { if( iter->bShow ) { iter->fOutputElapsedTime += fDelta; if( 1.0f < iter->fOutputElapsedTime ) { list::iterator iterNext = iter; iterNext++; if( listBoneEffect.end() == iterNext ) iterNext = listBoneEffect.begin(); // ±âÁ¸¿¡ Ãâ·ÂµÇ´ø ÀÌÆåÆ®´Â ¼û±â°í. iter->Show( false ); iter->fOutputElapsedTime = 0.0f; // »õ·Î º¸¿©ÁÙ ÀÌÆåÆ®¸¦ º¸¿©ÁØ´Ù. iterNext->Show( true ); iterNext->fOutputElapsedTime = 0.f; break; } } } } } } #endif void CDnStateBlow::Process( LOCAL_TIME LocalTime, float fDelta, bool bForceInitialize ) { #ifdef _GAMESERVER if( m_hActor && true == s_bStopProcess[ m_hActor->GetRoom()->GetRoomID() ] ) return; #else if( s_bStopProcess ) return; #endif if( !m_listBlowHandle.empty() ) { BLOW_HANDLE_LIST_ITER iter = m_listBlowHandle.begin(); #ifndef _GAMESERVER if( m_bAllowDiffuseVariation ) { // diffuse variation ¼ýÀÚ°¡ °¡Àå ³ôÀº ÇÑ ³ð¸¸ »ö±ò ¹Ù²î´Â °Å Ãâ·Â BLOW_HANDLE_LIST_ITER iterAllowDV = m_listBlowHandle.end(); int iBiggest = 0; for( ; iter != m_listBlowHandle.end(); ++iter ) { if( (*iter) && (*iter)->IsUseTableDefinedGraphicEffect() ) { (*iter)->AllowDiffuseVariation( false ); const EffectOutputInfo* pEffectInfo = (*iter)->GetEffectOutputInfo(); if( pEffectInfo && pEffectInfo->iUseDiffuseVariationMethod > 0 ) { if( iBiggest < pEffectInfo->iUseDiffuseVariationMethod ) { iBiggest = pEffectInfo->iUseDiffuseVariationMethod; iterAllowDV = iter; } } } } if( m_listBlowHandle.end() != iterAllowDV ) { (*iterAllowDV)->AllowDiffuseVariation( true ); } } #endif #ifndef _FINAL_BUILD _CrashIfProcessListLocked(); #endif // #ifdef _FINAL_BUILD // »óÅÂÈ¿°ú °´Ã¼µé ·çÇÁµ¹¸é¼­ process Áß¿¡ ¸®½ºÆ®°¡ Á¦°ÅµÉ °æ¿ì. üũ. // ÆÄÀ̳Π¸±¸®Áî°¡ ¾Æ´Ñ°æ¿ì ±ò±ÝÇÏ°Ô Á×¾î¶ó. m_bLockStateBlowList = true; Process_StateBlow_New(LocalTime, fDelta, bForceInitialize); } m_bLockStateBlowList = false; #ifndef _GAMESERVER #if !defined(SW_MODIFY_SE_EFFECTOUTPUT_20091119_jhk8211) _ProcessDuplicateEffectBoneRotateShow( LocalTime, fDelta ); #endif #endif #if defined( _GAMESERVER ) // ¿©±â¼­ StateBlow::Process() OnRebith() °¡ ºÒ¸®°Ô µÇ´Â °æ¿ì ³»ºÎÀûÀ¸·Î ÀÚÀ¯·Ó°Ô StateBlow::Process() ¸¦ µ¹¸± ¼ö°¡ ¾ø¾î¼­ // ±¸Á¶ÀûÀ¸·Î ´Ù ³¡³ª°í ÈÄ󸮷Πµ¹¸®°Ô ¹Ù²ã³õ´Â´Ù. if( m_hActor ) m_hActor->OnStateBlowProcessAfter(); #endif // #if defined( _GAMESERVER ) RemoveStateBlowReservedList(); } int CDnStateBlow::CanAddThisBlow( const CDnSkill::SkillInfo* pParentSkill, STATE_BLOW::emBLOW_INDEX BlowIndex ) { int iResult = ADD_SUCCESS; // #35335 ¹«Àû »óÅÂÈ¿°úÀÏ ¶© È­¿°, µ¶ »óÅÂÈ¿°ú°¡ Àû¿ëµÇÁö ¾ÊÀ½. if( IsApplied( STATE_BLOW::BLOW_099 ) ) { if( (STATE_BLOW::BLOW_042 == BlowIndex) || (STATE_BLOW::BLOW_044 == BlowIndex) ) return ADD_FAIL_BY_INVINCIBLE; } #ifdef _GAMESERVER // 226¹ø ƯÁ¤ ½ºÅ³ È®·ü ¹«Àû »óÅÂÈ¿°ú°¡ ÇØ´ç ½ºÅ³¿¡ ´ëÇØ ¹ßµ¿ÁßÀΰ¡. if( pParentSkill && IsApplied( STATE_BLOW::BLOW_226 ) ) { DNVector( DnBlowHandle ) vlhBlows; GetStateBlowFromBlowIndex( STATE_BLOW::BLOW_226, vlhBlows ); for( int i = 0; i < (int)vlhBlows.size(); ++i ) { bool bCanAdd = static_cast(vlhBlows.at(i).GetPointer())->CanAddThisSkillsStateBlow( pParentSkill->iSkillID ); if( false == bCanAdd ) return ADD_FAIL_BY_PROB_SKILL_INVINCIBLE; } } #endif // #ifdef _GAMESERVER if (pParentSkill && pParentSkill->bIgnoreImmune) return iResult; #if defined (_GAMESERVER) //#34452¹ø À̽´¿Í °ü·ÃÀÖÀ½ bool bCheckGuildPriority = false; if (pParentSkill && pParentSkill->bIsGuildSkill == false) bCheckGuildPriority = true; #endif // ÇöÀç ¸é¿ªµÈ »óÅÂÈ¿°úÀÎÁö üũ // ºÎȰ(¹«Àû) »óÅÂÈ¿°úÀÎ °æ¿ì µ¥¹ÌÁö ¸Ô´Â »óÅÂÈ¿°ú¿¡ °É¸®Áö ¾Ê´Â´Ù. list::iterator iter = m_listBlowHandle.begin(); for( iter; iter != m_listBlowHandle.end(); ) { DnBlowHandle hNowBlow = (*iter); if( hNowBlow ) { if( (hNowBlow->GetBlowIndex() == STATE_BLOW::BLOW_077) ) { bool bImmuned = static_cast(hNowBlow.GetPointer())->IsImmuned( pParentSkill, BlowIndex ); if( bImmuned ) iResult = ADD_FAIL_BY_IMMUNE; } else if( (hNowBlow->GetBlowIndex() == STATE_BLOW::BLOW_150) ) { bool bImmuned = static_cast(hNowBlow.GetPointer())->IsImmuned( pParentSkill, BlowIndex ); if( bImmuned ) iResult = ADD_FAIL_BY_IMMUNE; } else if( IsApplied(STATE_BLOW::BLOW_057) ) { // ºÎȰ ÁßÀ϶§´Â ÀÚ±â ÀÚ½ÅÀÌ »ç¿ëÇÑ ½ºÅ³¿¡¼­ Àڽſ¡°Ô ºÎ¿©ÇÏ´Â »óÅÂÈ¿°ú.. ȤÀº, ¹öÇÁ/¿À¶ó ½ºÅ³ÀÇ »óÅÂÈ¿°ú¸¸ Àû¿ë½ÃŲ´Ù. if( pParentSkill ) { CDnSkill::SkillInfo* pSkillInfo = const_cast(pParentSkill); if( pSkillInfo->hSkillUser ) { if( !(pSkillInfo->hSkillUser == m_hActor) && (CDnSkill::Buff != pSkillInfo->eDurationType) && (CDnSkill::Aura != pSkillInfo->eDurationType) && (CDnSkill::StanceChange != pSkillInfo->eDurationType) ) { iResult = ADD_FAIL_BY_REVIVAL; } } } } else if (hNowBlow->GetBlowIndex() == STATE_BLOW::BLOW_252) { //#53722 ƯÁ¤ ½ºÅ³À» ¸é¿ªÇÏ´Â ½ºÅ³È¿°ú °³¹ß(hit´Â µÇÁö¸¸ »óÅÂÈ¿°ú Ãß°¡´Â µÇÁö ¾Êµµ·Ï..) CDnIngnoreEffectBlow* pIgnoreEffectBlow = static_cast(hNowBlow.GetPointer()); if (pIgnoreEffectBlow && pParentSkill && pIgnoreEffectBlow->IsInvincibleAt(pParentSkill->iSkillID)) iResult = ADD_FAIL_BY_IMMUNE; } #if defined(_GAMESERVER) else if ( hNowBlow->GetBlowIndex() == STATE_BLOW::BLOW_242 && BlowIndex == STATE_BLOW::BLOW_242) { //242¹ø »óÅÂÈ¿°ú´Â °°Àº ½ºÅ³ IDÀ̰í, °°Àº À¯Àú ÀÎ °æ¿ì´Â ´õÀÌ»ó Ãß°¡ µÇÁö ¾Êµµ·Ï ÇÑ´Ù. if (pParentSkill) { CDnSkill::SkillInfo* pParentSkillInfo = const_cast(pParentSkill); CDnSkill::SkillInfo* pExistSkillInfo = const_cast(hNowBlow->GetParentSkillInfo()); // #56880 ½ºÅ³ ½ÃÀÛ ½Ã°£ÀÌ °°ÀºÁöµµ È®ÀÎ ÇØ¾ß ÇÑ´Ù.. LOCAL_TIME parentSkillStartTime = 0; LOCAL_TIME nowBlowSkillStartTime = 0; CDnComboDamageLimitBlow* pNowBlow = static_cast(hNowBlow.GetPointer()); if (pNowBlow) nowBlowSkillStartTime = pNowBlow->GetSkillStartTime(); DnSkillHandle hParentSkill; if (pParentSkillInfo->hSkillUser) hParentSkill = pParentSkillInfo->hSkillUser->FindSkill(pParentSkillInfo->iSkillID); if (hParentSkill) parentSkillStartTime = pParentSkillInfo->projectileSkillStartTime != 0 ? pParentSkillInfo->projectileSkillStartTime : hParentSkill->GetSkillStartTime(); if (pExistSkillInfo) { if (pParentSkillInfo->hSkillUser && pParentSkillInfo->hSkillUser == pExistSkillInfo->hSkillUser && //½ºÅ³ »ç¿ëÀÚ°¡ °°°í pParentSkillInfo->iSkillID == pExistSkillInfo->iSkillID && //½ºÅ³ÀÌ °°Àº°æ¿ì nowBlowSkillStartTime == parentSkillStartTime //½ºÅ³ ½ÃÀÛ ½Ã°£ÀÌ °°Àº °æ¿ì ) { iResult = ADD_FAIL_BY_COMBOLIMITBLOW; } } } } else if (hNowBlow->GetBlowIndex() == STATE_BLOW::BLOW_249) { //249¹ø »óÅÂÈ¿°ú Áßø µÇ°í Ȱ¼ºÈ­?(Áßøī¿îÆ® ¼³Á¤ ¼öÄ¡¿¡ µµ´Þ ÇßÀ» °æ¿ì) ´õÀÌ»ó Ãß°¡ µÇÁö ¾Êµµ·ÏÇÑ´Ù.. CDnPileAddEffectBlow* pPileAddEffectBlow = static_cast(hNowBlow.GetPointer()); if (pPileAddEffectBlow && pPileAddEffectBlow->IsActivatedBlow()) iResult = ADD_FAIL_BY_COMBOLIMITBLOW; //µû·Î ¿­°ÅÇü Ãß°¡ ¾ÈÇÏ°í ±×³É ÀÌ ³à¼®À¸·Î »ç¿ëÇÔ.. } #endif // _GAMESERVER #if defined (_GAMESERVER) if (bCheckGuildPriority && hNowBlow->GetBlowIndex() == BlowIndex) { const CDnSkill::SkillInfo * pNowSkillInfo = static_cast(hNowBlow.GetPointer())->GetParentSkillInfo(); if (pNowSkillInfo->eDurationType == pParentSkill->eDurationType && pNowSkillInfo->bIsGuildSkill) { //°°Àº ºí·Î¿ì È¿°ú°¡ Àִµ¥ ±æµå½ºÅ³·Î »ç¿ëµÈ°ÍÀ̶ó¸é »ç¿ëºÒ°¡! iResult = ADD_FAIL_BY_GUILDBLOW_PRIORITY; } } #endif } ++iter; } return iResult; } void CDnStateBlow::_CheckImmediatelyBegin( DnBlowHandle hBlow ) { if( STATE_BLOW::BLOW_025 == hBlow->GetBlowIndex() ) { // ÆÀ ¹ÝÀü °°Àº »óÅÂÈ¿°úµµ À־ ÆÀÀÌ ¹ÝÀüµÇ¸é À¯È¤ »óÅÂÈ¿°ú ÀÌÆåÆ®°¡ // ¸÷°ú °°Àº ÆÀÀÌ µÇ¾î ºÙÁú ¾ÊÀ¸¹Ç·Î ¸ÕÀú ÀÌÆåÆ®¸¦ ó¸®ÇÑ´Ù. #14128 #ifndef _GAMESERVER if( hBlow->IsUseTableDefinedGraphicEffect() ) hBlow->AttachGraphicEffectDefaultType(); #else hBlow->CheckAndStartActorActionInEffectInfo(); #endif hBlow->OnBegin( 0, 0.0f ); m_hActor->OnBeginStateBlow( hBlow ); // °ð¹Ù·Î end ·Î ¼ÂÆÃÇÏ´Â blow µµ Àֱ⠶§¹®¿¡ üũ. if( STATE_BLOW::STATE_END != hBlow->GetBlowState() ) hBlow->SetState( STATE_BLOW::STATE_DURATION ); } } int CDnStateBlow::AddStateBlow( DnBlowHandle hBlow ) { ASSERT(hBlow&&"CDnStateBlow::AddStateBlow"); if( !hBlow ) return -1; if( false == hBlow->IsDuplicated() ) hBlow->SetBlowID( GenerateStateBlowID() ); #ifndef _GAMESERVER if( m_bAllowDiffuseVariation ) { const CDnSkill::SkillInfo* pParentSkillInfo = hBlow->GetParentSkillInfo(); std::string effectOutputIDs = pParentSkillInfo ? pParentSkillInfo->effectOutputIDs : ""; #ifdef PRE_ADD_SKILL_ADDTIONAL_BUFF // ÇØ´ç½ºÅ³ÀÌ Àû¿¡°Ô ¿µÇâÀ» ¹ÌÄ¡´Â°æ¿ìÀ̸ç , Debuff°¡ ¼³Á¤ÀÌ µÈ°æ¿ì¿¡´Â ¼³Á¤µÈ µð¹öÇÁ Á¤º¸·Î ¼ÂÆÃÇØÁØ´Ù. if(pParentSkillInfo && pParentSkillInfo->iSkillUserTeam != hBlow->GetActorHandle()->GetTeam()) { //Debuff ÀÌÆåÆ® ¼³Á¤ÀÌ ÀÖ´ÂÁö È®ÀÎ ÇØ¼­... std::vector infoTokens; std::string delimiters = ";"; bool isDebuggEffect = false; TokenizeA(pParentSkillInfo->debuffEffectOutputIDs, infoTokens, delimiters); int nTokenSize = (int)infoTokens.size(); for (int i = 0; i < nTokenSize; ++i) { int nEffectOutputID = atoi(infoTokens[i].c_str()); if (nEffectOutputID != 0) { isDebuggEffect = true; break; } } //Á¤»óÀûÀÎ °ªÀÌ ÀÖ´Â °æ¿ì.. debuffÀÌÆåÆ® ¼³Á¤À¸·Î º¯°æÇÑ´Ù. if (isDebuggEffect) effectOutputIDs = pParentSkillInfo->debuffEffectOutputIDs; } #endif EffectOutputInfo *pEffectInfo = NULL; std::vector infoTokens; std::string delimiters = ";"; TokenizeA(effectOutputIDs, infoTokens, delimiters); int nTokenSize = (int)infoTokens.size(); for (int i = 0; i < nTokenSize; ++i) { int nEffectOutputID = atoi(infoTokens[i].c_str()); pEffectInfo = GetEffectOutputInfo(nEffectOutputID); if (pEffectInfo && hBlow->IsMatchStateEffectIndex(pEffectInfo->iStateEffectIndex)) { hBlow->SetEffectOutputInfo(pEffectInfo); } } } #endif ++m_aiApplied[ hBlow->GetBlowIndex() ]; m_listBlowHandle.push_back( hBlow ); _CheckImmediatelyBegin( hBlow ); return hBlow->GetBlowID(); } int CDnStateBlow::RemoveStateBlowByBlowDefineIndex( STATE_BLOW::emBLOW_INDEX emBlowIndex ) { // ÇØ´ç BlowID¸¦ ³Ñ°Ü ¹Þ¾Æ¼­ ó¸® ÇÏ´Â ºÎºÐÀÌ ¾øÀ½. ±×·¡¼­ -1·Î ¸®ÅÏÇϵµ·ÏÇϴµ¥.. ¾î¶³Áö...[2010/12/14 semozz] AddRemoveStateBlowInfo(RemoveStateBlowInfo(RemoveStateBlowInfo::RSBI_BLOW_INDEX, emBlowIndex)); return -1; } void CDnStateBlow::GetStateBlowFromBlowIndex( STATE_BLOW::emBLOW_INDEX emBlowIndex, /*IN OUT*/ DNVector(DnBlowHandle)& vlhResult ) { int nIndex = -1; DnBlowHandle hFindedBlow; BLOW_HANDLE_LIST_ITER iter = m_listBlowHandle.begin(); for( ; iter != m_listBlowHandle.end(); ) { DnBlowHandle hBlow = (*iter); if( hBlow && (hBlow->GetBlowIndex() == emBlowIndex) ) { vlhResult.push_back( hBlow ); } ++iter; } } bool CDnStateBlow::IsExistStateBlowFromBlowIndex( STATE_BLOW::emBLOW_INDEX emBlowIndex ) { BLOW_HANDLE_LIST_ITER iter = m_listBlowHandle.begin(); for( ; iter != m_listBlowHandle.end(); ++iter) { if( (*iter) && ((*iter)->GetBlowIndex() == emBlowIndex) ) return true; } return false; } bool CDnStateBlow::IsExistStateBlowFromBlowID( int nBlowID ) { BLOW_HANDLE_LIST_ITER iter = m_listBlowHandle.begin(); for( ; iter != m_listBlowHandle.end(); ++iter ) { if( (*iter) && ((*iter)->GetBlowID() == nBlowID) ) return true; } return false; } DnBlowHandle CDnStateBlow::GetStateBlowFromID( int nStateBlowID ) { DnBlowHandle hFindedBlow; BLOW_HANDLE_LIST_ITER iter = m_listBlowHandle.begin(); for( ; iter != m_listBlowHandle.end(); ++iter ) { DnBlowHandle hBlow = (*iter); if( hBlow && (hBlow->GetBlowID() == nStateBlowID) ) { hFindedBlow = hBlow; break; } } return hFindedBlow; } #ifndef _GAMESERVER DnBlowHandle CDnStateBlow::GetStateBlowFromServerID( int nServerID ) { DnBlowHandle hFindedBlow; BLOW_HANDLE_LIST_ITER iter = m_listBlowHandle.begin(); for( ; iter != m_listBlowHandle.end(); ++iter ) { DnBlowHandle hBlow = (*iter); if( hBlow && (hBlow->GetServerBlowID() == nServerID) ) { hFindedBlow = hBlow; break; } } return hFindedBlow; } #endif void CDnStateBlow::RemoveStateBlowFromID( int nStateBlowID ) { AddRemoveStateBlowInfo(RemoveStateBlowInfo(RemoveStateBlowInfo::RSBI_BLOW_ID, nStateBlowID)); } DnBlowHandle CDnStateBlow::CreateStateBlow( DnActorHandle hActor, const CDnSkill::SkillInfo* pParentSkill, STATE_BLOW::emBLOW_INDEX emBlowIndex, int nDurationTime, const char *szParam ) { DnBlowHandle hBlow; //242¹ø »óÅÂÈ¿°ú´Â Áö¼Ó ½Ã°£À» ¹«ÇÑ´ë·Î? ÀÚµ¿ ¼³Á¤ Çϵµ·Ï ÇÑ´Ù.. //»óÅÂÈ¿°ú ÀÚü¿¡¼­ ProcessÇÔ¼ö¿¡¼­ Á¶°Ç¿¡ ¸ÂÀ¸¸é ÀÚµ¿ Á¾·á Çϵµ·Ï ÇÑ´Ù(¼­¹öÂÊ¿¡¼­¸¸ µ¿ÀÛ) if (emBlowIndex == STATE_BLOW::BLOW_242) nDurationTime = -1; // À̽´ 6190 °ü·Ã. //Áßø // È¿°ú Áßø °³¼ö°¡ 1 ÀÌ»óÀÎ ½ºÅ³ÀÇ °æ¿ì ·¹º§ÀÇ °°Àº ½ºÅ³ÀÌ ÃÖ´ë Áßø°³¼ö±îÁö Áߺ¹µÇ¾î Àû¿ëµÈ´Ù. // È¿°ú Áßø °³¼ö°¡ 1 ÀÌ»óÀ̳ª ½ºÅ³ÀÇ ·¹º§ÀÌ Æ²¸± °æ¿ì¿¡´Â º°µµ·Î Àû¿ëÇÑ´Ù. // ÃÖ´ë Áßø°³¼ö±îÁö Àû¿ëµÇ¾úÀ»¶§ ÁßøÀÌ µÇ´Â Á¶°ÇÀÇ È¿°ú°¡ Ãß°¡·Î Àû¿ëµÇ¸é Áö¼Ó½Ã°£¸¸ ´Ù½Ã ÃʱâÈ­ µÈ´Ù. // Á¢µÎ¾î ½ºÅ³ÀÇ »óÅÂÈ¿°úÀÎ °æ¿ì Áßø 󸮸¦ ÇÏÁö ¾Ê´Â´Ù. bool bItemPrefixSkill = false; if( pParentSkill && pParentSkill->bItemPrefixSkill ) bItemPrefixSkill = true; bool bDuplicated = false; float fReduceTimeValue = 1.0f; if (pParentSkill && pParentSkill->eDurationType != CDnSkill::DurationTypeEnum::Instantly) { fReduceTimeValue = GetImmuneReduceTimeValue(emBlowIndex); nDurationTime = (int)((float)nDurationTime * fReduceTimeValue); #ifdef PRE_ADD_DECREASE_EFFECT #ifdef _GAMESERVER if( hActor && emBlowIndex != STATE_BLOW::BLOW_247 && fReduceTimeValue != 1.0f ) { hActor->SendAddSEFail( CDnStateBlow::ADD_DECREASE_EFFECT_BY_IMMUNE, emBlowIndex ); } #endif // _GAMESERVER #endif // PRE_ADD_DECREASE_EFFECT } //#56880 242¹ø »óÅÂÈ¿°ú´Â Áßø ó¸® ¾ÈµÇ¾î¾ß ÇÑ´Ù... //#52905 253¹ø »óÅÂÈ¿°ú´Â Áßø ó¸® ¾ÈµÇ¾î¾ß ÇÑ´Ù... if( emBlowIndex != STATE_BLOW::BLOW_242 && emBlowIndex != STATE_BLOW::BLOW_253 && false == bItemPrefixSkill && 0 < m_aiApplied[ emBlowIndex ] ) { DNVector(DnBlowHandle) vlhResult; GetStateBlowFromBlowIndex( emBlowIndex, vlhResult ); _ASSERT( !vlhResult.empty() ); int iNumBlow = (int)vlhResult.size(); for( int iBlow = 0; iBlow < iNumBlow; ++iBlow ) { DnBlowHandle hExistBlow = vlhResult.at( iBlow ); if( STATE_BLOW::STATE_END != hExistBlow->GetBlowState() ) { const CDnSkill::SkillInfo* pExistParentSkillInfo = hExistBlow->GetParentSkillInfo(); if( pExistParentSkillInfo && pParentSkill ) { // ½ºÅ³°ú ·¹º§ÀÌ °°Àº°æ¿ì´Â È¿°ú¸¦ Áßø½Ãŵ´Ï´Ù. bool bLevelCheck = pExistParentSkillInfo->iSkillLevelID == pParentSkill->iSkillLevelID; bool bIndexCheck = pExistParentSkillInfo->iSkillID == pParentSkill->iSkillID; // #65533 PileAddEffect °°Àº°æ¿ì´Â ¼­·Î ´Ù¸¥ ·¹º§¿¡ ÀÇÇØ »ý¼ºµÇ¾îµµ Áßø½Ã۵µ·Ï ¼³Á¤ÇÕ´Ï´Ù. if( emBlowIndex == STATE_BLOW::BLOW_249 ) bLevelCheck = true; if( bLevelCheck && bIndexCheck ) { STATE_BLOW BlowInfo; BlowInfo.emBlowIndex = emBlowIndex; if( nDurationTime != -1 ) BlowInfo.fDurationTime = (float)nDurationTime * 0.001f; else BlowInfo.fDurationTime = 0.0f; BlowInfo.szValue = szParam; //#53448 Áßø½Ã ÃÖÁ¾ Ÿ°ÝÀÚ·Î SkillUser¸¦ º¯°æ ÇØÁà¾ß ÇÑ´Ù. if (emBlowIndex == STATE_BLOW::BLOW_249) hExistBlow->SetParentSkillInfo(pParentSkill); hExistBlow->Duplicate( BlowInfo ); hBlow = hExistBlow; bDuplicated = true; // Remove List ¿¡ ÀÖ´Â °Å »©ÁݽôÙ. REMOVE_STATEBLOW_LIST::iterator removeInfoiter = m_RemoveStateBlowList.begin(); REMOVE_STATEBLOW_LIST::iterator removeInfoEndIter = m_RemoveStateBlowList.end(); for( REMOVE_STATEBLOW_LIST::iterator it = m_RemoveStateBlowList.begin(); it != m_RemoveStateBlowList.end(); it++ ) { if( it->m_Type == RemoveStateBlowInfo::RSBI_BLOW_ID && hExistBlow->GetBlowID() == it->m_Value ) { m_RemoveStateBlowList.erase( it ); break; } } } } } } } if( false == bDuplicated ) { static CDnCreateBlow createBlow; #ifdef PRE_MOD_MAGICALBREEZE_CHANGE_BLOW STATE_BLOW::emBLOW_INDEX emOriginalBlowIndex = emBlowIndex; emBlowIndex = CheckMagicalBreezeChangeBlow( pParentSkill, emBlowIndex, hActor ); hBlow = createBlow.CreateBlow( emBlowIndex, hActor, szParam ); if( !hBlow ) return hBlow; hBlow->SetOriginalBlowIndex( emOriginalBlowIndex ); #else // PRE_MOD_MAGICALBREEZE_CHANGE_BLOW hBlow = createBlow.CreateBlow( emBlowIndex, hActor, szParam ); if( !hBlow ) return hBlow; #endif // PRE_MOD_MAGICALBREEZE_CHANGE_BLOW if( nDurationTime == -1 ) hBlow->SetPermanent( true ); else hBlow->SetDurationTime( nDurationTime * 0.001f ); #ifdef PRE_ADD_DECREASE_EFFECT #ifdef _GAMESERVER if( emBlowIndex == STATE_BLOW::BLOW_247 && fReduceTimeValue != 1.0f ) { CDnPuppetBlow* pDnPuppetBlow = dynamic_cast( hBlow.GetPointer() ); if( pDnPuppetBlow ) pDnPuppetBlow->SetShowReduce( true ); } #endif // _GAMESERVER #endif // PRE_ADD_DECREASE_EFFECT } return hBlow; } #ifdef PRE_MOD_MAGICALBREEZE_CHANGE_BLOW STATE_BLOW::emBLOW_INDEX CDnStateBlow::CheckMagicalBreezeChangeBlow( const CDnSkill::SkillInfo* pParentSkill, STATE_BLOW::emBLOW_INDEX emBlowIndex, DnActorHandle hActor ) { STATE_BLOW::emBLOW_INDEX emRtnBlowIndex = emBlowIndex; #ifdef _GAMESERVER if( hActor == NULL ) return emRtnBlowIndex; if( pParentSkill == NULL ) return emRtnBlowIndex; if( pParentSkill->eApplyType != CDnSkill::StateEffectApplyType::ApplySelf || pParentSkill->eSkillType != CDnSkill::SkillTypeEnum::Active ) return emRtnBlowIndex; if( pParentSkill->bIsItemSkill ) return emRtnBlowIndex; if( hActor->IsAppliedThisStateBlow( STATE_BLOW::BLOW_180 ) ) { switch( emBlowIndex ) { case STATE_BLOW::BLOW_001: // ¹°¸® °ø°Ý·Â Àý´ë°ª º¯°æ -> ¸¶¹ý °ø°Ý·Â Àý´ë°ª º¯°æ emRtnBlowIndex = STATE_BLOW::BLOW_028; break; case STATE_BLOW::BLOW_002: // ¹°¸® °ø°Ý·Â Àý´ë°ª º¯°æ -> ¸¶¹ý °ø°Ý·Â Àý´ë°ª º¯°æ emRtnBlowIndex = STATE_BLOW::BLOW_029; break; case STATE_BLOW::BLOW_200: // ¹°¸® °ø°Ý·Â Àý´ë°ª º¯°æ »óÅÂÈ¿°ú. ½ºÅ³ »óÅÂÈ¿°ú °è»ê µÇ±â Àü¿¡ ¸ÕÀú °è»êµÊ. emRtnBlowIndex = STATE_BLOW::BLOW_202; // ->¸¶¹ý °ø°Ý·Â Àý´ë°ª º¯°æ »óÅÂÈ¿°ú. ½ºÅ³ »óÅÂÈ¿°ú °è»ê µÇ±â Àü¿¡ ¸ÕÀú °è»êµÊ. break; case STATE_BLOW::BLOW_201: // ¹°¸® °ø°Ý·Â ºñÀ² º¯°æ »óÅÂÈ¿°ú. ½ºÅ³ »óÅÂÈ¿°ú °è»ê µÇ±â Àü¿¡ ¸ÕÀú °è»êµÊ. emRtnBlowIndex = STATE_BLOW::BLOW_203; // ->¸¶¹ý °ø°Ý·Â ºñÀ² º¯°æ »óÅÂÈ¿°ú. ½ºÅ³ »óÅÂÈ¿°ú °è»ê µÇ±â Àü¿¡ ¸ÕÀú °è»êµÊ. break; } } #endif // _GAMESERVER return emRtnBlowIndex; } #endif // PRE_MOD_MAGICALBREEZE_CHANGE_BLOW int CDnStateBlow::GenerateStateBlowID() { #ifdef _GAMESERVER s_iStateBlowIDCount[ m_hActor->GetRoom()->GetRoomID() ]++; if( s_iStateBlowIDCount[ m_hActor->GetRoom()->GetRoomID() ] >= INT_MAX ) s_iStateBlowIDCount[ m_hActor->GetRoom()->GetRoomID() ] = 0; return s_iStateBlowIDCount[ m_hActor->GetRoom()->GetRoomID() ]; #else s_iStateBlowIDCount++; if( s_iStateBlowIDCount >= INT_MAX ) s_iStateBlowIDCount = 0; return s_iStateBlowIDCount; #endif } void CDnStateBlow::OnChangedWeapon() { DnBlowHandle hBlow; m_bLockStateBlowList = true; BLOW_HANDLE_LIST_ITER iter = m_listBlowHandle.begin(); for( ; iter != m_listBlowHandle.end(); ++iter ) { hBlow = (*iter); if( hBlow && (hBlow->GetCallBackType()&SB_ONCHANGEDWEAPON) ) { hBlow->OnChangedWeapon(); } } m_bLockStateBlowList = false; } bool CDnStateBlow::OnDefenseAttack( DnActorHandle hHitter, CDnState* pAttackerState, CDnDamageBase::SHitParam &HitParam, bool bHitSuccess ) { DnBlowHandle hBlow; bool bRetDefense(bHitSuccess); m_bLockStateBlowList = true; BLOW_HANDLE_LIST_ITER iter = m_listBlowHandle.begin(); for( ; iter != m_listBlowHandle.end(); ++iter ) { hBlow = (*iter); if( hBlow && (hBlow->GetCallBackType()&SB_ONDEFENSEATTACK) ) { if( hBlow->OnDefenseAttack( hHitter, pAttackerState, HitParam, bHitSuccess ) ) { bRetDefense = false; } } } if( bRetDefense ) { iter = m_listBlowHandle.begin(); for( ; iter != m_listBlowHandle.end(); ++iter ) { hBlow = (*iter); if( hBlow && (hBlow->GetCallBackType()&SB_AFTERONDEFENSEATTACK) ) { if( hBlow->OnDefenseAttack( hHitter, pAttackerState, HitParam, bHitSuccess ) ) { bRetDefense = false; } } } } m_bLockStateBlowList = false; return bRetDefense; } int CDnStateBlow::OnUseMP( int iMPDelta ) { int iResult = iMPDelta; DnBlowHandle hBlow; m_bLockStateBlowList = true; BLOW_HANDLE_LIST_ITER iter = m_listBlowHandle.begin(); int iDelta = 0; for( ; iter != m_listBlowHandle.end(); ++iter ) { hBlow = (*iter); if( hBlow && (hBlow->GetCallBackType()&SB_ONUSEMP) ) iDelta += hBlow->OnUseMP( iMPDelta ); } m_bLockStateBlowList = false; iResult += iDelta; return iResult; } void CDnStateBlow::DelAllStateBlow() { DnBlowHandle hBlow; BLOW_HANDLE_LIST_ITER iter = m_listBlowHandle.begin(); for( ; iter != m_listBlowHandle.end(); ++iter ) { hBlow = (*iter); if( hBlow ) { if( hBlow->IsDuration() ) { if( !m_hActor ) g_Log.Log(LogType::_ROOMCRASH, L"[DelAllStateBlow] Invalid ActorHandle\n" ); } SAFE_RELEASE_SPTR( hBlow ); } } m_listBlowHandle.clear(); } DnBlowHandle CDnStateBlow::GetStateBlow( int iIndex ) { BLOW_HANDLE_LIST_ITER iter = m_listBlowHandle.begin(); for( int i = 0; i < iIndex; ++i ) ++iter; return *iter; } float CDnStateBlow::OnCalcDamage( float fOriginalDamage, CDnDamageBase::SHitParam& HitParam ) { float fResult = 0.0f; DnBlowHandle hBlow; DnBlowHandle hHighLanderBlow; DnBlowHandle hProbInvincibleAtBlow; float fStateBlowResult = 0.0f; float fHighLanderResult = 0.0f; float fProbInvincibleAtBlow = 0.0f; m_bLockStateBlowList = true; BLOW_HANDLE_LIST_ITER iter = m_listBlowHandle.begin(); for( ; iter != m_listBlowHandle.end(); ++iter ) { hBlow = (*iter); if( hBlow && (hBlow->GetCallBackType()&SB_ONCALCDAMAGE) ) { fStateBlowResult = hBlow->OnCalcDamage( fOriginalDamage, HitParam ); if( STATE_BLOW::BLOW_143 == hBlow->GetBlowIndex() ) { hHighLanderBlow = hBlow; fHighLanderResult = fStateBlowResult; } else if( STATE_BLOW::BLOW_226 == hBlow->GetBlowIndex() ) { hProbInvincibleAtBlow = hBlow; fProbInvincibleAtBlow = fStateBlowResult; } fResult += fStateBlowResult; } } m_bLockStateBlowList = false; // ÇÏÀÌ·£´õ, ƯÁ¤ ½ºÅ³ È®·ü ¹«½Ã »óÅÂÈ¿°ú°¡ ÀÖ´Ù¸é ÇØ´ç °á°ú°ªÀÌ ¿ì¼±. (µ¥¹ÌÁö ¾øÀ½) if( hHighLanderBlow ) fResult = fHighLanderResult; else if( hProbInvincibleAtBlow && fProbInvincibleAtBlow != 0.0f) //µ¥¹ÌÁö º¸Á¤°ªÀÌ ÀÖÀ» °æ¿ì¸¸. fResult = fProbInvincibleAtBlow; return fResult; } bool CDnStateBlow::OnDie( DnActorHandle hHitter ) { bool bProcessed = false; // ÇöÀç´Â Á×À» ¶§ ½ºÅ³ ¾²´Â »óÅÂÈ¿°ú ¹Û¿¡ ¾øÀ¸¹Ç·Î ·çÇÁ µ¹Áö ¾Ê°í Á÷Á¢ Áö¸ñÇØ¼­ ó¸®. if( IsApplied( STATE_BLOW::BLOW_137 ) ) { BLOW_HANDLE_LIST_ITER iter = m_listBlowHandle.begin(); for( ; iter != m_listBlowHandle.end(); ++iter ) { DnBlowHandle hBlow = (*iter); if( hBlow && hBlow->GetBlowIndex() == STATE_BLOW::BLOW_137 ) { static_cast(hBlow.GetPointer())->OnDie(); #if defined(PRE_FIX_44884) //UsingSkillWhenDieBlow°¡ ¼³Á¤µÈ ¾×ÅÍ´Â OnDieÈ£Ãâ½Ã HP¸¦ 1·Î ¼³Á¤µÇ¾î OnDieÈ£Ãâ ½ÃÁ¡À» »óÅÂÈ¿°ú 󸮷Π¹Ì·é´Ù. //½ÇÁ¦ Hitter¸¦ ¾Ë ¼ö ¾ø´Â »óȲÀÌ¶ó ¿©±â¿¡¼­ ÀúÀå ÇØ³õ´Â´Ù. static_cast(hBlow.GetPointer())->SetFinalHitterActor(hHitter); #endif // PRE_FIX_44884 bProcessed = true; } } } return bProcessed; } void CDnStateBlow::OnTargetHit( DnActorHandle hTargetActor ) { DnBlowHandle hBlow; m_bLockStateBlowList = true; BLOW_HANDLE_LIST_ITER iter = m_listBlowHandle.begin(); for( ; iter != m_listBlowHandle.end(); ++iter ) { hBlow = (*iter); if( hBlow && (hBlow->GetCallBackType()&SB_ONTARGETHIT) ) { hBlow->OnTargetHit( hTargetActor ); } } m_bLockStateBlowList = false; } void CDnStateBlow::ResetStateBlowBySkillType( int nSkillDurationType ) { AddRemoveStateBlowInfo(RemoveStateBlowInfo(RemoveStateBlowInfo::RSBI_SKILL_DURATION_TYPE, nSkillDurationType)); } #ifndef _GAMESERVER void CDnStateBlow::RestoreAllBlowGraphicEffect() { BLOW_HANDLE_LIST_ITER iter = m_listBlowHandle.begin(); for( ; iter != m_listBlowHandle.end(); ++iter) { DnBlowHandle hBlow = *iter; if( !hBlow ) continue; if( hBlow->IsUseTableDefinedGraphicEffect() ) { hBlow->AttachGraphicEffectDefaultType(); } } } EffectOutputInfo *CDnStateBlow::GetEffectOutputInfo( int nItemID ) { std::map::iterator it = s_nMapEffectOutputInfo.find( nItemID ); if( it == s_nMapEffectOutputInfo.end() ) return NULL; return it->second; } #ifndef _GAMESERVER void CDnStateBlow::RemoveStateBlowFromServerID( int nServerBlowID ) { AddRemoveStateBlowInfo(RemoveStateBlowInfo(RemoveStateBlowInfo::RSBI_BLOW_SERVER_ID, nServerBlowID)); } #endif #if !defined(SW_MODIFY_SE_EFFECTOUTPUT_20091119_jhk8211) void CDnStateBlow::AddEffectAttachedBone( int iBone, DnEtcHandle hEffectHandle ) { // ÇöÀç 0 ¹ø º»À» Á¦¿ÜÇϰí Áßø ±³Â÷ Ãâ·Â ÇÏÁö ¾ÊÀ½. ±×³É ´Ù º¸¿©ÁÜ. #16291 if( CDnActor::FXDummyBoneEnum::FX_01 != iBone ) return; // ·çÇÁ µ¹¸é¼­ °ãÄ¡´Â º»Àº ÀÏÁ¤ ½Ã°£¸¶´Ù º¯°æÇؼ­ »Ñ·ÁÁÖÀÚ. _ASSERT( 0 <= iBone && iBone < CDnActor::Max_FX_Dummy_Bone ); if( 0 <= iBone && iBone < CDnActor::Max_FX_Dummy_Bone ) { S_BONE_EFFECT BoneEffect; BoneEffect.hEffect = hEffectHandle; // óÀ½ Ãß°¡µÇ´Â °ÍÀ̶ó¸é show ó¸®. // show( false ) °¡ ·»´õ¸µ µÇ°í ³­ ÈÄ ºÎÅÍ´Â ¾È ¸Ô´Â´Ù. if( m_aListBoneEffectStatus[ iBone ].empty() ) BoneEffect.Show( true ); else BoneEffect.Show( false ); m_aListBoneEffectStatus[ iBone ].push_back( BoneEffect ); } } void CDnStateBlow::DelEffectAttachedBone( int iBone, DnEtcHandle hEffectHandle ) { // ÇöÀç 0 ¹ø º»À» Á¦¿ÜÇϰí Áßø ±³Â÷ Ãâ·Â ÇÏÁö ¾ÊÀ½. ±×³É ´Ù º¸¿©ÁÜ. #16291 if( CDnActor::FXDummyBoneEnum::FX_01 != iBone ) return; _ASSERT( 0 <= iBone && iBone < CDnActor::Max_FX_Dummy_Bone ); if( 0 <= iBone && iBone < CDnActor::Max_FX_Dummy_Bone ) { list& listBoneEffect = m_aListBoneEffectStatus[ iBone ]; list::iterator iter = find( listBoneEffect.begin(), listBoneEffect.end(), hEffectHandle ); if( listBoneEffect.end() != iter ) { // ÇöÀç ÁßøµÈ ÀÌÆåÆ® º» ÀÚ¸®À̸ç Áö±Ý »èÁ¦ÇÒ ³à¼®ÀÌ ÇöÀç ¹ßµ¿ÁßÀ̶ó¸é.. // ´ÙÀ½ º»¿¡°Ô °ðÀå Â÷·Ê¸¦ ³Ñ±ä´Ù. // ÀÌ¹Ì ¾îµð¼±°¡ ÀÌÆåÆ® °´Ã¼°¡ »èÁ¦µÇ¾ú´Ù¸é bone effect status list ¿¡¼­ »èÁ¦¸¸ ÇÑ´Ù. if( 1 < (int)listBoneEffect.size() ) { if( iter->bShow ) { list::iterator iterNext = iter; iterNext++; if( listBoneEffect.end() == iterNext ) iterNext = listBoneEffect.begin(); iterNext->Show( true ); } } m_aListBoneEffectStatus[ iBone ].erase( iter ); } } } #endif #endif void CDnStateBlow::OnCmdActionFromPacket( const char* pActionName ) { BLOW_HANDLE_LIST_ITER iter = m_listBlowHandle.begin(); BLOW_HANDLE_LIST_ITER iterEnd = m_listBlowHandle.end(); for( iter; iter != iterEnd; ++iter ) { if( *iter ) (*iter)->OnCmdActionFromPacket( pActionName ); } } #ifdef _GAMESERVER CDnSkill::CanApply CDnStateBlow::CanApplySkillStateEffect(const CDnSkill::SkillInfo *pUsingSkillInfo, const CDnSkill::StateEffectStruct &newStateEffect) { // »óÅÂÈ¿°ú °Ë»çÇÒ¶§ ¸®¼Â¸®½ºÆ® ÃʱâÈ­ [2010/12/09 semozz] if (m_hActor) m_hActor->InitStateBlowIDToRemove(); CDnSkill::CanApply eResult = CDnSkill::CanApply::Apply; // 1. »õ·Î¿î »óŰ¡ Áö¼Ó ½Ã°£ÀÌ ÀÖ´Ù¸é Ãß°¡ ½ÃŲ´Ù. if ((CDnSkill::IsNeedCheckApplyStateBlow( (STATE_BLOW::emBLOW_INDEX)newStateEffect.nID)) || (newStateEffect.nDurationTime > 0) ) { // [2010/11/12 semozz] // 2. Áö¼Ó ½Ã°£ÀÌ ÀÖ´Â StateBlowÀÏ °æ¿ì // ÀÏ´Ü ±âÁ¸ ½ºÅ³ »ç¿ë ¿©ºÎ üũ¿Í µ¿ÀÏÇÑ ÄÚµå »ç¿ë.. // ÀÌ ºÎºÐÀº °ËÅä ÇÊ¿ä STATE_BLOW::emBLOW_INDEX newBlowIndex = (STATE_BLOW::emBLOW_INDEX)newStateEffect.nID; if( IsApplied( newBlowIndex ) ) { DNVector(DnBlowHandle) vlhResult; GetStateBlowFromBlowIndex( newBlowIndex, vlhResult ); _ASSERT( !vlhResult.empty() ); vector vlStateBlowIDToRemove; DNVector( DnBlowHandle ) vlhSameSkillBlows; bool bExistingSameSkill = false; int iExistingSameSkillCount = 0; int iNumBlow = (int)vlhResult.size(); for( int iBlow = 0; iBlow < iNumBlow; ++iBlow ) { DnBlowHandle hExistingBlow = vlhResult.at( iBlow ); const CDnSkill::SkillInfo* pExistingParentSkillInfo = hExistingBlow ? hExistingBlow->GetParentSkillInfo() : NULL; // ¸ðü ½ºÅ³ Á¤º¸°¡ ¾ø´Â »óÅÂÈ¿°ú´Â ½ºÅ³·Î °É¸° °ÍÀÌ ¾Æ´Ï¹Ç·Î ¿©±â¼­ ´Ù·ê ´ë»óÀÌ ¾Æ´Ô if ( NULL == pExistingParentSkillInfo ) continue; // ½ºÅ³ Áߺ¹ Ä«¿îÆ® üũ // °°Àº ½ºÅ³ ¾ÆÀ̵𿡠µ¿ÀÏÇÑ »óÅÂÈ¿°ú°¡ ¶Ç ³ªÅ¸³­´Ù¸é Áߺ¹µÈ ½ºÅ³ÀÓ. bool bIsSameSkillID = false; #if defined(PRE_FIX_58505) //Á¢¹Ì»ç ½ºÅ³ ŸÀÔÀÌ ¼³Á¤ µÇ¾î ÀÖÁö ¾ÊÀ¸¸é ½ºÅ³ ¾ÆÀ̵ð·Î ºñ±³Çϰí, //Á¢¹Ì»ç ½ºÅ³ ŸÀÔÀÌ ¼³Á¤ µÇ¾î ÀÖÀ¸¸é Á¢¹Ì»ç ½ºÅ³ ŸÀÔÀÌ °°ÀºÁö ºñ±³. if ( pUsingSkillInfo->bItemPrefixSkill == true && pUsingSkillInfo->nPrefixSkillType != CDnPrefixSkill::Prefix_Non ) bIsSameSkillID = pUsingSkillInfo->nPrefixSkillType == pExistingParentSkillInfo->nPrefixSkillType; else bIsSameSkillID = pUsingSkillInfo->iSkillID == pExistingParentSkillInfo->iSkillID; #else if( pUsingSkillInfo->iSkillID == pExistingParentSkillInfo->iSkillID ) bIsSameSkillID = true; #endif // PRE_FIX_58505 if (bIsSameSkillID == true) { // °°Àº ½ºÅ³ ¾ÆÀ̵𰡠óÀ½ ³ª¿Â´Ù¸é óÀ½¿£ Àû¿ëÁß ½ºÅ³ Ä«¿îÆ® Çϳª ¿Ã·ÁÁÜ. iExistingSameSkillCount += hExistingBlow->GetDuplicateCount(); bExistingSameSkill = true; vlhSameSkillBlows.push_back( hExistingBlow ); } if (pUsingSkillInfo->eTargetType == CDnSkill::TargetTypeEnum::All //Áö±Ý »ç¿ë ÇÏ´Â ½ºÅ³ÀÇ TargetTypeÀÌ AllÀ̰í, && (0 != pUsingSkillInfo->iSkillDuplicateMethod && (pUsingSkillInfo->iSkillDuplicateMethod == pExistingParentSkillInfo->iSkillDuplicateMethod)) //Áßø ó¸®ID°¡ ¼³Á¤µÇ¾î ÀÖ°í, ±âÁ¸ ½ºÅ³°ú µ¿ÀÏÇÑ IDÀ϶§, && (m_hActor == pUsingSkillInfo->hSkillUser) //ÀÚ±â ÀڽŠ) continue; // Áö¼ÓÈ¿°ú ±¸ºÐ À妽º°¡ 0ÀÌ ¾Æ´Ï¶ó¸é ½ºÅ³ È¿°ú Áߺ¹ °ü·Ã 󸮰¡ ÇÊ¿äÇÔ. // Áö¼ÓÈ¿°ú ±¸ºÐ À妽º°¡ 0ÀÌ¸é ±×³É ÁßøµÊ. // ȤÀº °°Àº ½ºÅ³À̸鼭 ÃÖ´ë Áßø Ä«¿îÆ®°¡ 1ÀÌÇÏÀΰæ¿ì¿£ ½ºÅ³ ´ëüµÇµµ·Ï ó¸®. #if defined(PRE_FIX_58505) if( 0 != pUsingSkillInfo->iSkillDuplicateMethod || (bIsSameSkillID == true && pUsingSkillInfo->iDuplicateCount <= 1) ) #else if( 0 != pUsingSkillInfo->iSkillDuplicateMethod || (pUsingSkillInfo->iSkillID == pExistingParentSkillInfo->iSkillID && pUsingSkillInfo->iDuplicateCount <= 1) ) #endif // PRE_FIX_58505 { // ±âÁ¸¿¡ ½ÇÇàµÇ°í ÀÖ´ø ½ºÅ³°ú °°Àº Áö¼ÓÈ¿°ú À妽ºÀΰ¡. ±×·¸´Ù¸é ÁßøÀÌ °¡´ÉÇÑÁö üũµé¾î°£´Ù. // ¶ÇÇÑ ½ºÅ³À» ¾´ À¯ÀúÀÇ ÆÀÀÌ °°À»¶§¸¸ Á߸󏮏¦ Çϵµ·Ï ÇÑ´Ù. // ´Ù¸¥ ÆÀÀε¥ °°Àº ½ºÅ³À» ¾µ °æ¿ì ³ª¿¡°Ô °É¸° µð¹öÇÁ »óÅÂÈ¿°ú°¡ ÇØÁ¦µÇ¾î ¹ö¸°´Ù. (#19812) if( (pUsingSkillInfo->iSkillDuplicateMethod == pExistingParentSkillInfo->iSkillDuplicateMethod) && (pUsingSkillInfo->iSkillUserTeam == pExistingParentSkillInfo->iSkillUserTeam) ) { if( pUsingSkillInfo->iLevel >= pExistingParentSkillInfo->iLevel ) { // 242¹ø »óÅÂÈ¿°ú´Â Çѹø Ãß°¡°¡ µÇ¸é ¸®¼Â µÇ¸é ¾ÈµÈ´Ù. // È®·ü üũ¿¡¼­ Åë°úÇÑ´Ù¸é ¸®¼Â½Ãų »óÅÂÈ¿°ú¿¡ ³Ö¾îµÒ. // ½ÇÁ¦ È®·üüũÇÏ´Â °´Ã¼´Â ±âÁ¸¿¡ Àû¿ëµÈ »óÅÂÈ¿°ú °´Ã¼¸¦ »ç¿ëÇÏÁö¸¸ È®·ü¸¸ üũÇÏ´Â °ÍÀ̱⠶§¹®¿¡ // ±×´ë·Î »ç¿ëÇÑ´Ù. if( hExistingBlow->GetBlowIndex() != STATE_BLOW::BLOW_242 && hExistingBlow->CanBegin() ) { vlStateBlowIDToRemove.push_back( hExistingBlow->GetBlowID() ); //mapDuplicateResult[ hExistingBlow->GetBlowIndex() ] = true; // ¸®¼ÂµÇ¾î¾ßÇÒ »óŵéÀ» ´ã¾Æ ³õ´Â´Ù. [2010/12/08 semozz] // ¿©±â¼­ ¸®½ºÆ®¿¡ ´ã±ä »óŵéÀº OnSignalÀÇ STE_ApplyStateEffect ½ÃÁ¡¿¡ »óÅ Àû¿ëÇÒ¶§ // ±âÁ¸ÀÇ »óŸ¦ Á¦°Å ÇÑ´Ù. m_hActor->AddStateBlowIDToRemove(hExistingBlow->GetBlowID()); } else { eResult = CDnSkill::CanApply::Fail; // È¿°ú °»½Å ½Ã È®·ü üũ¿¡¼­ ½ÇÆÐÇßÀ¸¹Ç·Î Ãß°¡ÇÏÁö ¾Ê´Â´Ù. } } else if( pUsingSkillInfo->iLevel < pExistingParentSkillInfo->iLevel ) { // È¿°ú Àû¿ë ¾ÈµÊ. eResult = CDnSkill::CanApply::Fail; // Note Çѱâ: ÃßÈÄ¿¡ ±×·¡ÇÈÀûÀ¸·Î ¹º°¡ Ç¥½ÃÇØÁà¾ß ÇÑ´Ù¸é ÀÌ °÷¿¡¼­ ó¸®ÇÏ¸é µÊ. } } } } if( false == vlStateBlowIDToRemove.empty() ) { // ½ºÅ³ È¿°ú ´ëü. Áßø Ä«¿îÆ® ¼¼¾ú´ø °Í ó¸®ÇÒ ÇÊ¿ä ¾ø´Ù. bExistingSameSkill = false; eResult = CDnSkill::CanApply::ApplyDuplicateSameSkill; } // »óÅ ȿ°ú¸¦ ÁßÃ¸ÇØ¼­ Àû¿ëÇØ¾ßÇÏ´Â °æ¿ì, ÃÖ´ë Áßø °¹¼ö°¡ ³ÑÀ¸¸é ¾ÈµÈ´Ù. // ³ôÀº ·¹º§ÀÇ »óÅÂÈ¿°ú°¡ ÀÌ¹Ì Àû¿ëÁßÀ̶ó¸é Á߸󏮰¡ µÇÁö ¾Ê´Â´Ù. if( CDnSkill::CanApply::Fail != eResult ) { if( bExistingSameSkill ) { if( pUsingSkillInfo->iDuplicateCount <= iExistingSameSkillCount ) { // ÃÖ´ë Áßø °¹¼ö¸¦ ³Ñ´Â °æ¿ì ±âÁ¸ »óÅÂÈ¿°úÀÇ ½Ã°£¸¸ ÃʱâÈ­ ÇÑ´Ù. int iNumSameSkillBlowsToResetDurationTime = (int)vlhSameSkillBlows.size(); for( int iBlow = 0; iBlow < iNumSameSkillBlowsToResetDurationTime; ++iBlow ) { DnBlowHandle hBlow = vlhSameSkillBlows.at( iBlow ); //#53448 249¹ø »óÅÂÈ¿°ú °æ¿ì Áßø °¹¼ö ÀÌ»óÀº Ãß°¡ µÉ ¼ö ¾ø´Ù. //ÃÖ´ë Áßø °¹¼ö¸¦ ³ÑÀº °æ¿ì ¾Æ·¡ ·çÇÁ¸¦ µ¹¸é¼­ ±âÁ¸ »óÅÂÈ¿°ú Á¦°Å Çϰí, ´Ù½Ã Ãß°¡ ÀÛ¾÷ ÇÊ¿ä ¾øÀ½. if (hBlow && hBlow->GetBlowIndex() == STATE_BLOW::BLOW_249) continue; // ¾Æ¿¹ »èÁ¦Çß´Ù°¡ »õ·Î Ãß°¡ÇÏ´Â °ÍÀÌ ¸íÈ®ÇÔ. int nDurationTime = int(hBlow->GetDurationTime() * 1000.0f); hBlow->ResetDurationTime(); CDnSkill::SkillInfo SkillInfo = *(hBlow->GetParentSkillInfo()); STATE_BLOW::emBLOW_INDEX BlowIndex = hBlow->GetBlowIndex(); string strValue( hBlow->GetValue() ); // ÀÌ ½ÃÁ¡¿¡¼­ Áï½Ã Áö¿öÀú¾ß ÇÑ´Ù. [2011/01/18 semozz] int nBlowID = hBlow->GetBlowID(); // ÆÐŶ º¸³¾²¨ º¸³»°í m_hActor->SendRemoveStateEffectFromID(nBlowID); // ¹Ù·Î »èÁ¦ÇÑ´Ù.. if (m_hActor->GetStateBlow()) m_hActor->GetStateBlow()->RemoveImediatlyStateEffectFromID(nBlowID); // ¿©±â¿¡ °áºù°°Àº È®·ü ÀÖ´Â »óÅÂÈ¿°ú¸¦ 100% ¼º°ø½ÃÄÑ¾ß ÇϹǷΠ// CanBegin ÇÔ¼ö È£ÃâÇÏÁö ¾Êµµ·Ï bCheckCanBegin Ç÷¡±×¸¦ ²¨¼­ È£Ãâ. m_hActor->CmdAddStateEffect( &SkillInfo, BlowIndex, nDurationTime, strValue.c_str(), false, false ); } eResult = CDnSkill::CanApply::Fail; } } } } } return eResult; } #endif bool RemoveStateBlowInfo::Compare(DnBlowHandle hBlow) { bool result = false; if (!hBlow) return result; switch(m_Type) { case RSBI_BLOW_INDEX: { if( hBlow->IsEternity() == false && hBlow->IsFromSourceItem() == false ) result = (hBlow->GetBlowIndex() == m_Value); } break; case RSBI_BLOW_ID: { result = (hBlow->GetBlowID() == m_Value); } break; case RSBI_SKILL_DURATION_TYPE: { const CDnSkill::SkillInfo* pSkillInfo = hBlow->GetParentSkillInfo(); result = ( pSkillInfo && (CDnSkill::DurationTypeEnum)m_Value == pSkillInfo->eDurationType ); } break; #if !defined(_GAMESERVER) case RSBI_BLOW_SERVER_ID: { result = (hBlow->GetServerBlowID() == m_Value); } break; #endif } return result; } void CDnStateBlow::RemoveStateBlowReservedList() { REMOVE_STATEBLOW_LIST::iterator removeInfoiter = m_RemoveStateBlowList.begin(); #ifndef _FINAL_BUILD _CrashIfRemoveListLocked(); #endif // #ifdef _FINAL_BUILD m_bLockRemoveReservedList = true; for (; removeInfoiter != m_RemoveStateBlowList.end(); ++removeInfoiter) { RemoveStateBlowInfo &removeInfo = (*removeInfoiter); DnBlowHandle hBlow; #ifndef _FINAL_BUILD _CrashIfProcessListLocked(); #endif // #ifdef _FINAL_BUILD m_bLockStateBlowList = true; BLOW_HANDLE_LIST_ITER blowListiter = m_listBlowHandle.begin(); for( ; blowListiter != m_listBlowHandle.end(); ) { hBlow = (*blowListiter); if (removeInfo.Compare(hBlow)) { //ResetStateBlowBySkillType ÇÔ¼ö¿¡¼­ ÆÐŶ Ŭ¶óÀÌ¾ðÆ®·Î º¸³»´Â ÄÚµå ÀÖÀ½. if (RemoveStateBlowInfo::RSBI_SKILL_DURATION_TYPE == removeInfo.m_Type) { #if defined(_GAMESERVER) STATE_BLOW::emBLOW_INDEX emBlowIndex = hBlow->GetStateBlow().emBlowIndex; // Ŭ¶ó¿¡°Ôµµ »èÁ¦Ç϶ó°í ÆÐŶ¸¸ ³¯·ÁÁÜ m_hActor->SendRemoveStateEffect(emBlowIndex); #endif // _GAMESERVER } _ASSERT( m_aiApplied[ hBlow->GetBlowIndex() ] > 0 ); --m_aiApplied[ hBlow->GetBlowIndex() ]; hBlow->OnEnd( 0, 0 ); m_hActor->OnEndStateBlow( hBlow ); SAFE_RELEASE_SPTR( hBlow ); blowListiter = m_listBlowHandle.erase(blowListiter); //BlowIndex, DuratioTypeÀº ÀüºÎ ã¾Æ¼­ Áö¿î´Ù. if (RemoveStateBlowInfo::RSBI_BLOW_INDEX == removeInfo.m_Type || RemoveStateBlowInfo::RSBI_SKILL_DURATION_TYPE == removeInfo.m_Type) continue; else break; } ++blowListiter; } m_bLockStateBlowList = false; } m_RemoveStateBlowList.clear(); m_bLockRemoveReservedList = false; } void CDnStateBlow::AddRemoveStateBlowInfo(RemoveStateBlowInfo info) { //»óÅÂÈ¿°ú Á¦°Å¸¦ À§ÇØ µî·ÏÀº ·çÇÁ µ¹¸é¼­µµ °¡´É.. m_RemoveStateBlowList.push_back(info); } void CDnStateBlow::RemoveImediatlyStateEffectFromID(int nStateBlowID) { #ifndef _FINAL_BUILD _CrashIfProcessListLocked(); #endif // #ifdef _FINAL_BUILD DnBlowHandle hBlow; BLOW_HANDLE_LIST_ITER iter = m_listBlowHandle.begin(); for( ; iter != m_listBlowHandle.end(); ++iter ) { hBlow = (*iter); if( hBlow && (hBlow->GetBlowID() == nStateBlowID) ) { _ASSERT( m_aiApplied[ hBlow->GetBlowIndex() ] > 0 ); --m_aiApplied[ hBlow->GetBlowIndex() ]; hBlow->OnEnd( 0, 0 ); m_hActor->OnEndStateBlow( hBlow ); OutputDebug("%s EndBlowID: %d Index: %d", __FUNCTION__, hBlow->GetBlowID(), hBlow->GetBlowIndex()); SAFE_RELEASE_SPTR( hBlow ); m_listBlowHandle.erase(iter); break; } } } void CDnStateBlow::RemoveImediatlyStateEffectByBlowIndex(STATE_BLOW::emBLOW_INDEX emBlowIndex) { #ifndef _FINAL_BUILD _CrashIfProcessListLocked(); #endif // #ifdef _FINAL_BUILD int nIndex = -1; DnBlowHandle hBlow; BLOW_HANDLE_LIST_ITER iter = m_listBlowHandle.begin(); for( ; iter != m_listBlowHandle.end(); ) { hBlow = (*iter); if( hBlow && ( ( hBlow->IsEternity() == false && hBlow->IsFromSourceItem() == false ) && hBlow->GetBlowIndex() == emBlowIndex ) ) { _ASSERT( m_aiApplied[ hBlow->GetBlowIndex() ] > 0 ); --m_aiApplied[ hBlow->GetBlowIndex() ]; hBlow->OnEnd( 0, 0 ); m_hActor->OnEndStateBlow( hBlow ); nIndex = hBlow->GetBlowID(); SAFE_RELEASE_SPTR( hBlow ); iter = m_listBlowHandle.erase(iter); continue; } ++iter; } } #if !defined(_GAMESERVER) void CDnStateBlow::RemoveImediatlyStateEffectByServerID(int nServerBlowID) { #ifndef _FINAL_BUILD _CrashIfProcessListLocked(); #endif // #ifdef _FINAL_BUILD DnBlowHandle hBlow; BLOW_HANDLE_LIST_ITER iter = m_listBlowHandle.begin(); for( ; iter != m_listBlowHandle.end(); ++iter ) { hBlow = (*iter); if( hBlow && (hBlow->GetServerBlowID() == nServerBlowID) ) { _ASSERT( m_aiApplied[ hBlow->GetBlowIndex() ] > 0 ); --m_aiApplied[ hBlow->GetBlowIndex() ]; hBlow->OnEnd( 0, 0 ); m_hActor->OnEndStateBlow( hBlow ); SAFE_RELEASE_SPTR( hBlow ); m_listBlowHandle.erase(iter); break; } } } #endif // _GAMESERVER bool CDnStateBlow::IsImmuned(STATE_BLOW::emBLOW_INDEX blowIndex) { // ¹«Àû »óÅÂÈ¿°ú ÀÖÀ» ¶§ ¹öÇÁ »óÅÂÈ¿°ú¸¦ Á¦¿ÜÇϰï ÀüºÎ Á¦¿Ü. if( IsApplied( STATE_BLOW::BLOW_099 ) ) { return false; } // ÇöÀç ¸é¿ªµÈ »óÅÂÈ¿°úÀÎÁö üũ // ºÎȰ(¹«Àû) »óÅÂÈ¿°úÀÎ °æ¿ì µ¥¹ÌÁö ¸Ô´Â »óÅÂÈ¿°ú¿¡ °É¸®Áö ¾Ê´Â´Ù. list::iterator iter = m_listBlowHandle.begin(); for( iter; iter != m_listBlowHandle.end(); ) { DnBlowHandle hNowBlow = (*iter); if( hNowBlow ) { if( (hNowBlow->GetBlowIndex() == STATE_BLOW::BLOW_077) ) { bool bImmuned = static_cast(hNowBlow.GetPointer())->IsImmuned( blowIndex ); if (bImmuned) return true; } else if( (hNowBlow->GetBlowIndex() == STATE_BLOW::BLOW_150) ) { bool bImmuned = static_cast(hNowBlow.GetPointer())->IsImmuned( blowIndex ); if (bImmuned) return true; } } ++iter; } return false; } #ifndef _FINAL_BUILD void CDnStateBlow::_CrashIfProcessListLocked( void ) { if( m_bLockStateBlowList ) { _ASSERT( 0 ); int* pNull = NULL; *pNull = 0xffffeeee; } } void CDnStateBlow::_CrashIfRemoveListLocked( void ) { if( m_bLockRemoveReservedList ) { _ASSERT( 0 ); int* pNull = NULL; *pNull = 0xeeeeffff; } } #endif // #ifdef _FINAL_BUILD void CDnStateBlow::Process_StateBlow_Old(LOCAL_TIME LocalTime, float fDelta, bool bForceInitialize) { BLOW_HANDLE_LIST::iterator iter; DnBlowHandle hBlow; for( iter = m_listBlowHandle.begin(); iter != m_listBlowHandle.end(); ) { hBlow = (*iter); if( hBlow ) { // °ÔÀÓ¼­¹ö ´ýÇÁ ¼öÁ¤ È®Àοë. if( !(hBlow->GetActorHandle()) ) hBlow->SetActorHandle( m_hActor ); ////////////////////////////////////////////////////////////////////////// if( hBlow->IsBegin() ) { // ÆÀ ¹ÝÀü °°Àº »óÅÂÈ¿°úµµ À־ ÆÀÀÌ ¹ÝÀüµÇ¸é À¯È¤ »óÅÂÈ¿°ú ÀÌÆåÆ®°¡ // ¸÷°ú °°Àº ÆÀÀÌ µÇ¾î ºÙÁú ¾ÊÀ¸¹Ç·Î ¸ÕÀú ÀÌÆåÆ®¸¦ ó¸®ÇÑ´Ù. #14128 #ifndef _GAMESERVER if( hBlow->IsUseTableDefinedGraphicEffect() ) hBlow->AttachGraphicEffectDefaultType(); #else hBlow->CheckAndStartActorActionInEffectInfo(); #endif hBlow->OnBegin( LocalTime, fDelta ); m_hActor->OnBeginStateBlow( hBlow ); // °ð¹Ù·Î end ·Î ¼ÂÆÃÇÏ´Â blow µµ Àֱ⠶§¹®¿¡ üũ. if( STATE_BLOW::STATE_END != hBlow->GetBlowState() ) hBlow->SetState( STATE_BLOW::STATE_DURATION ); } else if( hBlow->IsDuration() ) { hBlow->Process( LocalTime, fDelta ); } else if( hBlow->IsEnd() ) { RemoveStateBlowFromID(hBlow->GetBlowID()); } } // °¢°¢ÀÇ blow ÈÄ¿¡ process ÈÄ¿¡ µ¶, È­»ó °É·Á¼­ interval µ¥¹ÌÁö¿¡ Áװųª ÇÏ´Â °æ¿ì¿£ ÆÐ½Ãºê ½ºÅ³ÀÌ ¹Ù·Î ´Ù½Ã ºÙ°Ô µÇ´Âµ¥ // Á×¾úÀ» ¶© ºÎȰ »óÅÂÈ¿°ú¸¸ ó¸®ÇÑ´Ù. #ifdef _GAMESERVER // °ÔÀÓ ¼­¹öÀ϶© ¾×ÅͰ¡ gm trace ÀÏ ¶§µµ ¾Æ·¡ ºÎȰ ó¸® ·çƾÀ¸·Î µé¾î°¡±â ¶§¹®¿¡ Á¶°ÇÀ» Çϳª ´õ °É¾îÁØ´Ù. if( !m_hActor->IsGMTrace() && !bForceInitialize && m_hActor->IsPlayerActor() && m_hActor->IsDie() ) #else if( !bForceInitialize && m_hActor->IsPlayerActor() && m_hActor->IsDie() ) #endif { // ºÎȰ »óÅÂÈ¿°ú°¡ ¾ø´Ù¸é ·çÇÁ Á¾·á bool bExistRebirth = false; for( iter = m_listBlowHandle.begin(); m_listBlowHandle.end() != iter; ++iter ) { if( !(*iter) ) continue; if( (*iter)->GetBlowIndex() == STATE_BLOW::BLOW_057 || (*iter)->GetBlowIndex() == STATE_BLOW::BLOW_230 ) { bExistRebirth = true; break; } } if( false == bExistRebirth ) break; } else ++iter; } } void CDnStateBlow::Process_StateBlow_New(LOCAL_TIME LocalTime, float fDelta, bool bForceInitialize) { //Á×Àº»óÅÂ, Rebirth»óÅÂÈ¿°ú Á¸Àç À¯¹« bool bIsDie = false; bool bExistRebirth = false; BLOW_HANDLE_LIST::iterator rebirthStateIter = m_listBlowHandle.end(); BLOW_HANDLE_LIST::iterator spectatorStateIter = m_listBlowHandle.end(); #ifdef _GAMESERVER // °ÔÀÓ ¼­¹öÀ϶© ¾×ÅͰ¡ gm trace ÀÏ ¶§µµ ¾Æ·¡ ºÎȰ ó¸® ·çƾÀ¸·Î µé¾î°¡±â ¶§¹®¿¡ Á¶°ÇÀ» Çϳª ´õ °É¾îÁØ´Ù. if( !m_hActor->IsGMTrace() && !bForceInitialize && m_hActor->IsPlayerActor() && m_hActor->IsDie() ) #else if( !bForceInitialize && m_hActor->IsPlayerActor() && m_hActor->IsDie() ) #endif { bIsDie = true; for( BLOW_HANDLE_LIST::iterator iter = m_listBlowHandle.begin(); m_listBlowHandle.end() != iter; ++iter ) { if( !(*iter) ) continue; if( (*iter)->GetBlowIndex() == STATE_BLOW::BLOW_057 ) { bExistRebirth = true; rebirthStateIter = iter; } if( (*iter)->GetBlowIndex() == STATE_BLOW::BLOW_230 ) { bExistRebirth = true; spectatorStateIter = iter; } } } //Á×Àº »óÅÂÀ̰í, if (bIsDie) { // Á×Àº »óÅÂÈ¿°ú¿¡¼­ Rebirth»óÅÂÈ¿°ú°¡ Á¸Àç ÇÑ´Ù¸é Rebirth»óÅÂÈ¿°ú¸¸ ó¸® if (rebirthStateIter != m_listBlowHandle.end()) { DnBlowHandle hRebirthBlow = (*rebirthStateIter); Process_BlowHandle(hRebirthBlow, LocalTime, fDelta); } if (spectatorStateIter != m_listBlowHandle.end()) { DnBlowHandle hSpectatorBlow = (*spectatorStateIter); Process_BlowHandle(hSpectatorBlow, LocalTime, fDelta); } //Á×Àº »óÅÂÀϰæ¿ì ´Ù¸¥ »óÅÂÈ¿°ú´Â ó¸® ¾ÈÇϵµ·Ï ¿©±â¼­ ¸®ÅÏ... return; } DnBlowHandle hBlow; for( BLOW_HANDLE_LIST::iterator iter = m_listBlowHandle.begin(); iter != m_listBlowHandle.end(); ) { hBlow = (*iter); //À¯È¿ÇÏÁö ¾ÊÀº »óÅÂÈ¿°ú´Â ¸®½ºÆ®¿¡¼­ ¹Ù·Î Á¦°Å ÇØ ¹ö¸°´Ù.. if (!hBlow) { iter = m_listBlowHandle.erase(iter); continue; } Process_BlowHandle(hBlow, LocalTime, fDelta); ++iter; } } void CDnStateBlow::Process_BlowHandle(DnBlowHandle hBlow, LOCAL_TIME LocalTime, float fDelta) { if (!hBlow) return; if( hBlow->IsBegin() ) { // ÆÀ ¹ÝÀü °°Àº »óÅÂÈ¿°úµµ À־ ÆÀÀÌ ¹ÝÀüµÇ¸é À¯È¤ »óÅÂÈ¿°ú ÀÌÆåÆ®°¡ // ¸÷°ú °°Àº ÆÀÀÌ µÇ¾î ºÙÁú ¾ÊÀ¸¹Ç·Î ¸ÕÀú ÀÌÆåÆ®¸¦ ó¸®ÇÑ´Ù. #14128 #ifndef _GAMESERVER if( hBlow->IsUseTableDefinedGraphicEffect() ) hBlow->AttachGraphicEffectDefaultType(); #else hBlow->CheckAndStartActorActionInEffectInfo(); #endif hBlow->OnBegin( LocalTime, fDelta ); m_hActor->OnBeginStateBlow( hBlow ); // °ð¹Ù·Î end ·Î ¼ÂÆÃÇÏ´Â blow µµ Àֱ⠶§¹®¿¡ üũ. if( STATE_BLOW::STATE_END != hBlow->GetBlowState() ) hBlow->SetState( STATE_BLOW::STATE_DURATION ); } else if( hBlow->IsDuration() ) { hBlow->Process( LocalTime, fDelta ); } else if( hBlow->IsEnd() ) { RemoveStateBlowFromID(hBlow->GetBlowID()); } } float CDnStateBlow::GetImmuneReduceTimeValue(STATE_BLOW::emBLOW_INDEX blowIndex) { float fReduceTimeValue = 1.0f; //¸é¿ª »óÅÂÈ¿°ú¸¦ µ¹¸é¼­ blowIndex¿¡ ¸é¿ªÀÎ »óÅÂÈ¿°ú¿¡¼­ Áö¼Ó½Ã°£ ºñÀ² º¯°æ °ªÀ» ¾ò¾î ¿Â´Ù. DNVector(DnBlowHandle) vlhResult; GetStateBlowFromBlowIndex( STATE_BLOW::BLOW_077, vlhResult ); int nListCount = (int)vlhResult.size(); for (int i = 0; i < nListCount; ++i) { DnBlowHandle hExistBlow = vlhResult.at( i ); int nBlowIndex = (int)hExistBlow->GetFloatValue(); if ((STATE_BLOW::emBLOW_INDEX)(nBlowIndex) == blowIndex) { //blowIndex Áö¼Ó½Ã°£ ºñÀ² º¯°æ °ªÁß¿¡ Á¦ÀÏ ÀÛÀº °ªÀ» ¾ò´Â´Ù.. float fValue = static_cast(hExistBlow.GetPointer())->GetReduceTimeValue(); if (fReduceTimeValue > fValue) fReduceTimeValue = fValue; } } return fReduceTimeValue; } #ifdef _GAMESERVER #ifdef PRE_ADD_PROJECTILE_SE_INFO void CDnStateBlow::MakeCloneStateBlowList( BLOW_HANDLE_LIST BlowList ) { if( BlowList.empty() ) return; static CDnCreateBlow createBlow; BLOW_HANDLE_LIST_ITER iter = BlowList.begin(); for( iter; iter != BlowList.end() ; ++iter ) { DnBlowHandle hBlow = (*iter); if( hBlow ) { if( hBlow->GetBlowIndex() > STATE_BLOW::BLOW_NONE && hBlow->GetBlowIndex() < STATE_BLOW::BLOW_MAX ) { DnBlowHandle hBlow = createBlow.CreateBlow( (*iter)->GetBlowIndex() , (*iter)->GetActorHandle(), (*iter)->GetValue() ); m_listBlowHandle.push_back( hBlow ); ++m_aiApplied[ hBlow->GetBlowIndex() ]; } } } } #endif #endif