1837 lines
53 KiB
C++
1837 lines
53 KiB
C++
#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
|
||
|