DragonNest/GameCommon/DnStateBlow.cpp
Cussrro 47f7895977 Revert "修复编码问题"
This reverts commit 9e69c01767.
2024-12-21 10:04:04 +08:00

1837 lines
53 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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