DragonNest/GameCommon/DnStateBlow.cpp

1838 lines
53 KiB
C++
Raw Normal View History

2024-12-19 09:48:26 +08:00
#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<int, EffectOutputInfo*> 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; i<iNumItem; i++ )
{
int iItem = pStateEffectTable->GetItemID(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();
// ; <20><> <20><><EFBFBD>е<EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>޾ƿ<DEBE>
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 )
{
// <20><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD><EFBFBD><EFBFBD> <20>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD>.
for( int i = 0; i < CDnActor::Max_FX_Dummy_Bone; ++i )
{
list<S_BONE_EFFECT>& listBoneEffect = m_aListBoneEffectStatus[ i ];
list<S_BONE_EFFECT>::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<S_BONE_EFFECT>& listBoneEffect = m_aListBoneEffectStatus[ i ];
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD>ش<EFBFBD>.
if( 1 < (int)listBoneEffect.size() )
{
list<S_BONE_EFFECT>::iterator iter = listBoneEffect.begin();
for( iter; iter != listBoneEffect.end(); ++iter )
{
if( iter->bShow )
{
iter->fOutputElapsedTime += fDelta;
if( 1.0f < iter->fOutputElapsedTime )
{
list<S_BONE_EFFECT>::iterator iterNext = iter;
iterNext++;
if( listBoneEffect.end() == iterNext )
iterNext = listBoneEffect.begin();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>µǴ<C2B5> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
iter->Show( false );
iter->fOutputElapsedTime = 0.0f;
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
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 <20><><EFBFBD>ڰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ٲ<EFBFBD><D9B2><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
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
// <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>鼭 process <20>߿<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD>ŵ<EFBFBD> <20><><EFBFBD><EFBFBD>. üũ.
// <20><><EFBFBD>̳<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><20>ƴѰ<C6B4><D1B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>׾<EFBFBD><D7BE><EFBFBD>.
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 )
// <20><><EFBFBD>⼭ StateBlow::Process() OnRebith() <20><> <20>Ҹ<EFBFBD><D2B8><EFBFBD> <20>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ӱ<EFBFBD> StateBlow::Process() <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ó<EFBFBD><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٲ<EFBFBD><D9B2><EFBFBD><EFBFBD>´<EFBFBD>.
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 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><> ȭ<><C8AD>, <20><> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
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<32><36> Ư<><C6AF> <20><>ų Ȯ<><C8AE> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20>ش<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD>ΰ<EFBFBD>.
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<CDnProbInvincibleAtBlow*>(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<35><32> <20>̽<EFBFBD><CCBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool bCheckGuildPriority = false;
if (pParentSkill && pParentSkill->bIsGuildSkill == false)
bCheckGuildPriority = true;
#endif
// <20><><EFBFBD><EFBFBD> <20><EFBFBD><E9BFAA> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD> üũ
// <20><>Ȱ(<28><><EFBFBD><EFBFBD>) <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Դ<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20>ɸ<EFBFBD><C9B8><EFBFBD> <20>ʴ´<CAB4>.
list<DnBlowHandle>::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<CDnImmuneBlow*>(hNowBlow.GetPointer())->IsImmuned( pParentSkill, BlowIndex );
if( bImmuned )
iResult = ADD_FAIL_BY_IMMUNE;
}
else if( (hNowBlow->GetBlowIndex() == STATE_BLOW::BLOW_150) )
{
bool bImmuned = static_cast<CDnAllImmuneBlow*>(hNowBlow.GetPointer())->IsImmuned( pParentSkill, BlowIndex );
if( bImmuned )
iResult = ADD_FAIL_BY_IMMUNE;
}
else if( IsApplied(STATE_BLOW::BLOW_057) )
{
// <20><>Ȱ <20><><EFBFBD>϶<EFBFBD><CFB6><EFBFBD> <20>ڱ<EFBFBD> <20>ڽ<EFBFBD><DABD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD> <20>ڽſ<DABD><C5BF><EFBFBD> <20>ο<EFBFBD><CEBF>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF>.. Ȥ<><C8A4>, <20><><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ų<EFBFBD><C5B2>.
if( pParentSkill )
{
CDnSkill::SkillInfo* pSkillInfo = const_cast<CDnSkill::SkillInfo*>(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 Ư<><C6AF> <20><>ų<EFBFBD><C5B3> <20><EFBFBD>ϴ<EFBFBD> <20><>ųȿ<C5B3><C8BF> <20><><EFBFBD><EFBFBD>(hit<69><74> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʵ<EFBFBD><CAB5><EFBFBD>..)
CDnIngnoreEffectBlow* pIgnoreEffectBlow = static_cast<CDnIngnoreEffectBlow*>(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<34><32> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų ID<49>̰<EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̻<EFBFBD> <20>߰<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʵ<EFBFBD><CAB5><EFBFBD> <20>Ѵ<EFBFBD>.
if (pParentSkill)
{
CDnSkill::SkillInfo* pParentSkillInfo = const_cast<CDnSkill::SkillInfo*>(pParentSkill);
CDnSkill::SkillInfo* pExistSkillInfo = const_cast<CDnSkill::SkillInfo*>(hNowBlow->GetParentSkillInfo());
// #56880 <20><>ų <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE> <20>ؾ<EFBFBD> <20>Ѵ<EFBFBD>..
LOCAL_TIME parentSkillStartTime = 0;
LOCAL_TIME nowBlowSkillStartTime = 0;
CDnComboDamageLimitBlow* pNowBlow = static_cast<CDnComboDamageLimitBlow*>(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 && //<2F><>ų <20><><EFBFBD><EFBFBD><EFBFBD>ڰ<EFBFBD> <20><><EFBFBD><EFBFBD>
pParentSkillInfo->iSkillID == pExistSkillInfo->iSkillID && //<2F><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
nowBlowSkillStartTime == parentSkillStartTime //<2F><>ų <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
)
{
iResult = ADD_FAIL_BY_COMBOLIMITBLOW;
}
}
}
}
else if (hNowBlow->GetBlowIndex() == STATE_BLOW::BLOW_249)
{
//249<34><39> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><>ø <20>ǰ<EFBFBD> Ȱ<><C8B0>ȭ?(<28><>øī<C3B8><C4AB>Ʈ <20><><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>) <20><><EFBFBD>̻<EFBFBD> <20>߰<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD>Ѵ<EFBFBD>..
CDnPileAddEffectBlow* pPileAddEffectBlow = static_cast<CDnPileAddEffectBlow*>(hNowBlow.GetPointer());
if (pPileAddEffectBlow && pPileAddEffectBlow->IsActivatedBlow())
iResult = ADD_FAIL_BY_COMBOLIMITBLOW; //<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD> <20><><EFBFBD>ϰ<EFBFBD> <20>׳<EFBFBD> <20><> <20><EFBFBD><E0BCAE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..
}
#endif // _GAMESERVER
#if defined (_GAMESERVER)
if (bCheckGuildPriority && hNowBlow->GetBlowIndex() == BlowIndex)
{
const CDnSkill::SkillInfo * pNowSkillInfo = static_cast<CDnBlow*>(hNowBlow.GetPointer())->GetParentSkillInfo();
if (pNowSkillInfo->eDurationType == pParentSkill->eDurationType && pNowSkillInfo->bIsGuildSkill)
{
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD>ο<EFBFBD> ȿ<><C8BF><EFBFBD><EFBFBD> <20>ִµ<D6B4> <20><><EFBFBD>彺ų<E5BDBA><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD>Ȱ<EFBFBD><C8B0>̶<EFBFBD><CCB6><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ұ<EFBFBD>!
iResult = ADD_FAIL_BY_GUILDBLOW_PRIORITY;
}
}
#endif
}
++iter;
}
return iResult;
}
void CDnStateBlow::_CheckImmediatelyBegin( DnBlowHandle hBlow )
{
if( STATE_BLOW::BLOW_025 == hBlow->GetBlowIndex() )
{
// <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20>־ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD> <20><>Ȥ <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> ó<><C3B3><EFBFBD>Ѵ<EFBFBD>. #14128
#ifndef _GAMESERVER
if( hBlow->IsUseTableDefinedGraphicEffect() )
hBlow->AttachGraphicEffectDefaultType();
#else
hBlow->CheckAndStartActorActionInEffectInfo();
#endif
hBlow->OnBegin( 0, 0.0f );
m_hActor->OnBeginStateBlow( hBlow );
// <20><><EFBFBD>ٷ<EFBFBD> end <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> blow <20><> <20>ֱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> üũ.
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 // <20>ش罺ų<E7BDBA><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ<EFBFBD>°<EFBFBD><C2B0><EFBFBD><EFBFBD≯<EFBFBD> , Debuff<66><66> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ȱ<EFBFBD><C8B0><EFBFBD><ECBFA1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
if(pParentSkillInfo && pParentSkillInfo->iSkillUserTeam != hBlow->GetActorHandle()->GetTeam())
{
//Debuff <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD> Ȯ<><C8AE> <20>ؼ<EFBFBD>...
std::vector<std::string> 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;
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>.. debuff<66><66><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
if (isDebuggEffect)
effectOutputIDs = pParentSkillInfo->debuffEffectOutputIDs;
}
#endif
EffectOutputInfo *pEffectInfo = NULL;
std::vector<std::string> 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 )
{
// <20>ش<EFBFBD> BlowID<49><44> <20>Ѱ<EFBFBD> <20>޾Ƽ<DEBE> ó<><C3B3> <20>ϴ<EFBFBD> <20>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD>. <20>׷<EFBFBD><D7B7><EFBFBD> -1<><31> <20><><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD>ϴµ<CFB4>.. <20><EFBFBD><EEB6B3>...[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<34><32> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD>Ѵ<EFBFBD><D1B4><EFBFBD>? <20>ڵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ϵ<EFBFBD><CFB5><EFBFBD> <20>Ѵ<EFBFBD>..
//<2F><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><>ü<EFBFBD><C3BC><EFBFBD><EFBFBD> Process<73>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ǿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ϵ<EFBFBD><CFB5><EFBFBD> <20>Ѵ<EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD>ʿ<EFBFBD><CABF><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)
if (emBlowIndex == STATE_BLOW::BLOW_242)
nDurationTime = -1;
// <20>̽<EFBFBD> 6190 <20><><EFBFBD><EFBFBD>.
//<2F><>ø
// ȿ<><C8BF> <20><>ø <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1 <20>̻<EFBFBD><CCBB><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20>ִ<EFBFBD> <20><>ø<EFBFBD><C3B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ߺ<EFBFBD><DFBA>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>.
// ȿ<><C8BF> <20><>ø <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1 <20>̻<EFBFBD><CCBB>̳<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ʋ<><C6B2> <20><><EFBFBD><EFBFBD><ECBFA1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
// <09>ִ<EFBFBD> <20><>ø<EFBFBD><C3B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD> <20><>ø<EFBFBD><C3B8> <20>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȿ<><C8BF><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD> <20><><EFBFBD>ӽð<D3BD><C3B0><EFBFBD> <20>ٽ<EFBFBD> <20>ʱ<EFBFBD>ȭ <20>ȴ<EFBFBD>.
// <20><><EFBFBD>ξ<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ø ó<><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
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<34><32> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><>ø ó<><C3B3> <20>ȵǾ<C8B5><C7BE><EFBFBD> <20>Ѵ<EFBFBD>...
//#52905 253<35><33> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><>ø ó<><C3B3> <20>ȵǾ<C8B5><C7BE><EFBFBD> <20>Ѵ<EFBFBD>...
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 )
{
// <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȿ<><C8BF><EFBFBD><EFBFBD> <20><>ø<EFBFBD><C3B8>ŵ<EFBFBD>ϴ<EFBFBD>.
bool bLevelCheck = pExistParentSkillInfo->iSkillLevelID == pParentSkill->iSkillLevelID;
bool bIndexCheck = pExistParentSkillInfo->iSkillID == pParentSkill->iSkillID;
// #65533 PileAddEffect <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ <20><>ø<EFBFBD><C3B8>Ű<EFBFBD><C5B0><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.
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 <20><>ø<EFBFBD><C3B8> <20><><EFBFBD><EFBFBD> Ÿ<><C5B8><EFBFBD>ڷ<EFBFBD> SkillUser<65><72> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
if (emBlowIndex == STATE_BLOW::BLOW_249)
hExistBlow->SetParentSkillInfo(pParentSkill);
hExistBlow->Duplicate( BlowInfo );
hBlow = hExistBlow;
bDuplicated = true;
// Remove List <20><> <20>ִ<EFBFBD> <20><> <20><><EFBFBD>ݽô<DDBD>.
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<CDnPuppetBlow*>( 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: // <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ݷ<EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD> -> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ݷ<EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD>
emRtnBlowIndex = STATE_BLOW::BLOW_028;
break;
case STATE_BLOW::BLOW_002: // <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ݷ<EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD> -> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ݷ<EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD>
emRtnBlowIndex = STATE_BLOW::BLOW_029;
break;
case STATE_BLOW::BLOW_200: // <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ݷ<EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF>. <20><>ų <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD> <20>DZ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
emRtnBlowIndex = STATE_BLOW::BLOW_202; // -><3E><><EFBFBD><EFBFBD> <20><><EFBFBD>ݷ<EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF>. <20><>ų <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD> <20>DZ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
break;
case STATE_BLOW::BLOW_201: // <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ݷ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF>. <20><>ų <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD> <20>DZ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
emRtnBlowIndex = STATE_BLOW::BLOW_203; // -><3E><><EFBFBD><EFBFBD> <20><><EFBFBD>ݷ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF>. <20><>ų <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD> <20>DZ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
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;
// <20><><EFBFBD>̷<EFBFBD><CCB7><EFBFBD>, Ư<><C6AF> <20><>ų Ȯ<><C8AE> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20>ִٸ<D6B4> <20>ش<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>켱. (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)
if( hHighLanderBlow )
fResult = fHighLanderResult;
else
if( hProbInvincibleAtBlow && fProbInvincibleAtBlow != 0.0f) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>츸.
fResult = fProbInvincibleAtBlow;
return fResult;
}
bool CDnStateBlow::OnDie( DnActorHandle hHitter )
{
bool bProcessed = false;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><>ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20>ۿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> ó<><C3B3>.
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<CDnUsingSkillWhenDieBlow*>(hBlow.GetPointer())->OnDie();
#if defined(PRE_FIX_44884)
//UsingSkillWhenDieBlow<6F><77> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ʹ<EFBFBD> OnDieȣ<65><C8A3><EFBFBD><EFBFBD> HP<48><50> 1<><31> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD> OnDieȣ<65><C8A3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> ó<><C3B3><EFBFBD><EFBFBD> <20>̷<EFBFBD><CCB7><EFBFBD>.
//<2F><><EFBFBD><EFBFBD> Hitter<65><72> <20><> <20><> <20><><EFBFBD><EFBFBD> <20><>Ȳ<EFBFBD>̶<EFBFBD> <20><><EFBFBD><EFBFBD><E2BFA1> <20><><EFBFBD><EFBFBD> <20>س<EFBFBD><D8B3>´<EFBFBD>.
static_cast<CDnUsingSkillWhenDieBlow*>(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<int, EffectOutputInfo*>::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 )
{
// <20><><EFBFBD><EFBFBD> 0 <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><>ø <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. <20>׳<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. #16291
if( CDnActor::FXDummyBoneEnum::FX_01 != iBone )
return;
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20>ѷ<EFBFBD><D1B7><EFBFBD><EFBFBD><EFBFBD>.
_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;
// ó<><C3B3> <20>߰<EFBFBD><DFB0>Ǵ<EFBFBD> <20><><EFBFBD>̶<EFBFBD><CCB6><EFBFBD> show ó<><C3B3>.
// show( false ) <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ǰ<EFBFBD> <20><> <20><> <20><><EFBFBD>ʹ<EFBFBD> <20><> <20>Դ´<D4B4>.
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 )
{
// <20><><EFBFBD><EFBFBD> 0 <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><>ø <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. <20>׳<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. #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<S_BONE_EFFECT>& listBoneEffect = m_aListBoneEffectStatus[ iBone ];
list<S_BONE_EFFECT>::iterator iter = find( listBoneEffect.begin(),
listBoneEffect.end(), hEffectHandle );
if( listBoneEffect.end() != iter )
{
// <20><><EFBFBD><EFBFBD> <20><>ø<EFBFBD><C3B8> <20><><EFBFBD><EFBFBD>Ʈ <20><> <20>ڸ<EFBFBD><DAB8≯<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E0BCAE> <20><><EFBFBD><EFBFBD> <20>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD>̶<EFBFBD><CCB6><EFBFBD>..
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ʸ<EFBFBD> <20>ѱ<EFBFBD><D1B1><EFBFBD>.
// <20>̹<EFBFBD> <20><><EFBFBD>𼱰<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE>ٸ<EFBFBD> bone effect status list <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
if( 1 < (int)listBoneEffect.size() )
{
if( iter->bShow )
{
list<S_BONE_EFFECT>::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)
{
// <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20>˻<EFBFBD><CBBB>Ҷ<EFBFBD> <20><><EFBFBD>¸<EFBFBD><C2B8><EFBFBD>Ʈ <20>ʱ<EFBFBD>ȭ [2010/12/09 semozz]
if (m_hActor)
m_hActor->InitStateBlowIDToRemove();
CDnSkill::CanApply eResult = CDnSkill::CanApply::Apply;
// 1. <20><><EFBFBD>ο<EFBFBD> <20><><EFBFBD>°<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20>ִٸ<D6B4> <20>߰<EFBFBD> <20><>Ų<EFBFBD><C5B2>.
if ((CDnSkill::IsNeedCheckApplyStateBlow( (STATE_BLOW::emBLOW_INDEX)newStateEffect.nID)) ||
(newStateEffect.nDurationTime > 0) )
{
// [2010/11/12 semozz]
// 2. <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20>ִ<EFBFBD> StateBlow<6F><77> <20><><EFBFBD><EFBFBD>
// <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> üũ<C3BC><C5A9> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڵ<EFBFBD> <20><><EFBFBD><EFBFBD>..
// <20><> <20>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʿ<EFBFBD>
STATE_BLOW::emBLOW_INDEX newBlowIndex = (STATE_BLOW::emBLOW_INDEX)newStateEffect.nID;
if( IsApplied( newBlowIndex ) )
{
DNVector(DnBlowHandle) vlhResult;
GetStateBlowFromBlowIndex( newBlowIndex, vlhResult );
_ASSERT( !vlhResult.empty() );
vector<int> 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;
// <20><>ü <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20>ɸ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ƴϹǷ<CFB9> <20><><EFBFBD><20>ٷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴ<EFBFBD>
if ( NULL == pExistingParentSkillInfo )
continue;
// <20><>ų <20>ߺ<EFBFBD> ī<><C4AB>Ʈ üũ
// <20><><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD>̵<EFBFBD><CCB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><> <20><>Ÿ<EFBFBD><C5B8><EFBFBD>ٸ<EFBFBD> <20>ߺ<EFBFBD><DFBA><EFBFBD> <20><>ų<EFBFBD><C5B3>.
bool bIsSameSkillID = false;
#if defined(PRE_FIX_58505)
//<2F><><EFBFBD>̻<EFBFBD> <20><>ų Ÿ<><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD>̵<EFBFBD><CCB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD>,
//<2F><><EFBFBD>̻<EFBFBD> <20><>ų Ÿ<><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̻<EFBFBD> <20><>ų Ÿ<><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
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)
{
// <20><><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD>̵<EFBFBD><CCB5><EFBFBD> ó<><C3B3> <20><><EFBFBD>´ٸ<C2B4> ó<><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų ī<><C4AB>Ʈ <20>ϳ<EFBFBD> <20>÷<EFBFBD><C3B7><EFBFBD>.
iExistingSameSkillCount += hExistingBlow->GetDuplicateCount();
bExistingSameSkill = true;
vlhSameSkillBlows.push_back( hExistingBlow );
}
if (pUsingSkillInfo->eTargetType == CDnSkill::TargetTypeEnum::All //<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ϴ<EFBFBD> <20><>ų<EFBFBD><C5B3> TargetType<70><65> All<6C>̰<EFBFBD>,
&& (0 != pUsingSkillInfo->iSkillDuplicateMethod && (pUsingSkillInfo->iSkillDuplicateMethod == pExistingParentSkillInfo->iSkillDuplicateMethod)) //<2F><>ø ó<><C3B3>ID<49><44> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD> <20>ְ<EFBFBD>, <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID<49>϶<EFBFBD>,
&& (m_hActor == pUsingSkillInfo->hSkillUser) //<2F>ڱ<EFBFBD> <20>ڽ<EFBFBD>
)
continue;
// <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> 0<><30> <20>ƴ϶<C6B4><CFB6><EFBFBD> <20><>ų ȿ<><C8BF> <20>ߺ<EFBFBD> <20><><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD>.
// <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> 0<≯<EFBFBD> <20>׳<EFBFBD> <20><>ø<EFBFBD><C3B8>.
// Ȥ<><C8A4> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD≯鼭 <20>ִ<EFBFBD> <20><>ø ī<><C4AB>Ʈ<EFBFBD><C6AE> 1<><31><EFBFBD><EFBFBD><EFBFBD>ΰ<EFBFBD><CEB0><20><>ų <20><>ü<EFBFBD>ǵ<EFBFBD><C7B5><EFBFBD> ó<><C3B3>.
#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
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD> <20>ִ<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD>ΰ<EFBFBD>. <20>׷<EFBFBD><D7B7>ٸ<EFBFBD> <20><>ø<EFBFBD><C3B8> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> üũ<C3BC><C5A9><EFBFBD><EFBFBD><EEB0A3>.
// <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>øó<C3B8><C3B3><EFBFBD><EFBFBD> <20>ϵ<EFBFBD><CFB5><EFBFBD> <20>Ѵ<EFBFBD>.
// <20>ٸ<EFBFBD> <20><><EFBFBD>ε<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. (#19812)
if( (pUsingSkillInfo->iSkillDuplicateMethod == pExistingParentSkillInfo->iSkillDuplicateMethod) &&
(pUsingSkillInfo->iSkillUserTeam == pExistingParentSkillInfo->iSkillUserTeam) )
{
if( pUsingSkillInfo->iLevel >= pExistingParentSkillInfo->iLevel )
{
// 242<34><32> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20>ѹ<EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD> <20>Ǹ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ǹ<EFBFBD> <20>ȵȴ<C8B5>.
// Ȯ<><C8AE> üũ<C3BC><C5A9><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵٸ<D1B4> <20><><EFBFBD>½<EFBFBD>ų <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20>־<EFBFBD><D6BE><EFBFBD>.
// <20><><EFBFBD><EFBFBD> Ȯ<><C8AE>üũ<C3BC>ϴ<EFBFBD> <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE><EFBFBD><EFBFBD> üũ<C3BC>ϴ<EFBFBD> <20><><EFBFBD>̱<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20>״<EFBFBD><D7B4><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
if( hExistingBlow->GetBlowIndex() != STATE_BLOW::BLOW_242 &&
hExistingBlow->CanBegin() )
{
vlStateBlowIDToRemove.push_back( hExistingBlow->GetBlowID() );
//mapDuplicateResult[ hExistingBlow->GetBlowIndex() ] = true;
// <20><><EFBFBD>µǾ<C2B5><C7BE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>µ<EFBFBD><C2B5><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>´<EFBFBD>. [2010/12/08 semozz]
// <20><><EFBFBD><20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>µ<EFBFBD><C2B5><EFBFBD> OnSignal<61><6C> STE_ApplyStateEffect <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ҷ<EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>¸<EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
m_hActor->AddStateBlowIDToRemove(hExistingBlow->GetBlowID());
}
else
{
eResult = CDnSkill::CanApply::Fail; // ȿ<><C8BF> <20><><EFBFBD><EFBFBD> <20><> Ȯ<><C8AE> üũ<C3BC><C5A9><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
}
}
else if( pUsingSkillInfo->iLevel < pExistingParentSkillInfo->iLevel )
{
// ȿ<><C8BF> <20><><EFBFBD><EFBFBD> <20>ȵ<EFBFBD>.
eResult = CDnSkill::CanApply::Fail;
// Note <20>ѱ<EFBFBD>: <20><><EFBFBD>Ŀ<EFBFBD> <20>׷<EFBFBD><D7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ǥ<><C7A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵٸ<D1B4> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD>ϸ<EFBFBD> <20><>.
}
}
}
}
if( false == vlStateBlowIDToRemove.empty() )
{
// <20><>ų ȿ<><C8BF> <20><>ü. <20><>ø ī<><C4AB>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> ó<><C3B3><EFBFBD><EFBFBD> <20>ʿ<EFBFBD> <20><><EFBFBD><EFBFBD>.
bExistingSameSkill = false;
eResult = CDnSkill::CanApply::ApplyDuplicateSameSkill;
}
// <20><><EFBFBD><EFBFBD> ȿ<><C8BF><EFBFBD><EFBFBD> <20><>ø<EFBFBD>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD><D8BE>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD>, <20>ִ<EFBFBD> <20><>ø <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵȴ<C8B5>.
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD><CCB6><EFBFBD> <20><>øó<C3B8><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
if( CDnSkill::CanApply::Fail != eResult )
{
if( bExistingSameSkill )
{
if( pUsingSkillInfo->iDuplicateCount <= iExistingSameSkillCount )
{
// <20>ִ<EFBFBD> <20><>ø <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20>ʱ<EFBFBD>ȭ <20>Ѵ<EFBFBD>.
int iNumSameSkillBlowsToResetDurationTime = (int)vlhSameSkillBlows.size();
for( int iBlow = 0; iBlow < iNumSameSkillBlowsToResetDurationTime; ++iBlow )
{
DnBlowHandle hBlow = vlhSameSkillBlows.at( iBlow );
//#53448 249<34><39> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD> <20><>ø <20><><EFBFBD><EFBFBD> <20>̻<EFBFBD><CCBB><EFBFBD> <20>߰<EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD>.
//<2F>ִ<EFBFBD> <20><>ø <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ʒ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD> <20>ϰ<EFBFBD>, <20>ٽ<EFBFBD> <20>߰<EFBFBD> <20>۾<EFBFBD> <20>ʿ<EFBFBD> <20><><EFBFBD><EFBFBD>.
if (hBlow && hBlow->GetBlowIndex() == STATE_BLOW::BLOW_249)
continue;
// <20>ƿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ߴٰ<DFB4> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ȯ<EFBFBD><C8AE>.
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() );
// <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>. [2011/01/18 semozz]
int nBlowID = hBlow->GetBlowID();
// <20><>Ŷ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_hActor->SendRemoveStateEffectFromID(nBlowID);
// <20>ٷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>..
if (m_hActor->GetStateBlow())
m_hActor->GetStateBlow()->RemoveImediatlyStateEffectFromID(nBlowID);
// <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> 100% <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD> <20>ϹǷ<CFB9>
// CanBegin <20>Լ<EFBFBD> ȣ<><C8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʵ<EFBFBD><CAB5><EFBFBD> bCheckCanBegin <20>÷<EFBFBD><C3B7>׸<EFBFBD> <20><><EFBFBD><EFBFBD> ȣ<><C8A3>.
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 <20>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڵ<EFBFBD> <20><><EFBFBD><EFBFBD>.
if (RemoveStateBlowInfo::RSBI_SKILL_DURATION_TYPE == removeInfo.m_Type)
{
#if defined(_GAMESERVER)
STATE_BLOW::emBLOW_INDEX emBlowIndex = hBlow->GetStateBlow().emBlowIndex;
// Ŭ<>󿡰Ե<F3BFA1B0> <20><><EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD><CFB6><EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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<70><65> <20><><EFBFBD><EFBFBD> ã<>Ƽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
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)
{
//<2F><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD>Ÿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E9BCAD> <20><><EFBFBD><EFBFBD>..
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)
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
if( IsApplied( STATE_BLOW::BLOW_099 ) )
{
return false;
}
// <20><><EFBFBD><EFBFBD> <20><EFBFBD><E9BFAA> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD> üũ
// <20><>Ȱ(<28><><EFBFBD><EFBFBD>) <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Դ<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20>ɸ<EFBFBD><C9B8><EFBFBD> <20>ʴ´<CAB4>.
list<DnBlowHandle>::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<CDnImmuneBlow*>(hNowBlow.GetPointer())->IsImmuned( blowIndex );
if (bImmuned)
return true;
}
else
if( (hNowBlow->GetBlowIndex() == STATE_BLOW::BLOW_150) )
{
bool bImmuned = static_cast<CDnAllImmuneBlow*>(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 )
{
// <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ȯ<>ο<EFBFBD>.
if( !(hBlow->GetActorHandle()) )
hBlow->SetActorHandle( m_hActor );
//////////////////////////////////////////////////////////////////////////
if( hBlow->IsBegin() )
{
// <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20>־ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD> <20><>Ȥ <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> ó<><C3B3><EFBFBD>Ѵ<EFBFBD>. #14128
#ifndef _GAMESERVER
if( hBlow->IsUseTableDefinedGraphicEffect() )
hBlow->AttachGraphicEffectDefaultType();
#else
hBlow->CheckAndStartActorActionInEffectInfo();
#endif
hBlow->OnBegin( LocalTime, fDelta );
m_hActor->OnBeginStateBlow( hBlow );
// <20><><EFBFBD>ٷ<EFBFBD> end <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> blow <20><> <20>ֱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> üũ.
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());
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> blow <20>Ŀ<EFBFBD> process <20>Ŀ<EFBFBD> <20><>, ȭ<><C8AD> <20>ɷ<EFBFBD><C9B7><EFBFBD> interval <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>װų<D7B0> <20>ϴ<EFBFBD> <20><><EFBFBD><20>нú<D0BD> <20><>ų<EFBFBD><C5B3> <20>ٷ<EFBFBD> <20>ٽ<EFBFBD> <20>ٰ<EFBFBD> <20>Ǵµ<C7B4>
// <20>׾<EFBFBD><D7BE><EFBFBD> <20><> <20><>Ȱ <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD>Ѵ<EFBFBD>.
#ifdef _GAMESERVER
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD> <20><><EFBFBD>Ͱ<EFBFBD> gm trace <20><> <20><><EFBFBD><EFBFBD> <20>Ʒ<EFBFBD> <20><>Ȱ ó<><C3B3> <20><>ƾ<EFBFBD><C6BE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EEB0A1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϳ<EFBFBD> <20><> <20>ɾ<EFBFBD><C9BE>ش<EFBFBD>.
if( !m_hActor->IsGMTrace() && !bForceInitialize && m_hActor->IsPlayerActor() && m_hActor->IsDie() )
#else
if( !bForceInitialize && m_hActor->IsPlayerActor() && m_hActor->IsDie() )
#endif
{
// <20><>Ȱ <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
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)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, Rebirth<74><68><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
bool bIsDie = false;
bool bExistRebirth = false;
BLOW_HANDLE_LIST::iterator rebirthStateIter = m_listBlowHandle.end();
BLOW_HANDLE_LIST::iterator spectatorStateIter = m_listBlowHandle.end();
#ifdef _GAMESERVER
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD> <20><><EFBFBD>Ͱ<EFBFBD> gm trace <20><> <20><><EFBFBD><EFBFBD> <20>Ʒ<EFBFBD> <20><>Ȱ ó<><C3B3> <20><>ƾ<EFBFBD><C6BE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EEB0A1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϳ<EFBFBD> <20><> <20>ɾ<EFBFBD><C9BE>ش<EFBFBD>.
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;
}
}
}
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̰<EFBFBD>,
if (bIsDie)
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Rebirth<74><68><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ѵٸ<D1B4> Rebirth<74><68><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> ó<><C3B3>
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);
}
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD><CFB0><EFBFBD> <20>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> ó<><C3B3> <20><><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD>...
return;
}
DnBlowHandle hBlow;
for( BLOW_HANDLE_LIST::iterator iter = m_listBlowHandle.begin(); iter != m_listBlowHandle.end(); )
{
hBlow = (*iter);
//<2F><>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20>ٷ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..
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() )
{
// <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20>־ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD> <20><>Ȥ <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> ó<><C3B3><EFBFBD>Ѵ<EFBFBD>. #14128
#ifndef _GAMESERVER
if( hBlow->IsUseTableDefinedGraphicEffect() )
hBlow->AttachGraphicEffectDefaultType();
#else
hBlow->CheckAndStartActorActionInEffectInfo();
#endif
hBlow->OnBegin( LocalTime, fDelta );
m_hActor->OnBeginStateBlow( hBlow );
// <20><><EFBFBD>ٷ<EFBFBD> end <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> blow <20><> <20>ֱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> üũ.
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;
//<2F><20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD>鼭 blowIndex<65><78> <20><EFBFBD><E9BFAA> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ӽð<D3BD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>´<EFBFBD>.
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 <20><><EFBFBD>ӽð<D3BD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>߿<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>´<EFBFBD>..
float fValue = static_cast<CDnImmuneBlow*>(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