DragonNest/GameCommon/MASkillUser.cpp

3629 lines
106 KiB
C++
Raw Permalink Normal View History

#include "StdAfx.h"
#include "MASkillUser.h"
#include "DnSkill.h"
#include "IDnSkillUsableChecker.h"
#include "IDnSkillProcessor.h"
#include "InputReceiver.h"
#include "DnProjectile.h"
#include "DnPlayerActor.h"
#include "DnChangeProjectileProcessor.h"
#include "DnChangeActionStrProcessor.h"
#include "DnBlow.h"
#include "DnSkillTask.h"
#include "DnStateBlow.h"
#ifndef _GAMESERVER
#include "DnCantUseActiveSkillBlow.h"
#include "DnWorld.h"
#include "TaskManager.h"
#include "DnItemTask.h"
#include "DnInterface.h"
#else
#include "DNUserSession.h"
#include "DnApplySEWhenTargetNormalHitProcessor.h"
#endif
#if defined(_GAMESERVER)
#include "DnProbabilityChecker.h"
#endif
#include "DnCreateBlow.h"
#include "SmartPtrDef.h"
#if defined(PRE_ADD_TOTAL_LEVEL_SKILL)
#include "TotalLevelSkillSystem.h"
#endif // PRE_ADD_TOTAL_LEVEL_SKILL
#ifdef _DEBUG
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
#endif
MASkillUser::MASkillUser()
//: m_vSkillTargetPos( 0.f, 0.f, 0.f )
{
m_LocalTime = 0;
m_pActor = NULL;
m_bIsValidActor = true;
//m_fAdjustCoolTime = 1.0f;
#ifdef _GAMESERVER
m_bIgnoreCoolTime = false;
#else
m_bSkillExecutedThisFrame = false;
#endif
m_fCoolTimeDeltaAdjustValue = 1.0f;
//ZeroMemory( m_aEternityItemApplyStat, sizeof(m_aEternityItemApplyStat) );
}
MASkillUser::~MASkillUser()
{
#ifndef PRE_FIX_SKILLLIST
for( DWORD i=0; i<m_vlhSkillList.size(); i++ ) {
if( m_vbSelfAllocList[i] == true ) SAFE_RELEASE_SPTR( m_vlhSkillList[i] );
}
SAFE_DELETE_VEC( m_vlhSkillList );
SAFE_DELETE_VEC( m_vbSelfAllocList );
#else
for( DWORD i = 0; i < m_vlSkillObjects.size(); ++i )
{
S_SKILL_OBJECT& SkillObject = m_vlSkillObjects.at( i );
if( true == SkillObject.bSelfAlloc )
SAFE_RELEASE_SPTR( SkillObject.hSkill );
}
SAFE_DELETE_VEC( m_vlSkillObjects );
#endif // #ifndef PRE_FIX_SKILLLIST
#if defined(_GAMESERVER)
m_PrefixSkillCoolTimeManager.InitList();
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų <20>ʱ<EFBFBD>ȭ
PREFIX_SYSTEM_SKILL_LIST::iterator iter = m_prefixSystemDefenceSkills.begin();
PREFIX_SYSTEM_SKILL_LIST::iterator endIter = m_prefixSystemDefenceSkills.end();
for (; iter != endIter; ++iter)
{
if (iter->second.hSkill)
SAFE_RELEASE_SPTR(iter->second.hSkill);
}
SAFE_DELETE_MAP(m_prefixSystemDefenceSkills);
//<2F><><EFBFBD>ݿ<EFBFBD> <20><>ų <20>ʱ<EFBFBD>ȭ
iter = m_prefixSystemOffenceSkills.begin();
endIter = m_prefixSystemOffenceSkills.end();
for (; iter != endIter; ++iter)
{
if (iter->second.hSkill)
SAFE_RELEASE_SPTR(iter->second.hSkill);
}
SAFE_DELETE_MAP(m_prefixSystemOffenceSkills);
#endif // _GAMESERVER
#if defined(PRE_ADD_PREFIX_SYSTE_RENEW)
#if defined(_GAMESERVER)
{
//<2F><><EFBFBD>λ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų
PREFIX_SKILL_INFO::iterator iter = m_PrefixDefenceSkills.begin();
PREFIX_SKILL_INFO::iterator endIter = m_PrefixDefenceSkills.end();
for (; iter != endIter; ++iter)
{
if(iter->second)
SAFE_DELETE(iter->second);
}
m_PrefixDefenceSkills.clear();
//<2F><><EFBFBD>λ<EFBFBD> <20><><EFBFBD>ݿ<EFBFBD> <20><>ų
iter = m_PrefixOffenceSkills.begin();
endIter = m_PrefixOffenceSkills.end();
for (; iter != endIter; ++iter)
{
if(iter->second)
SAFE_DELETE(iter->second);
}
m_PrefixOffenceSkills.clear();
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>λ<EFBFBD> <20><><EFBFBD>ݿ<EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD>Ʈ
m_ProcessPrefixOffenceSkills.clear();
}
#endif // _GAMESERVER
#endif // PRE_ADD_PREFIX_SYSTE_RENEW
}
bool MASkillUser::IsValidActor()
{
if( m_pActor ) return true;
else {
if( !m_bIsValidActor ) return false;
m_pActor = dynamic_cast<CDnActor*>(this);
if( !m_pActor ) m_bIsValidActor = false;
}
return true;
}
void MASkillUser::OnAddSkill( DnSkillHandle hSkill, bool isInitialize/* = false*/ )
{
// <20>нú<D0BD> <20≯鼭 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> Self <20><> <20>پ<EFBFBD><D9BE>ִ<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD>ٷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>..
if( !IsValidActor() ) return;
bool bPassiveBuff = false;
bPassiveBuff = ApplyPassiveSkill( hSkill, isInitialize );
#ifdef _GAMESERVER
if( CDnSkill::AutoPassive == hSkill->GetSkillType() )
m_listAutoPassiveSkills.push_back( hSkill );
#else
const set<string>& setUseAction = hSkill->GetUseActionSet();
set<string>::const_iterator iter = setUseAction.begin();
for( iter; iter != setUseAction.end(); ++iter )
m_setUseActionNames.insert( *iter );
#endif
if( bPassiveBuff )
m_vlhSelfPassiveBlowSkill.push_back( hSkill );
}
bool MASkillUser::AddSkill( int nSkillTableID, int nLevel/* = 1*/, int iSkillLevelApplyType/* = CDnSkill::PVE*/ )
{
if( IsExistSkill( nSkillTableID, nLevel ) )
return false;
if( !IsValidActor() )
return false;
#ifdef _GAMESERVER
if( m_pActor == NULL || m_pActor->GetRoom() == NULL )
return false;
#endif
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD> <20>Ѵ<EFBFBD>.
int nLevelUp = GetSkillLevelUpValue(nSkillTableID);
nLevel += nLevelUp;
DnSkillHandle hSkill = CDnSkill::CreateSkill( m_pActor->GetMySmartPtr(), nSkillTableID, nLevel );
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>õ<EFBFBD> <20>ߴµ<DFB4> <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵƴٸ<C6B4>
if (nLevelUp != 0 && !hSkill)
{
OutputDebug("<EFBFBD><EFBFBD>ų (%d) <20><><EFBFBD><EFBFBD> (%d) <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.. <20><>ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD> Ȯ<><C8AE> <20><><EFBFBD><EFBFBD>!!!!!!\n", nSkillTableID, nLevel);
_ASSERT( hSkill && "<EFBFBD><EFBFBD>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>õ<EFBFBD> <20><><EFBFBD><EFBFBD>.. <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD> Ȯ<><C8AE>" );
//<2F>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>õ<EFBFBD>..
nLevel -= nLevelUp;
hSkill = CDnSkill::CreateSkill(m_pActor->GetMySmartPtr(), nSkillTableID, nLevel);
nLevelUp = 0;
}
if( !hSkill )
return false;
//<2F>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
hSkill->SetLevelUpValue(nLevelUp);
// <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD> <20><><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8> <20><><EFBFBD><EFBFBD>
if( m_pActor->IsPlayerActor() )
hSkill->SelectLevelDataType( iSkillLevelApplyType );
#ifndef PRE_FIX_SKILLLIST
m_vlhSkillList.push_back( hSkill );
m_vbSelfAllocList.push_back( true );
#else
m_vlSkillObjects.push_back( S_SKILL_OBJECT(hSkill, true) );
#endif // #ifndef PRE_FIX_SKILLLIST
// <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD>Ƶ<EFBFBD>
CDnSkill::DurationTypeEnum eDurationType = hSkill->GetDurationType();
switch(eDurationType)
{
case CDnSkill::ActiveToggle:
case CDnSkill::TimeToggle:
case CDnSkill::ActiveToggleForSummon:
m_vlhToggleSkills.push_back(hSkill);
case CDnSkill::Aura:
m_vlhAuraSkills.push_back(hSkill);
}
if( hSkill->GetActor() )
hSkill->SetHasActor( m_pActor->GetMySmartPtr() );
OnAddSkill( hSkill );
return true;
}
#if defined(PRE_FIX_62052)
void MASkillUser::ApplyGlobalSkillCoolTime(DnSkillHandle hSkill)
{
int nGlobalSkillGroupID = hSkill ? hSkill->GetGlobalSkillGroupID() : 0;
//GlobalSkillGroupID<49><44> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20>߰<EFBFBD> <20>ɶ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ID<49><44> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20>߰<EFBFBD> <20>Ǵ<EFBFBD> <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ش<EFBFBD>.
if (nGlobalSkillGroupID != 0)
{
for( DWORD i = 0; i < GetSkillCount(); ++i )
{
// m_vlGroupedSkillIDs <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD><CCBA><EFBFBD><EFBFBD><EFBFBD> <20>׳<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>̱<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD>ߴ<EFBFBD><DFB4><EFBFBD> <20><><EFBFBD>ΰ<EFBFBD> Ȯ<>εǾ<CEB5><C7BE><EFBFBD> <20>Ѵ<EFBFBD>.
DnSkillHandle hExistSkill = GetSkillFromIndex( i );
float fElapsedDelayTime = hExistSkill->GetElapsedDelayTime();
if( hExistSkill &&
hExistSkill->GetGlobalSkillGroupID() == nGlobalSkillGroupID &&
fElapsedDelayTime > 0.0f)
{
DnSkillHandle hOrigSkill = FindSkill(hExistSkill->GetAnotherGlobalSkillID());
hSkill->OnAnotherGlobalSkillBeginCoolTime( hOrigSkill );
hSkill->SetElapsedDelayTime(fElapsedDelayTime);
}
}
}
}
#endif // PRE_FIX_62052
bool MASkillUser::AddSkill( DnSkillHandle hSkill )
{
#ifdef _GAMESERVER
// <20>׼<EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ϳ<EFBFBD><CDBF><EFBFBD><EFBFBD><EFBFBD> <20><>ų <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD> addskill <20>մϴ<D5B4>.
// <20>÷<EFBFBD><C3B7>̾<EFBFBD> <20><><EFBFBD>Ϳ<EFBFBD><CDBF>Դ<EFBFBD> <20><>ų Ʈ<><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD><EEB0A1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD>
// playeractor <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̵<EFBFBD><CCB5>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20><> <20>Լ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20>ȵ˴ϴ<CBB4>.
// <20><><EFBFBD>Ŀ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>ȴٸ<C8B4> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> <20><><EFBFBD>ؼ<EFBFBD> assert <20>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.
//_ASSERT( IsValidActor() );
//_ASSERT( m_pActor->IsMonsterActor() );
#endif
if( IsExistSkill( hSkill->GetClassID(), hSkill->GetLevel() ) ) return false;
#if defined(PRE_FIX_62052)
ApplyGlobalSkillCoolTime(hSkill);
#endif // PRE_FIX_62052
#ifndef PRE_FIX_SKILLLIST
m_vlhSkillList.push_back( hSkill );
m_vbSelfAllocList.push_back( false );
#else
m_vlSkillObjects.push_back( S_SKILL_OBJECT(hSkill, false) );
#endif // #ifndef PRE_FIX_SKILLLIST
// <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD>Ƶ<EFBFBD>
CDnSkill::DurationTypeEnum eDurationType = hSkill->GetDurationType();
switch(eDurationType)
{
case CDnSkill::ActiveToggle:
case CDnSkill::TimeToggle:
case CDnSkill::ActiveToggleForSummon:
m_vlhToggleSkills.push_back(hSkill);
case CDnSkill::Aura:
m_vlhAuraSkills.push_back(hSkill);
}
OnAddSkill( hSkill );
return true;
}
bool MASkillUser::bIsPassiveSkill( DnBlowHandle hBlow )
{
int iNumSkill = (int)m_vlhSelfPassiveBlowSkill.size();
for( int iSkill = 0; iSkill < iNumSkill; ++iSkill )
{
DnSkillHandle hSkill = m_vlhSelfPassiveBlowSkill.at( iSkill );
_ASSERT( CDnSkill::Passive == hSkill->GetSkillType() );
const CDnSkill::SkillInfo* pSkillInfo = hBlow->GetParentSkillInfo();
if( pSkillInfo && (pSkillInfo->iSkillID == hSkill->GetClassID()) )
return true;
//if( CDnSkill::Passive == hSkill->GetSkillType() )
//{
// int iNumStateEffect = hSkill->GetStateEffectCount();
// for( int i = 0; i < iNumStateEffect; ++i )
// {
// CDnSkill::StateEffectStruct* pSE = hSkill->GetStateEffectFromIndex( i );
// if( CDnSkill::StateEffectApplyType::ApplySelf == pSE->ApplyType )
// {
// if( CDnSkill::DurationTypeEnum::Buff == hSkill->GetDurationType() )
// {
// if( hBlow->GetBlowIndex() == pSE->nID )
// return true;
// }
// }
// }
//}
}
return false;
}
bool MASkillUser::ApplyPassiveSkill( DnSkillHandle hSkill, bool isInitialize/* = false*/ )
{
bool bPassiveBuf = false;
// #24143 <20>ڱ<EFBFBD><DAB1>ڽ<EFBFBD><DABD><EFBFBD> <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ<EFBFBD>Ҷ<EFBFBD> CDnSkillTask <20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD> ȹ<><C8B9><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> AddSkill() <20>Լ<EFBFBD><D4BC><EFBFBD>
// ȣ<><C8A3><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٸ<EFBFBD> <20>÷<EFBFBD><C3B7>̾<EFBFBD><CCBE><EFBFBD> <20><><EFBFBD><20>׳<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE>ִ<EFBFBD> <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD>Ʈ(<28><><EFBFBD>µ<EFBFBD> <20><><EFBFBD><EFBFBD><30><C2A5> <20><>ų <20><><EFBFBD><EFBFBD>)
// <20>״<EFBFBD><D7B4><EFBFBD> AddSkill() <20>Լ<EFBFBD><D4BC><EFBFBD> ȣ<><C8A3><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>µ<EFBFBD> <20>нú<D0BD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD>.
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>⼭ ȹ<><C8B9> <20><><EFBFBD>°<EFBFBD> <20>ƴϸ<C6B4> <20>нú<D0BD> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʵ<EFBFBD><CAB5><EFBFBD> <20>Ѵ<EFBFBD>. (hp/mp <20>ִ<EFBFBD>ġ <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD>..)
// <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD>ʿ<EFBFBD><CABF><EFBFBD><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20>ٸ<EFBFBD><D9B8><EFBFBD> <20><> CDnPlayerActor <20><>ü<EFBFBD><C3BC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD>.
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD>ʿ<EFBFBD><CABF><EFBFBD><EFBFBD><EFBFBD> LocalPlayerActor <20><> <20><><EFBFBD><20><><EFBFBD>µ<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʿ<EFBFBD><CABF>ϹǷ<CFB9> PlayerActor <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ϰ<EFBFBD> <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> <20>־<EFBFBD><D6BE>ش<EFBFBD>..
#ifndef _GAMESERVER
if( false == hSkill->IsAcquired() )
return false;
#endif // #ifndef _GAMESERVER
if( CDnSkill::Passive == hSkill->GetSkillType() )
{
#if defined(PRE_ADD_TOTAL_LEVEL_SKILL)
bool isTotalLevelSkill = false;
if (m_pActor && m_pActor->IsPlayerActor())
{
CDnPlayerActor* pPlayerActor = static_cast<CDnPlayerActor*>(m_pActor);
CDnTotalLevelSkillSystem* pTotalLevelSystem = pPlayerActor ? pPlayerActor->GetTotalLevelSkillSystem() : NULL;
if (pTotalLevelSystem)
isTotalLevelSkill = pTotalLevelSystem->IsTotalLevelSkill(hSkill->GetClassID());
}
#endif // PRE_ADD_TOTAL_LEVEL_SKILL
int iNumStateEffect = hSkill->GetStateEffectCount();
for( int i = 0; i < iNumStateEffect; ++i )
{
CDnSkill::StateEffectStruct* pSE = hSkill->GetStateEffectFromIndex( i );
if( CDnSkill::StateEffectApplyType::ApplySelf == pSE->ApplyType )
{
if( CDnSkill::DurationTypeEnum::Buff == hSkill->GetDurationType() )
{
bPassiveBuf = true;
if( hSkill->IsSatisfyWeapon() )
{
int iBlowID = -1;
DnBlowHandle hBlow;
#ifdef _GAMESERVER
if(m_pActor)
{
iBlowID = m_pActor->CDnActor::CmdAddStateEffect( hSkill->GetInfo(), (STATE_BLOW::emBLOW_INDEX)pSE->nID, -1, pSE->szValue.c_str(), true ); // Duration Time<6D><65> -1 <20≯<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
OnApplyPassiveSkillBlow( iBlowID );
hBlow = m_pActor->GetStateBlowFromID(iBlowID);
}
#else
if(m_pActor)
hBlow = m_pActor->CDnActor::CmdAddStateEffect( hSkill->GetInfo(), (STATE_BLOW::emBLOW_INDEX)pSE->nID, -1, pSE->szValue.c_str(), true ); // Duration Time<6D><65> -1 <20≯<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#endif
#if defined(PRE_ADD_TOTAL_LEVEL_SKILL)
if (isTotalLevelSkill == true && isInitialize == true && hBlow)
hBlow->FromSourceItem();
#endif // PRE_ADD_TOTAL_LEVEL_SKILL
hSkill->SetAppliedPassiveBlows( true );
#ifndef _FINAL_BUILD
char szTemp[256] = { 0, };
WideCharToMultiByte( CP_ACP, 0, hSkill->GetName(), -1, szTemp, _countof(szTemp), NULL, NULL );
OutputDebug( "[<5B>нú<D0BD> <20><><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: %d] \"%s\" <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF>Index: %d, Value:%s\n", hSkill->GetClassID(), szTemp, pSE->nID, pSE->szValue.c_str() );
#endif // #ifndef _FINAL_BUILD
}
#ifndef _FINAL_BUILD
else
{
char szTemp[256] = { 0, };
WideCharToMultiByte( CP_ACP, 0, hSkill->GetName(), -1, szTemp, _countof(szTemp), NULL, NULL );
OutputDebug( "[<5B>нú<D0BD> <20><><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD>: %d] \"%s\" <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʿ<EFBFBD> <20><><EFBFBD><EFBFBD> Ÿ<><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>.\n", hSkill->GetClassID(), szTemp );
}
#endif // #ifndef _FINAL_BUILD
}
#ifndef _FINAL_BUILD
else
{
char szTemp[256] = { 0, };
WideCharToMultiByte( CP_ACP, 0, hSkill->GetName(), -1, szTemp, _countof(szTemp), NULL, NULL );
OutputDebug( "[<5B><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE> <20><><EFBFBD><EFBFBD>: %d] \"%s\" <20>нú<D0BD> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD>dz<EFBFBD> Buff <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD> <20>ʾƼ<CABE> <20><><EFBFBD><EFBFBD> <20>ȵ<EFBFBD>\n", hSkill->GetClassID(), szTemp );
}
#endif // #ifndef _FINAL_BUILD
}
}
}
return bPassiveBuf;
}
void MASkillUser::ApplyPassiveSkills( void )
{
if( !IsValidActor() ) return;
int iNumSkill = (int)m_vlhSelfPassiveBlowSkill.size();
for( int iSkill = 0; iSkill < iNumSkill; ++iSkill )
{
DnSkillHandle hSkill = m_vlhSelfPassiveBlowSkill.at( iSkill );
ApplyPassiveSkill(hSkill);
}
}
void MASkillUser::OnRemoveSkill( DnSkillHandle hSkill )
{
#ifndef _GAMESERVER
const set<string>& setUseAction = hSkill->GetUseActionSet();
set<string>::const_iterator iter = setUseAction.begin();
for( iter; iter != setUseAction.end(); ++iter )
m_setUseActionNames.erase( *iter );
#endif
}
bool MASkillUser::RemoveSkillAll()
{
if( !IsValidActor() )
return false;
#ifndef PRE_FIX_SKILLLIST
int nSkillSize = (int)m_vlhSkillList.size();
for( int i=0 ; i<nSkillSize ; i++ )
{
DnSkillHandle hSkill = m_vlhSkillList.back();
if( !hSkill )
continue;
bool bRet = RemoveSkill( hSkill->GetClassID() );
_ASSERT( bRet );
}
#else
int nSkillSize = (int)m_vlSkillObjects.size();
for( int i=0 ; i<nSkillSize ; i++ )
{
S_SKILL_OBJECT& SkillObject = m_vlSkillObjects.back();
DnSkillHandle hSkill = SkillObject.hSkill;
if( !hSkill )
continue;
bool bRet = RemoveSkill( hSkill->GetClassID() );
_ASSERT( bRet );
}
#endif // #ifndef PRE_FIX_SKILLLIST
return true;
}
bool MASkillUser::EndStateEffectSkill(int nSkillTableID)
{
DNVector(DnBlowHandle) vlBlows;
m_pActor->GetAllAppliedStateBlow(vlBlows);
for (int i = 0; i < (int)vlBlows.size(); ++i)
{
DnBlowHandle hBlow = vlBlows.at(i);
const CDnSkill::SkillInfo * skillInfo = hBlow->GetParentSkillInfo();
if (skillInfo->iSkillID == nSkillTableID)
{
hBlow->OnEnd(0, 0);
m_pActor->OnEndStateBlow(hBlow);
m_pActor->RemoveStateBlowFromID(hBlow->GetBlowID()); //? need test.
}
}
/*
DnSkillHandle hSkill = FindSkill(nSkillTableID);
if (m_pActor && m_pActor->GetStateBlow())
{
std::vector<int> vecRemoveBlowID;
DNVector(DnBlowHandle) vlBlows;
m_pActor->GetAllAppliedStateBlowBySkillID(nSkillTableID, vlBlows);
int iStateEffectCount = hSkill->GetStateEffectCount();
for (int iStateEffect = 0; iStateEffect < iStateEffectCount; ++iStateEffect)
{
const CDnSkill::StateEffectStruct* pSE = hSkill->GetStateEffectFromIndex(iStateEffect);
if (pSE && CDnSkill::StateEffectApplyType::ApplySelf == pSE->ApplyType)
{
for (DWORD BLOW_COUNT = 0; BLOW_COUNT < vlBlows.size(); BLOW_COUNT++)
{
if (vlBlows[BLOW_COUNT] && (vlBlows[BLOW_COUNT]->GetBlowIndex() == (STATE_BLOW::emBLOW_INDEX)pSE->nID))
{
vecRemoveBlowID.push_back(vlBlows[BLOW_COUNT]->GetBlowID());
}
}
}
}
for (DWORD Index = 0; Index < vecRemoveBlowID.size(); Index++)
{
m_pActor->GetStateBlow()->RemoveImediatlyStateEffectFromID(vecRemoveBlowID[Index]);
}
}
*/
return true;
}
bool MASkillUser::RemoveSkill( int nSkillTableID )
{
if( !IsValidActor() ) return false;
int iNumPassiveBlowSkill = (int)m_vlhSelfPassiveBlowSkill.size();
for( int iPassiveBlowSkill = 0; iPassiveBlowSkill < iNumPassiveBlowSkill; ++iPassiveBlowSkill )
{
DnSkillHandle hSkill = m_vlhSelfPassiveBlowSkill.at( iPassiveBlowSkill );
if( hSkill && hSkill->GetClassID() == nSkillTableID )
{
if( m_pActor && m_pActor->GetStateBlow() )
{
std::vector<int> vecRemoveBlowID;
DNVector(DnBlowHandle) vlBlows;
m_pActor->GetAllAppliedStateBlowBySkillID( nSkillTableID , vlBlows );
int iStateEffectCount = hSkill->GetStateEffectCount();
for( int iStateEffect = 0; iStateEffect < iStateEffectCount; ++iStateEffect )
{
const CDnSkill::StateEffectStruct* pSE = hSkill->GetStateEffectFromIndex( iStateEffect );
if( pSE && CDnSkill::StateEffectApplyType::ApplySelf == pSE->ApplyType )
{
for( DWORD BLOW_COUNT=0; BLOW_COUNT < vlBlows.size(); BLOW_COUNT++ )
{
if( vlBlows[BLOW_COUNT] && ( vlBlows[BLOW_COUNT]->GetBlowIndex() == (STATE_BLOW::emBLOW_INDEX)pSE->nID ) )
{
vecRemoveBlowID.push_back( vlBlows[BLOW_COUNT]->GetBlowID() );
}
}
}
}
for( DWORD Index=0; Index<vecRemoveBlowID.size(); Index++)
{
m_pActor->GetStateBlow()->RemoveImediatlyStateEffectFromID( vecRemoveBlowID[Index] );
}
}
// 2009.03.16 <20><><EFBFBD><EFBFBD>
m_vlhSelfPassiveBlowSkill.erase( m_vlhSelfPassiveBlowSkill.begin()+iPassiveBlowSkill );
break;
}
}
#if defined(PRE_ADD_TOTAL_LEVEL_SKILL)
//<2F><><EFBFBD>շ<EFBFBD><D5B7><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20>Ʒ<EFBFBD><C6B7><EFBFBD> <20><>ƾ<EFBFBD><C6BE> Ż <20>ʿ䰡 <20><><EFBFBD><EFBFBD>...
if (m_pActor && m_pActor->IsPlayerActor())
{
CDnPlayerActor* pPlayerActor = static_cast<CDnPlayerActor*>(m_pActor);
CDnTotalLevelSkillSystem *pTotalLevelSystem = pPlayerActor ? pPlayerActor->GetTotalLevelSkillSystem(): NULL;
if (pTotalLevelSystem && pTotalLevelSystem->IsTotalLevelSkill(nSkillTableID))
return true;
}
#endif // PRE_ADD_TOTAL_LEVEL_SKILL
#ifdef _GAMESERVER
list<DnSkillHandle>::iterator iter = m_listAutoPassiveSkills.begin();
for( iter; m_listAutoPassiveSkills.end() != iter; ++iter )
{
if( (*iter)->GetClassID() == nSkillTableID )
{
m_listAutoPassiveSkills.erase( iter );
break;
}
}
#endif
#ifndef PRE_FIX_SKILLLIST
for( DWORD i=0; i<m_vlhSkillList.size(); i++ ) {
if( m_vlhSkillList[i]->GetClassID() == nSkillTableID ) {
// <20><><EFBFBD><EFBFBD><EFBFBD>̳<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD>̶<EFBFBD><CCB6><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
DnSkillHandle hSkill = m_vlhSkillList.at(i);
#else
for( DWORD i = 0; i < m_vlSkillObjects.size(); ++i )
{
S_SKILL_OBJECT& SkillObject = m_vlSkillObjects.at( i );
if( SkillObject.hSkill && SkillObject.hSkill->GetClassID() == nSkillTableID )
{
// <20><><EFBFBD><EFBFBD><EFBFBD>̳<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD>̶<EFBFBD><CCB6><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
DnSkillHandle hSkill = SkillObject.hSkill;
#endif // #ifndef PRE_FIX_SKILLLIST
if( CDnSkill::ActiveToggle == hSkill->GetDurationType() ||
CDnSkill::TimeToggle == hSkill->GetDurationType() ||
CDnSkill::ActiveToggleForSummon == hSkill->GetDurationType()
)
{
DNVector(DnSkillHandle)::iterator Localiter = find( m_vlhToggleSkills.begin(), m_vlhToggleSkills.end(), hSkill );
m_vlhToggleSkills.erase( Localiter );
}
else
if( CDnSkill::Aura == hSkill->GetDurationType() )
{
if (m_hAuraSkill && m_hAuraSkill->GetClassID() == nSkillTableID && m_hAuraSkill->IsAuraOn())
{
if (m_hAuraSkill == m_hProcessSkill)
m_hProcessSkill.Identity();
m_hAuraSkill->EnableAura( false );
OnSkillAura(m_hAuraSkill, false);
m_hAuraSkill.Identity();
}
DNVector(DnSkillHandle)::iterator Localiter = find( m_vlhAuraSkills.begin(), m_vlhAuraSkills.end(), hSkill );
m_vlhAuraSkills.erase( Localiter );
}
#ifndef PRE_FIX_SKILLLIST
OnRemoveSkill( m_vlhSkillList[i] );
if( m_vbSelfAllocList[i] == true ) SAFE_RELEASE_SPTR( m_vlhSkillList[i] );
m_vlhSkillList.erase( m_vlhSkillList.begin() + i );
m_vbSelfAllocList.erase( m_vbSelfAllocList.begin() + i );
#else
OnRemoveSkill( SkillObject.hSkill );
if( SkillObject.bSelfAlloc )
SAFE_RELEASE_SPTR( SkillObject.hSkill );
m_vlSkillObjects.erase( m_vlSkillObjects.begin()+i );
#endif // #ifndef PRE_FIX_SKILLLIST
return true;
}
}
return true;
}
#ifndef _GAMESERVER
bool MASkillUser::ReplacementSkill( int nSkillTableID, int nLevel )
{
if( !IsValidActor() ) return false;
DnSkillHandle hSkill = CDnSkill::CreateSkill( m_pActor->GetMySmartPtr(), nSkillTableID, nLevel );
if( !hSkill ) return false;
return ReplacementSkill( hSkill );
}
bool MASkillUser::ReplacementSkill( DnSkillHandle hNewSkill )
{
#ifndef PRE_FIX_SKILLLIST
int iSkillID = hNewSkill->GetClassID();
for( DWORD i=0; i<m_vlhSkillList.size(); i++ )
{
if( m_vlhSkillList[ i ]->GetClassID() == iSkillID )
{
// <20>нú<D0BD> <20><><EFBFBD>ο<EFBFBD> <20><>ų<EFBFBD>ΰ<EFBFBD>. <20>׷<EFBFBD><D7B7>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ְ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ش<EFBFBD>.
DNVector(DnSkillHandle)::iterator iter = find( m_vlhSelfPassiveBlowSkill.begin(), m_vlhSelfPassiveBlowSkill.end(), m_vlhSkillList[ i ] );
if( m_vlhSelfPassiveBlowSkill.end() != iter )
{
// <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
// <20>θ<EFBFBD><CEB8><EFBFBD>ų<EFBFBD><C5B3> <20><>ġ<EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> ã<>Ƴ<EFBFBD><C6B3><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
if( !IsValidActor() ) continue;
// HP, SP <20>÷<EFBFBD><C3B7>ִ<EFBFBD> <20>нú<D0BD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> HP SP <20><> <20><><EFBFBD><EFBFBD> HP/SP<53><50>
// Ŭ<><C5AC><EFBFBD><EFBFBD> <20>ǰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD> <20>޾Ƶ״ٰ<D7B4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>..
INT64 iHP = m_pActor->GetHP();
int iSP = m_pActor->GetSP();
DNVector(DnBlowHandle) vlhAppliedSE;
DNVector(DnBlowHandle) vlhSEToRemove;
m_pActor->GetAllAppliedStateBlow( vlhAppliedSE );
int iNumAppliedSE = (int)vlhAppliedSE.size();
for( int iSE = 0; iSE < iNumAppliedSE; ++iSE )
{
DnBlowHandle hAppliedBlow = vlhAppliedSE.at( iSE );
const CDnSkill::SkillInfo* pSkillInfo = hAppliedBlow->GetParentSkillInfo();
if( pSkillInfo->iSkillID == (*iter)->GetClassID() )
vlhSEToRemove.push_back( hAppliedBlow );
}
int iNumSEToRemove = (int)vlhSEToRemove.size();
for( int iSE = 0; iSE < iNumSEToRemove; ++iSE )
{
DnBlowHandle hBlow = vlhSEToRemove.at(iSE);
int iID = hBlow->GetBlowID();
OutputDebug( "[<5B>нú<D0BD> <20><><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: %d] %s <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF>Index: %d, Value:%s\n",
(*iter)->GetClassID(), (*iter)->GetName(), hBlow->GetBlowIndex(), hBlow->GetValue() );
m_pActor->RemoveStateBlowFromID( iID );
}
m_vlhSelfPassiveBlowSkill.erase( iter );
ApplyPassiveSkill( hNewSkill );
m_vlhSelfPassiveBlowSkill.push_back( hNewSkill );
m_pActor->SetHP( iHP );
m_pActor->SetSP( iSP );
}
if (m_hAuraSkill && m_hAuraSkill->GetClassID() == iSkillID && m_hAuraSkill->IsAuraOn())
{
if (m_hAuraSkill == m_hProcessSkill)
m_hProcessSkill.Identity();
m_hAuraSkill->EnableAura( false );
OnSkillAura(m_hAuraSkill, false);
m_hAuraSkill.Identity();
}
if( m_vbSelfAllocList[ i ] )
{
// <20>ڽ<EFBFBD><DABD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20>ڽ<EFBFBD><DABD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϹǷ<CFB9>.
DnSkillHandle hSkillToRelease = m_vlhSkillList[ i ];
// <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˻<EFBFBD><CBBB>ؼ<EFBFBD> <20><>ü <20><>Ŵ
DNVector(DnSkillHandle)::iterator iterToggle = find( m_vlhToggleSkills.begin(), m_vlhToggleSkills.end(), hSkillToRelease );
if( m_vlhToggleSkills.end() != iterToggle )
*iterToggle = hNewSkill;
DNVector(DnSkillHandle)::iterator iterAura = find( m_vlhAuraSkills.begin(), m_vlhAuraSkills.end(), hSkillToRelease );
if( m_vlhAuraSkills.end() != iterAura )
*iterAura = hNewSkill;
OnRemoveSkill( hSkillToRelease );
SAFE_RELEASE_SPTR( hSkillToRelease );
}
else
{
// <20><>ų <20>½<EFBFBD>ũ<EFBFBD><C5A9><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
DnSkillHandle hPrevLevelSkill = m_vlhSkillList[ i ];
// <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˻<EFBFBD><CBBB>ؼ<EFBFBD> <20><>ü <20><>Ŵ
DNVector(DnSkillHandle)::iterator iterToggle = find( m_vlhToggleSkills.begin(), m_vlhToggleSkills.end(), hPrevLevelSkill );
if( m_vlhToggleSkills.end() != iterToggle )
*iterToggle = hNewSkill;
DNVector(DnSkillHandle)::iterator iterAura = find( m_vlhAuraSkills.begin(), m_vlhAuraSkills.end(), hPrevLevelSkill );
if( m_vlhAuraSkills.end() != iterAura )
*iterAura = hNewSkill;
}
OnReplacementSkill( m_vlhSkillList[ i ], hNewSkill );
m_vlhSkillList[ i ] = hNewSkill;
return true;
}
}
return false;
#else
int iSkillID = hNewSkill->GetClassID();
for( DWORD i = 0; i < m_vlSkillObjects.size(); i++ )
{
S_SKILL_OBJECT& SkillObject = m_vlSkillObjects.at( i );
DnSkillHandle hSkill = SkillObject.hSkill;
if( hSkill->GetClassID() == iSkillID )
{
// <20>нú<D0BD> <20><><EFBFBD>ο<EFBFBD> <20><>ų<EFBFBD>ΰ<EFBFBD>. <20>׷<EFBFBD><D7B7>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ְ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ش<EFBFBD>.
DNVector(DnSkillHandle)::iterator iter = find( m_vlhSelfPassiveBlowSkill.begin(), m_vlhSelfPassiveBlowSkill.end(), hSkill );
if( m_vlhSelfPassiveBlowSkill.end() != iter )
{
// <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
// <20>θ<EFBFBD><CEB8><EFBFBD>ų<EFBFBD><C5B3> <20><>ġ<EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> ã<>Ƴ<EFBFBD><C6B3><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
if( !IsValidActor() ) continue;
// HP, SP <20>÷<EFBFBD><C3B7>ִ<EFBFBD> <20>нú<D0BD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> HP SP <20><> <20><><EFBFBD><EFBFBD> HP/SP<53><50>
// Ŭ<><C5AC><EFBFBD><EFBFBD> <20>ǰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD> <20>޾Ƶ״ٰ<D7B4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>..
INT64 iHP = m_pActor->GetHP();
int iSP = m_pActor->GetSP();
DNVector(DnBlowHandle) vlhAppliedSE;
DNVector(DnBlowHandle) vlhSEToRemove;
m_pActor->GetAllAppliedStateBlow( vlhAppliedSE );
int iNumAppliedSE = (int)vlhAppliedSE.size();
for( int iSE = 0; iSE < iNumAppliedSE; ++iSE )
{
DnBlowHandle hAppliedBlow = vlhAppliedSE.at( iSE );
const CDnSkill::SkillInfo* pSkillInfo = hAppliedBlow->GetParentSkillInfo();
if( pSkillInfo->iSkillID == (*iter)->GetClassID() )
vlhSEToRemove.push_back( hAppliedBlow );
}
int iNumSEToRemove = (int)vlhSEToRemove.size();
for( int iSE = 0; iSE < iNumSEToRemove; ++iSE )
{
DnBlowHandle hBlow = vlhSEToRemove.at(iSE);
int iID = hBlow->GetBlowID();
OutputDebug( "[<5B>нú<D0BD> <20><><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: %d] %s <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF>Index: %d, Value:%s\n",
(*iter)->GetClassID(), (*iter)->GetName(), hBlow->GetBlowIndex(), hBlow->GetValue() );
m_pActor->RemoveStateBlowFromID( iID );
}
m_vlhSelfPassiveBlowSkill.erase( iter );
ApplyPassiveSkill( hNewSkill );
m_vlhSelfPassiveBlowSkill.push_back( hNewSkill );
m_pActor->SetHP( iHP );
m_pActor->SetSP( iSP );
}
if (m_hAuraSkill && m_hAuraSkill->GetClassID() == iSkillID && m_hAuraSkill->IsAuraOn())
{
if (m_hAuraSkill == m_hProcessSkill)
m_hProcessSkill.Identity();
m_hAuraSkill->EnableAura( false );
OnSkillAura(m_hAuraSkill, false);
m_hAuraSkill.Identity();
}
if( true == SkillObject.bSelfAlloc )
{
// <20>ڽ<EFBFBD><DABD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20>ڽ<EFBFBD><DABD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϹǷ<CFB9>.
DnSkillHandle hSkillToRelease = hSkill;
// <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˻<EFBFBD><CBBB>ؼ<EFBFBD> <20><>ü <20><>Ŵ
DNVector(DnSkillHandle)::iterator iterToggle = find( m_vlhToggleSkills.begin(), m_vlhToggleSkills.end(), hSkillToRelease );
if( m_vlhToggleSkills.end() != iterToggle )
*iterToggle = hNewSkill;
DNVector(DnSkillHandle)::iterator iterAura = find( m_vlhAuraSkills.begin(), m_vlhAuraSkills.end(), hSkillToRelease );
if( m_vlhAuraSkills.end() != iterAura )
*iterAura = hNewSkill;
OnRemoveSkill( hSkillToRelease );
SAFE_RELEASE_SPTR( hSkillToRelease );
}
else
{
// <20><>ų <20>½<EFBFBD>ũ<EFBFBD><C5A9><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
DnSkillHandle hPrevLevelSkill = hSkill;
// <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˻<EFBFBD><CBBB>ؼ<EFBFBD> <20><>ü <20><>Ŵ
DNVector(DnSkillHandle)::iterator iterToggle = find( m_vlhToggleSkills.begin(), m_vlhToggleSkills.end(), hPrevLevelSkill );
if( m_vlhToggleSkills.end() != iterToggle )
*iterToggle = hNewSkill;
DNVector(DnSkillHandle)::iterator iterAura = find( m_vlhAuraSkills.begin(), m_vlhAuraSkills.end(), hPrevLevelSkill );
if( m_vlhAuraSkills.end() != iterAura )
*iterAura = hNewSkill;
}
OnReplacementSkill( hSkill, hNewSkill );
SkillObject.hSkill = hNewSkill;
return true;
}
}
return false;
#endif // #ifndef PRE_FIX_SKILLLIST
}
#endif
bool MASkillUser::IsExistSkill( int nSkillTableID, int nLevel )
{
#ifndef PRE_FIX_SKILLLIST
for( DWORD i=0; i<m_vlhSkillList.size(); i++ ) {
if( m_vlhSkillList[i] && ( m_vlhSkillList[i]->GetClassID() == nSkillTableID ) )
{
if( nLevel == -1 ) return true;
if( m_vlhSkillList[i]->GetLevel() == nLevel ) return true;
}
}
return false;
#else
for( DWORD i = 0; i < m_vlSkillObjects.size(); ++i )
{
S_SKILL_OBJECT& SkillObject = m_vlSkillObjects.at( i );
DnSkillHandle hSkill = SkillObject.hSkill;
if( hSkill)
{
if( hSkill->GetClassID() == nSkillTableID )
{
if( -1 == nLevel )
return true;
if( hSkill->GetLevel() == nLevel )
return true;
}
}
}
return false;
#endif // #ifndef PRE_FIX_SKILLLIST
}
bool MASkillUser::IsSelfAllocSkill( int nSkillTableID )
{
#ifndef PRE_FIX_SKILLLIST
for( DWORD i=0; i<m_vlhSkillList.size(); i++ ) {
if( m_vlhSkillList[i]->GetClassID() == nSkillTableID )
return m_vbSelfAllocList[i];
}
return false;
#else
for( DWORD i = 0; i < m_vlSkillObjects.size(); ++i )
{
if( m_vlSkillObjects.at( i ).hSkill->GetClassID() == nSkillTableID )
return m_vlSkillObjects.at( i ).bSelfAlloc;
}
return false;
#endif // #ifndef PRE_FIX_SKILLLIST
}
void MASkillUser::SetSkillLevel( int nSkillTableID, int nValue )
{
if( !IsSelfAllocSkill( nSkillTableID ) ) return;
DnSkillHandle hSkill = FindSkill( nSkillTableID );
if( !hSkill ) return;
if( hSkill->GetLevel() == nValue ) return;
float fElapsedDelayTime = hSkill->GetElapsedDelayTime();
RemoveSkill( nSkillTableID );
AddSkill( nSkillTableID, nValue );
hSkill = FindSkill( nSkillTableID );
hSkill->SetElapsedDelayTime( fElapsedDelayTime );
}
DnSkillHandle MASkillUser::FindSkill( int nSkillTableID )
{
#ifndef PRE_FIX_SKILLLIST
for( DWORD i=0; i<m_vlhSkillList.size(); i++ )
{
if( m_vlhSkillList[i]->GetClassID() == nSkillTableID )
return m_vlhSkillList[i];
}
return CDnSkill::Identity();
#else
for( DWORD i = 0; i < m_vlSkillObjects.size(); ++i )
{
if( m_vlSkillObjects.at( i ).hSkill &&
m_vlSkillObjects.at( i ).hSkill->GetClassID() == nSkillTableID )
return m_vlSkillObjects.at( i ).hSkill;
}
return CDnSkill::Identity();
#endif // #ifndef PRE_FIX_SKILLLIST
}
DnSkillHandle MASkillUser::GetProcessSkill()
{
return m_hProcessSkill;
}
CDnSkill::UsingResult MASkillUser::CanExecuteSkill( DnSkillHandle hSkill )
{
_ASSERT( hSkill && "MASkillUser::CanExecuteSkill() -> Invalid hSkill" );
#ifndef _GAMESERVER
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD> <20><>Ƽ<EFBFBD><C6BC> <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ұ<EFBFBD>.
if( m_hProcessSkill &&
m_hProcessSkill->GetSkillType() == CDnSkill::Active &&
hSkill->GetSkillType() == CDnSkill::Active )
if( m_bSkillExecutedThisFrame )
return CDnSkill::UsingResult::Failed;
#endif
// [2011/02/22 semozz]
// <20>ִϸ<D6B4><CFB8>̼<EFBFBD> <20><>ȯ <20><><EFBFBD><EFBFBD> üũ<C3BC><C5A9> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20>ϸ<EFBFBD> <20>ɵ<EFBFBD>...
#if !defined(_GAMESERVER)
if (!hSkill->CheckAnimation())
return CDnSkill::UsingResult::Failed;
#endif // _GAMESERVER
#if !defined(_GAMESERVER)
if( hSkill->GetGlyphActiveSkillDisable() )
return CDnSkill::UsingResult::Failed;
#endif // _GAMESERVER
return hSkill->CanExecute();
}
#ifdef _GAMESERVER
bool MASkillUser::ExecuteSkill( DnSkillHandle hSkill, LOCAL_TIME LocalTime, float fDelta )
#else
bool MASkillUser::ExecuteSkill( DnSkillHandle hSkill, LOCAL_TIME LocalTime, float fDelta,
bool bCheckValid /*= true*/, bool bAutoUsedFromServer /*= false*/, bool bSendPacketToServer /*= true */ )
#endif
{
_ASSERT( hSkill && "Invalid hSkill" );
if( !IsValidActor() ) return false;
if( m_hProcessSkill )
{
// #25154 <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> onend <20>ȴ<EFBFBD>.
if( false == m_hProcessSkill->IsAuraOn() )
m_hProcessSkill->OnEnd( m_LocalTime, 0 );
m_hProcessSkill.Identity();
}
m_hProcessSkill = hSkill;
switch( m_hProcessSkill->GetDurationType() ) {
case CDnSkill::Instantly:
case CDnSkill::Buff:
case CDnSkill::Debuff:
case CDnSkill::SummonOnOff:
case CDnSkill::StanceChange:
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SP <20><> <20><><EFBFBD>̵<EFBFBD><CCB5><EFBFBD>
#ifndef _GAMESERVER
if( CDnWorld::MapTypeVillage != CDnWorld::GetInstance().GetMapType() )
#endif
m_pActor->UseMP( -m_hProcessSkill->GetDecreaseMP() ); // Compile Error. Moved by kalliste
//m_pActor->SetSP( m_pActor->GetSP() - m_hProcessSkill->GetDecreaseMP() );
// Excute <20>Լ<EFBFBD><D4BC><EFBFBD> OnBegin <20><><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20>ٲ<EFBFBD><D9B2><EFBFBD><EFBFBD><EFBFBD>.
//m_hProcessSkill->Execute( LocalTime, fDelta );
m_hProcessSkill->OnBegin( LocalTime, fDelta );
// <20>۷ι<DBB7> <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE>ִٸ<D6B4> <20><><EFBFBD><EFBFBD> <20>׷<EFBFBD><D7B7><EFBFBD> <20><>ų<EFBFBD><20><>Ÿ<EFBFBD><C5B8> <20><><EFBFBD><EFBFBD>..
if( m_hProcessSkill && 0 < m_hProcessSkill->GetGlobalSkillGroupID() )
{
for( DWORD i = 0; i < GetSkillCount(); ++i )
{
// m_vlGroupedSkillIDs <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD><CCBA><EFBFBD><EFBFBD><EFBFBD> <20>׳<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>̱<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD>ߴ<EFBFBD><DFB4><EFBFBD> <20><><EFBFBD>ΰ<EFBFBD> Ȯ<>εǾ<CEB5><C7BE><EFBFBD> <20>Ѵ<EFBFBD>.
DnSkillHandle hExistSkill = GetSkillFromIndex( i );
if( hExistSkill &&
hExistSkill != m_hProcessSkill &&
hExistSkill->GetGlobalSkillGroupID() == m_hProcessSkill->GetGlobalSkillGroupID() )
{
// <20>۷ι<DBB7> <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٲ<EFBFBD><D9B2>ش<EFBFBD>.
hExistSkill->ResetCoolTime();
hExistSkill->OnAnotherGlobalSkillBeginCoolTime( hSkill );
hExistSkill->OnBeginCoolTime();
}
}
}
break;
case CDnSkill::TimeToggle:
case CDnSkill::ActiveToggle:
case CDnSkill::ActiveToggleForSummon:
{
bool bToggleEnable = !hSkill->IsToggleOn();
hSkill->EnableToggle(bToggleEnable);
OnSkillToggle(hSkill, bToggleEnable);
#ifdef _GAMESERVER
// NOTE: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>صд<D8B5>. <20><><EFBFBD>Ŀ<EFBFBD> <20><><EFBFBD>ݷ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ٸ<EFBFBD> <20>͵<EFBFBD><CDB5><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD>.
if( hSkill && hSkill->IsToggleOn() )
{
m_ActorStateSnapshotForToggleProjectile.ResetState();
hSkill->CheckAndAddSelfStateEffect();
static_cast<CDnActor*>(this)->GetStateBlow()->Process( 0, 0.0f );
CDnActor* pActor = static_cast<CDnActor*>(this);
m_ActorStateSnapshotForToggleProjectile = *(static_cast<CDnState*>(pActor));
hSkill->CheckAndRemoveInstantApplySelfStateEffect();
}
#endif
}
break;;
case CDnSkill::Aura:
{
// <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><EFBFBD><E9B3A2> <20><><EFBFBD>۸<EFBFBD> <20><><EFBFBD><EFBFBD>. <20>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD≯<EFBFBD> <20><><EFBFBD>ش<EFBFBD>.
// <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ű<EFBFBD><C5B0> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>󿡼<EFBFBD> self blow ť<><C5A5> <20><><EFBFBD><EFBFBD> <20>͵<EFBFBD><CDB5><EFBFBD>
// Ŭ<><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>.
bool bProcessingAuraOff = false; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> execute <20>Ǹ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
int iNumAuraSkill = (int)m_vlhAuraSkills.size();
for( int iAuraSkill = 0; iAuraSkill < iNumAuraSkill; ++iAuraSkill )
{
DnSkillHandle hAuraSkill = m_vlhAuraSkills.at( iAuraSkill );
_ASSERT( hAuraSkill->GetDurationType() == CDnSkill::Aura );
if( hAuraSkill->IsAuraOn() )
{
if( m_hProcessSkill == hAuraSkill )
bProcessingAuraOff = true;
hAuraSkill->EnableAura( false );
OnSkillAura( hAuraSkill, false );
break;
}
}
// <20>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ߵ<EFBFBD><DFB5><EFBFBD>.
if( false == bProcessingAuraOff )
{
for( int iAuraSkill = 0; iAuraSkill < iNumAuraSkill; ++iAuraSkill )
{
DnSkillHandle hAuraSkill = m_vlhAuraSkills.at( iAuraSkill );
if( hAuraSkill == m_hProcessSkill )
{
m_hProcessSkill->EnableAura( true );
OnSkillAura( m_hProcessSkill, true );
break;
// Note <20>ѱ<EFBFBD>: m_hProcessSkill <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȿ<EFBFBD>ؾ<EFBFBD>
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CDnPlayerActor::CmdStop() <20>ʿ<EFBFBD><CABF><EFBFBD> <20>ɷ<EFBFBD><C9B7><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ش<EFBFBD> <20>׼<EFBFBD> <20>ñ׳<C3B1><D7B3><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// ó<><C3B3><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CDnActor::OnChangeAction <20>ʿ<EFBFBD><CABF><EFBFBD> ProcessSkill <20><> Identity <20><>Ŵ.
}
}
}
else
{
// <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
m_hAuraSkill.Identity();
m_hProcessSkill.Identity();
}
}
break;
}
#ifndef _GAMESERVER
m_bSkillExecutedThisFrame = true;
#endif
return true;
}
#ifdef _GAMESERVER
void MASkillUser::UseAutoPassiveSkill( LOCAL_TIME LocalTime, float fDelta )
{
list<DnSkillHandle>::iterator iter = m_listAutoPassiveSkills.begin();
for( iter; m_listAutoPassiveSkills.end() != iter; ++iter )
{
DnSkillHandle hSkill = *iter;
if( CDnSkill::UsingResult::Success == CanExecuteSkill( hSkill ) )
{
BYTE pBuffer[128] = {0,};
CPacketCompressStream Stream( pBuffer, 128 );
int iSkillID = hSkill->GetClassID();
int iEnchantSkillID = hSkill->GetEnchantedSkillID();
char cLevel = hSkill->GetLevel();
EtVector2 vLook, vZVec;
bool bUseApplySkillItem = false;
char cUseSignalSkill = -1;
bool bAutoUseFromServer = true;
bool abSignalSkillCheck[ 3 ] = { false };
vLook = EtVec3toVec2( *m_pActor->GetLookDir() );
vZVec = EtVec3toVec2( *m_pActor->GetMoveVectorZ() );
Stream.Write( &iSkillID, sizeof(int) );
Stream.Write( &cLevel, sizeof(char) );
Stream.Write( &bUseApplySkillItem, sizeof(bool) );
Stream.Write( abSignalSkillCheck, sizeof(abSignalSkillCheck) );
Stream.Write( &vZVec, sizeof(EtVector2), CPacketCompressStream::VECTOR2_SHORT );
Stream.Write( &vLook, sizeof(EtVector2), CPacketCompressStream::VECTOR2_SHORT );
Stream.Write( &bAutoUseFromServer, sizeof(bool) );
Stream.Write( &iEnchantSkillID, sizeof(int) );
#ifdef PRE_ADD_POSITION_SYNC_BY_SKILL_USAGE
Stream.Write( m_pActor->GetPosition(), sizeof(EtVector3), CPacketCompressStream::VECTOR3_BIT );
#endif
m_pActor->Send( eActor::SC_USESKILL, &Stream );
ExecuteSkill( hSkill, LocalTime, fDelta );
// <20>ߵ<EFBFBD><DFB5><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>־<EFBFBD><D6BE>д<EFBFBD>. process <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
m_listProcessAutoPassiveSkills.push_back( hSkill );
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>нú<D0BD> <20><>ų<EFBFBD><C5B3> <20><> <20>ڿ<EFBFBD> <20><><EFBFBD>δ<EFBFBD>. <20><><EFBFBD><EFBFBD> <20><EFBFBD><ECBCB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
m_listAutoPassiveSkills.erase( iter );
m_listAutoPassiveSkills.push_back( hSkill );
// ProcessSkill <20><> <20>ƴϹǷ<CFB9> <20>ʱ<EFBFBD>ȭ <20><>Ŵ. ProcessSkill <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CmdStop <20><> <20><><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
m_hProcessSkill.Identity();
break;
}
}
}
bool MASkillUser::IsProcessingAutoPassive( int iSkillID )
{
list<DnSkillHandle>::iterator iter = m_listProcessAutoPassiveSkills.begin();
for( iter; iter != m_listProcessAutoPassiveSkills.end(); ++iter )
{
DnSkillHandle hAutoPassive = *iter;
if( hAutoPassive->GetClassID() == iSkillID )
return true;
}
return false;
}
void MASkillUser::EndAutoPassiveSkill( LOCAL_TIME LocalTime, float fDelta )
{
list<DnSkillHandle>::iterator iter = m_listProcessAutoPassiveSkills.begin();
for( iter; iter != m_listProcessAutoPassiveSkills.end(); ++iter )
{
DnSkillHandle hAutoPassive = *iter;
hAutoPassive->OnEnd( LocalTime, fDelta );
}
}
#endif
bool MASkillUser::HavePassiveSkill(int iSkillID)
{
int iNumSkill = (int)m_vlhSelfPassiveBlowSkill.size();
for (int iSkill = 0; iSkill < iNumSkill; ++iSkill)
{
DnSkillHandle hSkill = m_vlhSelfPassiveBlowSkill.at(iSkill);
if (iSkillID == hSkill->GetClassID())
return true;
}
return false;
}
void MASkillUser::OnSkillProcess( LOCAL_TIME LocalTime, float fDelta )
{
if( m_hAuraSkill )
{
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǵ<EFBFBD><C7B4>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ű<EFBFBD><C5B0><><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><>Ŷ <20><><EFBFBD><EFBFBD>...
#if defined(_GAMESERVER)
if( m_hAuraSkill->IsFinished() )
{
if (m_pActor)
m_pActor->CmdFinishAuraSkill(m_hAuraSkill->GetClassID());
// [2011/03/22 semozz]
// <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD≯<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20>ʱ<EFBFBD>ȭ.
if (m_hProcessSkill == m_hAuraSkill)
m_hProcessSkill.Identity();
OnSkillAura( m_hAuraSkill, false );
}
else
#endif // _GAMESERVER
m_hAuraSkill->ProcessExecute( LocalTime, fDelta );
}
#ifdef _GAMESERVER
if( m_pActor && m_pActor->IsPlayerActor() )
{
list<DnSkillHandle>::iterator iter = m_listProcessAutoPassiveSkills.begin();
for( iter; m_listProcessAutoPassiveSkills.end() != iter; )
{
DnSkillHandle hSkill = *iter;
//<2F><>ų <20>ڵ<EFBFBD> <20><>ȿ<EFBFBD><C8BF> üũ <20>߰<EFBFBD>
if (!hSkill)
{
iter = m_listProcessAutoPassiveSkills.erase( iter );
}
else
{
if( hSkill->IsFinished() )
{
iter = m_listProcessAutoPassiveSkills.erase( iter );
}
else
{
hSkill->ProcessExecute( LocalTime, fDelta );
++iter;
}
}
}
m_PrefixSkillCoolTimeManager.Process(LocalTime, fDelta);
iter = m_listProcessPreFixDefenceSkills.begin();
for( iter; m_listProcessPreFixDefenceSkills.end() != iter; )
{
DnSkillHandle hSkill = *iter;
//<2F><>ų <20>ڵ<EFBFBD> <20><>ȿ<EFBFBD><C8BF> üũ <20>߰<EFBFBD>
if (!hSkill)
{
iter = m_listProcessPreFixDefenceSkills.erase( iter );
}
else
{
if( hSkill->IsFinished() )
{
hSkill->OnEnd( LocalTime, fDelta );
iter = m_listProcessPreFixDefenceSkills.erase( iter );
}
else
{
hSkill->ProcessExecute( LocalTime, fDelta );
++iter;
}
}
}
iter = m_listProcessPreFixOffenceSkills.begin();
for( iter; m_listProcessPreFixOffenceSkills.end() != iter; )
{
DnSkillHandle hSkill = *iter;
if (!hSkill)
{
iter = m_listProcessPreFixOffenceSkills.erase( iter );
}
else
{
if( hSkill->IsFinished() )
{
hSkill->OnEnd( LocalTime, fDelta );
iter = m_listProcessPreFixOffenceSkills.erase( iter );
}
else
{
hSkill->ProcessExecute( LocalTime, fDelta );
++iter;
}
}
}
if (!m_prefixSystemDefenceSkills.empty())
{
PREFIX_SYSTEM_SKILL_LIST::iterator iter = m_prefixSystemDefenceSkills.begin();
PREFIX_SYSTEM_SKILL_LIST::iterator enditer = m_prefixSystemDefenceSkills.end();
for (; iter != enditer; ++iter)
{
if (iter->second.hSkill)
iter->second.hSkill->Process(LocalTime, fDelta);
}
}
if (!m_prefixSystemOffenceSkills.empty())
{
PREFIX_SYSTEM_SKILL_LIST::iterator iter = m_prefixSystemOffenceSkills.begin();
PREFIX_SYSTEM_SKILL_LIST::iterator enditer = m_prefixSystemOffenceSkills.end();
for (; iter != enditer; ++iter)
{
if (iter->second.hSkill)
iter->second.hSkill->Process(LocalTime, fDelta);
}
}
}
#else
m_bSkillExecutedThisFrame = false;
#endif
if( m_hProcessSkill )
{
if( m_hProcessSkill->IsFinished() )
{
m_hProcessSkill->OnEnd( LocalTime, fDelta );
m_hProcessSkill.Identity();
}
else
m_hProcessSkill->ProcessExecute( LocalTime, fDelta );
}
// <20><>Ÿ<EFBFBD><C5B8> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20>ִٸ<D6B4> <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
if( m_pActor && m_pActor->IsAppliedThisStateBlow( STATE_BLOW::BLOW_096 ) )
{
DNVector(DnBlowHandle) vlhCoolTimeBlows;
m_pActor->GetStateBlow()->GetStateBlowFromBlowIndex( STATE_BLOW::BLOW_096, vlhCoolTimeBlows );
// <20><>Ÿ<EFBFBD><C5B8> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD>̱⶧<CCB1><E2B6A7><EFBFBD><EFBFBD> <20><>ø<EFBFBD>Ǹ<EFBFBD> <20><><EFBFBD>ش<EFBFBD>.
float fCoolTimeDeltaAdjust = 1.0f;
int iNumBlow = (int)vlhCoolTimeBlows.size();
for( int i = 0; i < iNumBlow; ++i )
{
fCoolTimeDeltaAdjust -= (1.0f - vlhCoolTimeBlows.at( i )->GetFloatValue());
}
// #40670 <20><><EFBFBD>Ǹ<EFBFBD> <20>ν<EFBFBD>Ʈ<EFBFBD><C6AE> <20><>Ÿ<EFBFBD><C5B8> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><>.
// <20><>ø<EFBFBD><C3B8> WeightTable <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ް<EFBFBD> <20>ȴ<EFBFBD>.
float fCoolTimeAccelMax = CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::CoolTimeAccellSE_Max );
if( fCoolTimeDeltaAdjust < 1.0f - fCoolTimeAccelMax )
fCoolTimeDeltaAdjust = 1.0f - fCoolTimeAccelMax;
// 1.0f <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ġ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD>ڰ<EFBFBD><DAB0><EFBFBD> <20><>ü <20><>Ÿ<EFBFBD>ӿ<EFBFBD> <20>״<EFBFBD><D7B4><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ÿ<EFBFBD><C5B8> <20><><EFBFBD><EFBFBD><EFBFBD>̹Ƿ<CCB9>
// <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD> <20><>Ÿ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ѵ<EFBFBD>.
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><> <20><><EFBFBD>Ϳ<EFBFBD><CDBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. 2415<31><35> Ÿ<><C5B8> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̼<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD>.
m_fCoolTimeDeltaAdjustValue = 1.0f / fCoolTimeDeltaAdjust;
}
else
m_fCoolTimeDeltaAdjustValue = 1.0f;
#ifdef _GAMESERVER
#ifndef PRE_FIX_SKILLLIST
#ifdef PRE_FIX_GAMESERVER_PERFOMANCE
// <20><>Ÿ<EFBFBD><C5B8> ó<><C3B3>. <20><><EFBFBD>Ŀ<EFBFBD> <20><> Ÿ<><C5B8> <20>Ӹ<EFBFBD> <20>ƴ϶<C6B4> <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Processing <20><> <20>ϰ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.
if( m_pActor && m_pActor->IsPlayerActor() /*&& m_pActor->IsAllowCallSkillProcess( fDelta )*/ )
{
#endif // #ifdef PRE_FIX_GAMESERVER_PERFOMANCE
for( DWORD i = 0; i < m_vlhSkillList.size(); i++ )
{
if( m_vlhSkillList.at( i ) )
m_vlhSkillList[i]->Process( LocalTime, fDelta );
}
#ifdef PRE_FIX_GAMESERVER_PERFOMANCE
}
#endif // #ifdef PRE_FIX_GAMESERVER_PERFOMANCE
#else
#ifdef PRE_FIX_GAMESERVER_PERFOMANCE
if( m_pActor && m_pActor->IsPlayerActor() /*&& m_pActor->IsAllowCallSkillProcess( fDelta )*/ )
{
#endif // #ifdef PRE_FIX_GAMESERVER_PERFOMANCE
PROFILE_TIME_TEST_BLOCK_START( "OnSkillProcess() - SkillHandleLoop" );
// <20><>Ÿ<EFBFBD><C5B8> ó<><C3B3>. <20><><EFBFBD>Ŀ<EFBFBD> <20><> Ÿ<><C5B8> <20>Ӹ<EFBFBD> <20>ƴ϶<C6B4> <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Processing <20><> <20>ϰ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.
for( DWORD i = 0; i < m_vlSkillObjects.size(); i++ )
{
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><20><>ų <20><>ü <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϴ<EFBFBD> SkillTask <20><> <20><><EFBFBD><EFBFBD> <20>Ҹ<EFBFBD><D2B8>Ǿ<EFBFBD> valid üũ<C3BC><C5A9> <20>ؾ<EFBFBD> <20><>.
if( m_vlSkillObjects.at( i ).hSkill )
m_vlSkillObjects.at( i ).hSkill->Process( LocalTime, fDelta );
}
PROFILE_TIME_TEST_BLOCK_END();
#ifdef PRE_FIX_GAMESERVER_PERFOMANCE
}
#endif // #ifdef PRE_FIX_GAMESERVER_PERFOMANCE
#endif // #ifndef PRE_FIX_SKILLLIST
#else
#ifndef PRE_FIX_SKILLLIST
for( DWORD i = 0; i < m_vlhSkillList.size(); i++ )
{
if( m_vlhSkillList.at( i ) )
m_vlhSkillList[i]->Process( LocalTime, fDelta );
}
#else
// <20><>Ÿ<EFBFBD><C5B8> ó<><C3B3>. <20><><EFBFBD>Ŀ<EFBFBD> <20><> Ÿ<><C5B8> <20>Ӹ<EFBFBD> <20>ƴ϶<C6B4> <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Processing <20><> <20>ϰ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.
for( DWORD i = 0; i < m_vlSkillObjects.size(); i++ )
{
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><20><>ų <20><>ü <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϴ<EFBFBD> SkillTask <20><> <20><><EFBFBD><EFBFBD> <20>Ҹ<EFBFBD><D2B8>Ǿ<EFBFBD> valid üũ<C3BC><C5A9> <20>ؾ<EFBFBD> <20><>.
if( m_vlSkillObjects.at( i ).hSkill )
m_vlSkillObjects.at( i ).hSkill->Process( LocalTime, fDelta );
}
#endif // #ifndef PRE_FIX_SKILLLIST
#endif // #ifdef _GAMESERVER
// <20><><EFBFBD><EFBFBD><EFBFBD>ۿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20>ִٸ<D6B4> Process
if( m_hItemSkill )
{
if( m_hItemSkill->IsFinished() )
{
m_hItemSkill->OnEnd( LocalTime, fDelta );
deque<DnSkillHandle>::iterator iter = find( m_dqhItemSkillList.begin(), m_dqhItemSkillList.end(), m_hItemSkill );
_ASSERT( m_dqhItemSkillList.end() != iter );
m_dqhItemSkillList.erase( iter );
SAFE_RELEASE_SPTR( m_hItemSkill );
}
else
m_hItemSkill->ProcessExecute( LocalTime, fDelta );
}
for( DWORD i = 0; i < m_dqhItemSkillList.size(); ++i )
{
m_dqhItemSkillList.at( i )->Process( LocalTime, fDelta );
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20><>Ŵ.
int iNumReservedFinishSkill = (int)m_vlhReservedFinishSkill.size();
for( int iSkill = 0; iSkill < iNumReservedFinishSkill; ++iSkill )
{
DnSkillHandle hSkill = m_vlhReservedFinishSkill.at( iSkill );
if( hSkill == m_hProcessSkill )
{
m_hProcessSkill->OnEnd( LocalTime, fDelta );
m_hProcessSkill.Identity();
}
else
if( hSkill == m_hToggleSkill )
{
_ASSERT( m_hToggleSkill->IsToggleOn() );
if( m_hToggleSkill->IsToggleOn() )
OnSkillToggle( m_hToggleSkill, false );
}
else
if( hSkill == m_hAuraSkill )
{
_ASSERT( m_hAuraSkill->IsAuraOn() );
if( m_hAuraSkill->IsAuraOn() )
OnSkillAura( m_hAuraSkill, false );
}
}
if( false == m_vlhReservedFinishSkill.empty() )
m_vlhReservedFinishSkill.clear();
}
// <20><> <20>Լ<EFBFBD><D4BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD> <20>÷<EFBFBD><C3B7>̾<EFBFBD><CCBE><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> OnSignal <20><><EFBFBD><EFBFBD> Projectile <20><> <20>ɸ<EFBFBD><C9B8><EFBFBD> <20>׻<EFBFBD> ȣ<><C8A3><EFBFBD>ȴ<EFBFBD>!!
void MASkillUser::OnSkillProjectile( CDnProjectile *pProjectile )
{
if( !IsValidActor() )
return;
// Projectile <20><> <20>Ѹ<EFBFBD><D1B8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٲ<EFBFBD><D9B2>ش<EFBFBD>.
bool bClientSide = false;
#if defined( _GAMESERVER )
if( m_pActor->GetClassID() <= CDnActor::Reserved6 && m_pActor->IsPlayerActor() && ((CDnPlayerActor*)m_pActor)->IsLocalActor() )
bClientSide = true;
#endif // #if defined( _GAMESERVER )
if( m_hToggleSkill && m_hToggleSkill->IsToggleOn() )
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Enable <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> ó<><C3B3><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD>.
_ASSERT( m_hToggleSkill->IsToggleOn() );
CDnChangeProjectileProcessor* pChangeProj = static_cast<CDnChangeProjectileProcessor*>(m_hToggleSkill->GetProcessor( IDnSkillProcessor::CHANGE_PROJECTILE ));
if( pChangeProj )
{
int iCheckProjectileID = ( bClientSide ) ? pChangeProj->GetSourceWeaponID() : pChangeProj->GetChangeWeaponID();
if( pProjectile->GetClassID() == iCheckProjectileID )
{
if( m_hToggleSkill->GetDurationType() == CDnSkill::ActiveToggle )
{
if( !(m_hToggleSkill->GetDecreaseMP() > 0 && m_pActor->GetSP() < m_hToggleSkill->GetDecreaseMP()) )
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SP <20><> <20><><EFBFBD>̵<EFBFBD><CCB5><EFBFBD>
#ifndef _GAMESERVER
if( CDnWorld::MapTypeVillage != CDnWorld::GetInstance().GetMapType() )
#endif
m_pActor->UseMP( -m_hToggleSkill->GetDecreaseMP() );
//m_pActor->SetSP( m_pActor->GetSP() - m_hToggleSkill->GetDecreaseMP() );
if( bClientSide )
{
int iWeaponLength = pProjectile->GetWeaponLength() - pProjectile->GetOriginalWeaponLength();
*(CDnWeapon*)pProjectile = *pChangeProj->GetProjectile();
pProjectile->SetWeaponLength( iWeaponLength + pProjectile->GetOriginalWeaponLength() );
}
OnSkillToggleProjectile( m_hToggleSkill, pProjectile );
if( m_pActor->GetSP() < m_hToggleSkill->GetDecreaseMP() )
{
OnSkillToggle( m_hToggleSkill, false );
}
}
}
}
}
else
{
// ChangeAction <20>̶<EFBFBD><CCB6><EFBFBD> <20><>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
CDnChangeActionStrProcessor* pChangeAction = static_cast<CDnChangeActionStrProcessor*>(m_hToggleSkill->GetProcessor( IDnSkillProcessor::CHANGE_ACTIONSTR ));
if( pChangeAction )
{
if( m_hToggleSkill->GetDurationType() == CDnSkill::ActiveToggle )
{
if( !(m_hToggleSkill->GetDecreaseMP() > 0 && m_pActor->GetSP() < m_hToggleSkill->GetDecreaseMP()) )
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SP <20><> <20><><EFBFBD>̵<EFBFBD><CCB5><EFBFBD>
#ifndef _GAMESERVER
if( CDnWorld::MapTypeVillage != CDnWorld::GetInstance().GetMapType() )
#endif
m_pActor->UseMP( -m_hToggleSkill->GetDecreaseMP() );
//m_pActor->SetSP( m_pActor->GetSP() - m_hToggleSkill->GetDecreaseMP() );
OnSkillToggleProjectile( m_hToggleSkill, pProjectile );
if( m_pActor->GetSP() < m_hToggleSkill->GetDecreaseMP() )
{
OnSkillToggle( m_hToggleSkill, false );
}
}
}
}
}
}
#ifdef _GAMESERVER
if( pProjectile && !bClientSide )
{
// Note <20>ѱ<EFBFBD>: <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20>ʿ<EFBFBD><CABF><EFBFBD> ActorState <20><> Projectile <20><> <20>Ǿ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
// <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20>ƴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><20><><EFBFBD><20><><EFBFBD>ݷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if( !m_hToggleSkill && m_hProcessSkill )
{
static_cast<CDnActor*>(this)->GetStateBlow()->Process( 0, 0.0f );
CDnActor* pActor = static_cast<CDnActor*>(this);
// ü<><C3BC> <20><>ų <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>߻<EFBFBD>ü<EFBFBD><C3BC>
// CDnState <20><><EFBFBD><20>ſ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>Ͼ <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> shaared_ptr <20><><EFBFBD><EFBFBD>.
boost::shared_ptr<CDnState> pActorStateSnapshot = boost::shared_ptr<CDnState>(new CDnState);
*pActorStateSnapshot = *(static_cast<CDnState*>(pActor));
// <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><ECBFA1> <20><><EFBFBD>
pProjectile->FromSkill( true );
pProjectile->SetShooterStateSnapshot( pActorStateSnapshot );
#if defined(PRE_FIX_65287)
float fFinalDamageRate = 0.0f;
if (pActor && pActor->IsAppliedThisStateBlow(STATE_BLOW::BLOW_050))
{
DNVector(DnBlowHandle) vlhBlows;
pActor->GatherAppliedStateBlowByBlowIndex( STATE_BLOW::BLOW_050, vlhBlows );
int iNumBlow = (int)vlhBlows.size();
for( int i = 0; i < iNumBlow; ++i )
{
fFinalDamageRate += vlhBlows[i]->GetFloatValue();
}
}
pProjectile->SetShooterFinalDamageRate(fFinalDamageRate);
#endif // PRE_FIX_65287
}
else if( m_hToggleSkill && m_hToggleSkill->IsToggleOn() )
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ڵ<EFBFBD> <20><><EFBFBD>ܵ<EFBFBD>. 2011.03.15
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɷ<EFBFBD>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ÿ<EFBFBD>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>.
boost::shared_ptr<CDnState> pActorStatesnapshot = boost::shared_ptr<CDnState>( new CDnState );
*pActorStatesnapshot = m_ActorStateSnapshotForToggleProjectile;
pProjectile->SetShooterStateSnapshot( pActorStatesnapshot );
pProjectile->FromSkill( true );
#if defined(PRE_FIX_65287)
CDnActor* pActor = static_cast<CDnActor*>(this);
float fFinalDamageRate = 0.0f;
if (pActor && pActor->IsAppliedThisStateBlow(STATE_BLOW::BLOW_050))
{
DNVector(DnBlowHandle) vlhBlows;
pActor->GatherAppliedStateBlowByBlowIndex( STATE_BLOW::BLOW_050, vlhBlows );
int iNumBlow = (int)vlhBlows.size();
for( int i = 0; i < iNumBlow; ++i )
{
fFinalDamageRate += vlhBlows[i]->GetFloatValue();
}
}
pProjectile->SetShooterFinalDamageRate(fFinalDamageRate);
#endif // PRE_FIX_65287
}
else if( m_pActor->IsAppliedThisStateBlow( STATE_BLOW::BLOW_121 ) || m_pActor->IsAppliedThisStateBlow( STATE_BLOW::BLOW_129 ) )
{
// #30362 <20><><EFBFBD>ĵ<EFBFBD> <20>׼<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߻<EFBFBD>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><ECBFA1> <20><>ų <20>߻<EFBFBD>ü<EFBFBD><C3BC> ó<><C3B3> <20><>.
pProjectile->FromSkill( true );
}
}
#endif
}
void MASkillUser::OnSkillToggleProjectile( DnSkillHandle hSkill, CDnProjectile *pProjectile )
{
}
void MASkillUser::OnSkillToggle( DnSkillHandle hSkill, bool bEnable )
{
if( !IsValidActor() ) return;
if( bEnable )
{
switch( hSkill->GetDurationType() )
{
case CDnSkill::ActiveToggle:
case CDnSkill::ActiveToggleForSummon:
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SP <20><> <20><><EFBFBD>̵<EFBFBD><CCB5><EFBFBD>
#ifndef _GAMESERVER
if( CDnWorld::MapTypeVillage != CDnWorld::GetInstance().GetMapType() )
#endif
// <20><><EFBFBD>۸<EFBFBD><DBB8>Ҷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>. <20><> <20><> <20><><EFBFBD><EFBFBD>
//m_pActor->SetSP( m_pActor->GetSP() - hSkill->GetDecreaseSP() );
hSkill->OnBegin( m_LocalTime, 0.0f );
break;
case CDnSkill::TimeToggle:
hSkill->OnBegin( m_LocalTime, 0.0f );
break;
}
SkillToggle(hSkill, true);
}
else
{
SkillToggle(hSkill, false);
hSkill->OnEnd( m_LocalTime, 0.0f );
hSkill->EnableToggle( false );
}
//if( bEnable ) {
// switch( hSkill->GetDurationType() ) {
// case CDnSkillBase::TimeToggle:
// pActor->SetSP( pActor->GetSP() - hSkill->GetDecreaseSP() );
// hSkill->Execute( m_LocalTime, 0.f );
// break;
// case CDnSkillBase::ActiveToggle:
// hSkill->Execute( m_LocalTime, 0.f );
// break;
// case CDnSkillBase::Aura:
// pActor->SetSP( pActor->GetSP() - hSkill->GetDecreaseSP() );
// hSkill->Execute( m_LocalTime, 0.f );
// break;
// }
//}
//else {
// hSkill->Finish( m_LocalTime, 0.f );
//}
}
void MASkillUser::OnSkillAura( DnSkillHandle hSkill, bool bEnable )
{
if( !IsValidActor() ) return;
if( bEnable )
{
switch( hSkill->GetDurationType() )
{
case CDnSkill::Aura:
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SP <20><> <20><><EFBFBD>̵<EFBFBD><CCB5><EFBFBD>
#ifndef _GAMESERVER
if( CDnWorld::MapTypeVillage != CDnWorld::GetInstance().GetMapType() )
#endif
m_pActor->UseMP( -hSkill->GetDecreaseMP() );
//m_pActor->SetSP( m_pActor->GetSP() - hSkill->GetDecreaseMP() );
hSkill->OnBegin( m_LocalTime, 0.0f );
break;
}
m_hAuraSkill = hSkill;
}
else
{
hSkill->OnEnd( m_LocalTime, 0.0f );
hSkill->EnableAura( false );
if( m_hAuraSkill == hSkill )
m_hAuraSkill.Identity();
}
}
void MASkillUser::ResetToggleSkill()
{
//if( m_hToggleSkill )
// m_hToggleSkill.Identity();
//int iNumToggle = (int)m_vlhToggleSkills.size();
//for( int i = 0; i < iNumToggle; ++i )
//{
// if( m_vlhToggleSkills.at(i)->IsToggleOn() )
// OnSkillToggle( m_vlhToggleSkills.at(i), false );
//}
}
void MASkillUser::ResetAuraSkill()
{
//if( m_hAuraSkill )
// m_hAuraSkill.Identity();
//int iNumAura = (int)m_vlhAuraSkills.size();
//for( int i = 0; i < iNumAura; ++i )
//{
// if( m_vlhAuraSkills.at(i)->IsAuraOn() )
// OnSkillAura( m_vlhAuraSkills.at(i), false );
//}
}
bool MASkillUser::IsProcessSkill()
{
if( !m_hProcessSkill ) return false;
return !m_hProcessSkill->IsFinished();
return true;
}
DWORD MASkillUser::GetSkillCount()
{
#ifndef PRE_FIX_SKILLLIST
return (DWORD)m_vlhSkillList.size();
#else
return (DWORD)m_vlSkillObjects.size();
#endif // #ifndef PRE_FIX_SKILLLIST
}
DnSkillHandle MASkillUser::GetSkillFromIndex( DWORD dwIndex )
{
#ifndef PRE_FIX_SKILLLIST
if( dwIndex < 0 || dwIndex >= m_vlhSkillList.size() ) return CDnSkill::Identity();
return m_vlhSkillList[dwIndex];
#else
if( dwIndex < 0 || dwIndex >= m_vlSkillObjects.size() )
return CDnSkill::Identity();
return m_vlSkillObjects.at( dwIndex ).hSkill;
#endif // #ifndef PRE_FIX_SKILLLIST
}
CDnSkill::UsingResult MASkillUser::UseSkill( int nSkillTableID, bool bCheckValid, bool bAutoUseFromServer/* = false*/, int nLuaSkillIndex/*=-1*/ )
{
CDnSkill::UsingResult eResult = CDnSkill::UsingResult::Failed;
DnSkillHandle hSkill = FindSkill( nSkillTableID );
if( hSkill )
{
if( m_pActor && m_pActor->IsPlayerActor() )
{
if( hSkill->GetSkillType() == CDnSkill::SkillTypeEnum::EnchantPassive )
return CDnSkill::UsingResult::Hack;
}
#ifdef _GAMESERVER
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ÿ<EFBFBD><C5B8> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> 0.5<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ΰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
// <20><><EFBFBD>̵<EFBFBD><CCB5>Ҷ<EFBFBD><D2B6><EFBFBD> <20><>Ÿ 0.5<EFBFBD><EFBFBD> <20>̻<EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٸ<EFBFBD> <20><><EFBFBD>ο<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>
// <20><><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ÿ<><C5B8> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ξ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ϳ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><>Ÿ<EFBFBD>Ӻ<EFBFBD>Ÿ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ũ<>ٸ<EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE>ִ<EFBFBD> <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ <20><><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD> <20>Ѵ<EFBFBD>. (#19737)
hSkill->UpdateSkillCoolTimeExactly();
#endif
eResult = CanExecuteSkill( hSkill );
if( !bCheckValid || CDnSkill::UsingResult::Success == eResult )
{
#if defined(_CLIENT)
//<2F><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD><CCB6><EFBFBD> <20><>ȯ <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20>ִٸ<D6B4> <20><>ȯ <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><>ȯ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵ<EFBFBD>..
if (hSkill->GetDurationType() == CDnSkill::DurationTypeEnum::SummonOnOff)
{
if (hSkill->SummonMonsterOff())
return eResult;
}
#endif // _CLIENT
#ifdef _GAMESERVER
ExecuteSkill( hSkill, m_LocalTime, 0.f );
#else
ExecuteSkill( hSkill, m_LocalTime, 0.f, bCheckValid, bAutoUseFromServer );
#endif
}
#if defined(_CLIENT)
else
{
// <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20>ִٸ<D6B4> <20><>ȯ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ <20><><EFBFBD><EFBFBD> <20><>Ŵ.
if (hSkill->GetDurationType() == CDnSkill::DurationTypeEnum::SummonOnOff)
hSkill->SummonMonsterOff();
}
#endif // _CLIENT
}
return eResult;
}
bool MASkillUser::UseItemSkill( int nSkillTableID, int nSkillLevelTableID, CDnItem::ItemSkillApplyType ItemSkillApplyType, int nItemID/* = -1*/ )
{
if( !IsValidActor() ) return false;
bool bResult = true;
switch( ItemSkillApplyType )
{
case CDnItem::ApplySkill:
{
// <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> OnProcessSkill <20>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD> Finish üũ<C3BC><C5A9> <20>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20>˾Ƽ<CBBE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
DnSkillHandle hSkill = CDnSkill::CreateSkill( m_pActor->GetMySmartPtr(), nSkillTableID, nSkillLevelTableID );
if( !hSkill ) {
bResult = false;
break;
}
// <20><><EFBFBD><EFBFBD><EFBFBD>ۿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
hSkill->AsItemSkill();
#if defined(_GAMESERVER)
hSkill->SetItemID(nItemID);
#endif // _GAMESERVER
m_dqhItemSkillList.push_back( hSkill );
ExecuteSkill( hSkill, m_LocalTime, 0.f );
m_hItemSkill = hSkill;
}
break;
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
case CDnItem::ApplyStateBlow:
{
//// <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Instant <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> CDnItemTask <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD>ٷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
//DnSkillHandle hSkill = CDnSkill::CreateSkill( m_pActor->GetMySmartPtr(), nSkillTableID, nSkillLevelTableID );
//
//if( !hSkill )
// bResult = false;
//hSkill->AsItemSkill();
//// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD> <20>Լ<EFBFBD>.
//hSkill->OnBeginForceSync( m_LocalTime, 0.0f );
//hSkill->Release();
}
break;
}
return bResult;
}
void MASkillUser::ResetSkillCoolTime( void )
{
#ifndef PRE_FIX_SKILLLIST
int iNumSkill = (int)m_vlhSkillList.size();
for( int iSkill = 0; iSkill < iNumSkill; ++iSkill )
{
DnSkillHandle hSkill = m_vlhSkillList.at( iSkill );
if( hSkill )
hSkill->ResetCoolTime();
}
#else
for( DWORD i = 0; i < m_vlSkillObjects.size(); ++i )
{
DnSkillHandle hSkill = m_vlSkillObjects.at( i ).hSkill;
if (hSkill)
hSkill->ResetCoolTime();
}
#endif // #ifndef PRE_FIX_SKILLLIST
#if defined(_GAMESERVER)
m_listProcessPreFixDefenceSkills.clear();
m_listProcessPreFixOffenceSkills.clear();
if (!m_prefixSystemDefenceSkills.empty())
{
PREFIX_SYSTEM_SKILL_LIST::iterator iter = m_prefixSystemDefenceSkills.begin();
PREFIX_SYSTEM_SKILL_LIST::iterator enditer = m_prefixSystemDefenceSkills.end();
for (; iter != enditer; ++iter)
{
if (iter->second.hSkill)
iter->second.hSkill->ResetCoolTime();
}
}
if (!m_prefixSystemOffenceSkills.empty())
{
PREFIX_SYSTEM_SKILL_LIST::iterator iter = m_prefixSystemOffenceSkills.begin();
PREFIX_SYSTEM_SKILL_LIST::iterator enditer = m_prefixSystemOffenceSkills.end();
for (; iter != enditer; ++iter)
{
if (iter->second.hSkill)
iter->second.hSkill->ResetCoolTime();
}
}
m_PrefixSkillCoolTimeManager.InitList();
#endif // _GAMESERVER
}
void MASkillUser::ResetPvPSkillCoolTime()
{
#ifndef PRE_FIX_SKILLLIST
int iNumSkill = (int)m_vlhSkillList.size();
for( int iSkill = 0; iSkill < iNumSkill; ++iSkill )
{
DnSkillHandle hSkill = m_vlhSkillList.at( iSkill );
if( hSkill->GetSkillType() == CDnSkill::SkillTypeEnum::Active )
{
hSkill->OnBeginCoolTime();
}
}
#else
for( DWORD i = 0; i < m_vlSkillObjects.size(); ++i )
{
DnSkillHandle hSkill = m_vlSkillObjects.at( i ).hSkill;
if( hSkill->GetSkillType() == CDnSkill::SkillTypeEnum::Active )
{
hSkill->OnBeginCoolTime();
}
}
#endif // #ifndef PRE_FIX_SKILLLIST
}
void MASkillUser::ResetLadderSkillCoolTime()
{
#ifndef PRE_FIX_SKILLLIST
ResetSkillCoolTime();
int iNumSkill = (int)m_vlhSkillList.size();
for( int iSkill = 0; iSkill < iNumSkill; ++iSkill )
{
DnSkillHandle hSkill = m_vlhSkillList.at( iSkill );
hSkill->SetElapsedDelayTime( hSkill->GetDelayTime()/2 );
}
#else
ResetSkillCoolTime();
for( DWORD i = 0; i < m_vlSkillObjects.size(); ++i )
{
DnSkillHandle hSkill = m_vlSkillObjects.at( i ).hSkill;
hSkill->SetElapsedDelayTime( hSkill->GetDelayTime()/2 );
}
#endif // #ifndef PRE_FIX_SKILLLIST
}
#ifdef _GAMESERVER
void MASkillUser::IgnoreSkillCoolTime( void )
{
#ifndef PRE_FIX_SKILLLIST
int iNumSkill = (int)m_vlhSkillList.size();
for( int iSkill = 0; iSkill < iNumSkill; ++iSkill )
{
DnSkillHandle hSkill = m_vlhSkillList.at( iSkill );
hSkill->IgnoreCoolTime();
}
m_bIgnoreCoolTime = true;
#else
for( DWORD i = 0; i < m_vlSkillObjects.size(); ++i )
{
DnSkillHandle hSkill = m_vlSkillObjects.at( i ).hSkill;
hSkill->IgnoreCoolTime();
}
m_bIgnoreCoolTime = true;
#endif // #ifndef PRE_FIX_SKILLLIST
}
#endif
void MASkillUser::ReserveFinishSkill( DnSkillHandle hSkill )
{
if( hSkill )
{
m_vlhReservedFinishSkill.push_back( hSkill );
}
}
void MASkillUser::CancelUsingSkill( void )
{
if( m_hProcessSkill )
{
m_hProcessSkill->OnEnd( 0, 0.0f );
m_hProcessSkill.Identity();
}
};
void MASkillUser::OnAttachWeapon( DnWeaponHandle hWeapon, int iChangedWeaponIndex )
{
// <20>нú<D0BD> <20><>ų<EFBFBD><C5B3> <20>߿<EFBFBD> <20><><EFBFBD><EFBFBD><EBB0A1> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>͵<EFBFBD><CDB5><EFBFBD> <20>ֳ<EFBFBD> üũ.
// <20>ٸ<EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD> <20>־ <20>нú<D0BD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>°<EFBFBD> <20>ƴ϶<C6B4><CFB6><EFBFBD> Ȱ<><C8B0>ȭ <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
int iNumSelfBlowPassiveSkills = (int)m_vlhSelfPassiveBlowSkill.size();
for( int i = 0; i < iNumSelfBlowPassiveSkills; ++i )
{
DnSkillHandle hSkill = m_vlhSelfPassiveBlowSkill.at( i );
if( false == hSkill->IsAppliedPassiveBlows() )
{
// <20><><EFBFBD>ο<EFBFBD><CEBF><EFBFBD> <20><><EFBFBD><EFBFBD><EBB0A1> <20><><EFBFBD><EFBFBD> üũ <20><>.
ApplyPassiveSkill( hSkill );
}
}
// rangechecker <20>ִ<EFBFBD> <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> á<><C3A1> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD>ش<EFBFBD>.
#ifndef _GAMESERVER
#ifndef PRE_FIX_SKILLLIST
int iNumSkill = (int)m_vlhSkillList.size();
for( int i = 0; i < iNumSkill; ++i )
{
DnSkillHandle hSkill = m_vlhSkillList.at( i );
hSkill->UpdateRangeChecker( hSkill->GetSelectedLevelDataType() );
}
#else
for( DWORD i = 0; i < m_vlSkillObjects.size(); ++i )
{
DnSkillHandle hSkill = m_vlSkillObjects.at( i ).hSkill;
hSkill->UpdateRangeChecker( hSkill->GetSelectedLevelDataType() );
}
#endif // #ifndef PRE_FIX_SKILLLIST
#endif
}
void MASkillUser::OnDetachWeapon( DnWeaponHandle hWeapon, int iDetachedWeaponIndex )
{
// <20>нú<D0BD> <20><>ų<EFBFBD><C5B3> <20>߿<EFBFBD> <20><><EFBFBD><EFBFBD><EBB0A1> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>͵<EFBFBD><CDB5><EFBFBD> <20>ֳ<EFBFBD> üũ.
// <20><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʴ´ٸ<C2B4> <20>нú<D0BD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
int iNumSelfBlowPassiveSkills = (int)m_vlhSelfPassiveBlowSkill.size();
for( int i = 0; i < iNumSelfBlowPassiveSkills; ++i )
{
DnSkillHandle hSkill = m_vlhSelfPassiveBlowSkill.at( i );
if( hSkill->IsAppliedPassiveBlows() )
{
if( false == hSkill->IsSatisfyWeapon() )
{
int iNumStateBlow = hSkill->GetStateEffectCount();
for( int iBlow = 0; iBlow < iNumStateBlow; ++iBlow )
{
const CDnSkill::StateEffectStruct* pSE = hSkill->GetStateEffectFromIndex( iBlow );
DNVector(DnBlowHandle) vlAppliedBlows;
m_pActor->GatherAppliedStateBlowByBlowIndex( (STATE_BLOW::emBLOW_INDEX)pSE->nID, vlAppliedBlows );
int iNumAppliedBlow = (int)vlAppliedBlows.size();
for( int iAppliedBlow = 0; iAppliedBlow < iNumAppliedBlow; ++iAppliedBlow )
{
DnBlowHandle hBlow = vlAppliedBlows.at( iAppliedBlow );
if( hBlow->GetParentSkillInfo()->iSkillID == hSkill->GetClassID() )
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ٷ<EFBFBD> <20><><EFBFBD><EFBFBD>
//m_pActor->GetStateBlow()->RemoveImediatlyStateEffectFromID( hBlow->GetBlowID() );
//RebirthBlow<6F><77><EFBFBD><EFBFBD> OnBegin<69><6E><EFBFBD><EFBFBD> Ÿ<><C5B8> <20><><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǵ<EFBFBD> <20><><EFBFBD><20>߻<EFBFBD>.
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>߰<EFBFBD> <20>ϵ<EFBFBD><CFB5><EFBFBD> <20><><EFBFBD><EFBFBD>
m_pActor->GetStateBlow()->RemoveStateBlowFromID(hBlow->GetBlowID());
}
}
}
hSkill->SetAppliedPassiveBlows( false );
}
}
}
// rangechecker <20>ִ<EFBFBD> <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> á<><C3A1> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD>ش<EFBFBD>.
#ifndef _GAMESERVER
#ifndef PRE_FIX_SKILLLIST
int iNumSkill = (int)m_vlhSkillList.size();
for( int i = 0; i < iNumSkill; ++i )
{
DnSkillHandle hSkill = m_vlhSkillList.at( i );
hSkill->UpdateRangeChecker( hSkill->GetSelectedLevelDataType() );
}
#else
for( DWORD i = 0; i < m_vlSkillObjects.size(); ++i )
{
DnSkillHandle hSkill = m_vlSkillObjects.at( i ).hSkill;
hSkill->UpdateRangeChecker( hSkill->GetSelectedLevelDataType() );
}
#endif // #ifndef PRE_FIX_SKILLLIST
#endif
}
#ifdef _GAMESERVER
void MASkillUser::SelectSkillLevelDataType( int iLevelDataType, bool bPlayerSummonedMonster/* = false*/ )
{
#ifndef PRE_FIX_SKILLLIST
for( int i = 0; i < (int)m_vlhSkillList.size(); ++i )
{
DnSkillHandle hSkill = m_vlhSkillList.at( i );
hSkill->SelectLevelDataType( iLevelDataType, bPlayerSummonedMonster );
}
#else
for( DWORD i = 0; i < m_vlSkillObjects.size(); ++i )
{
DnSkillHandle hSkill = m_vlSkillObjects.at( i ).hSkill;
hSkill->SelectLevelDataType( iLevelDataType, bPlayerSummonedMonster );
}
#endif // #ifndef PRE_FIX_SKILLLIST
}
int MASkillUser::GetSelectedSkillLevelDataType( void )
{
#ifndef PRE_FIX_SKILLLIST
if( m_vlhSkillList.empty() )
return CDnSkill::NUM_SKILLLEVEL_APPLY_TYPE;
else
return m_vlhSkillList.front()->GetSelectedLevelDataType();
#else
if( m_vlSkillObjects.empty() )
return CDnSkill::NUM_SKILLLEVEL_APPLY_TYPE;
else
return m_vlSkillObjects.front().hSkill->GetSelectedLevelDataType();
#endif // #ifndef PRE_FIX_SKILLLIST
}
#endif
#ifndef _GAMESERVER
bool MASkillUser::IsUsingSkillAction( const char *szAction )
{
if( m_setUseActionNames.find( szAction ) != m_setUseActionNames.end() ) return true;
return false;
}
#endif
void MASkillUser::AddStateBlowIDToRemove(int blowID)
{
m_vlStateBlowIDToRemove.insert(std::map<int, int>::value_type(blowID, blowID));
}
void MASkillUser::InitStateBlowIDToRemove()
{
m_vlStateBlowIDToRemove.clear();
}
#ifdef _GAMESERVER
void MASkillUser::RemoveApplySEWhenTargetNormalHitProcessor( IDnSkillProcessor* pProcessor )
{
DNVector( IDnSkillProcessor* )::iterator iter = find( m_vlpApplySEWhenNormalHitProcessor.begin(), m_vlpApplySEWhenNormalHitProcessor.end(), pProcessor );
if( m_vlpApplySEWhenNormalHitProcessor.end() != iter )
m_vlpApplySEWhenNormalHitProcessor.erase( iter );
}
#endif
#if defined(_GAMESERVER)
bool MASkillUser::AddPreFixSystemDefenceSkill(int slotIndex, DnSkillHandle hSkill)
{
if (!hSkill)
{
RemovePreFixSystemDefenceSkill(slotIndex);
return false;
}
PREFIX_SYSTEM_SKILLINFO skillInfo;
skillInfo.slotIndex = slotIndex;
skillInfo.hSkill = hSkill;
skillInfo.hSkill->SetItemPrefixSkill();
//<2F>ش<EFBFBD> <20><>ų<EFBFBD><C5B3> Ȯ<><C8AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>.
CDnProbabilityChecker* pProbabilityChecker = static_cast<CDnProbabilityChecker*>(hSkill->GetChecker(IDnSkillUsableChecker::PROB_CHECKER));
skillInfo.fRatio = pProbabilityChecker ? pProbabilityChecker->GetProbability() : 0.0f;
bool bResult = m_prefixSystemDefenceSkills.insert(PREFIX_SYSTEM_SKILL_LIST::value_type(slotIndex, skillInfo)).second;
// if (bResult)
// RefreshPrefixDefenceSkills();
#if defined(PRE_ADD_PREFIX_SYSTE_RENEW)
AddPrefixDefenceSkill(hSkill);
#endif // PRE_ADD_PREFIX_SYSTE_RENEW
return bResult;
}
void MASkillUser::RemovePreFixSystemDefenceSkill(int slotIndex)
{
PREFIX_SYSTEM_SKILL_LIST::iterator iter = m_prefixSystemDefenceSkills.find(slotIndex);
if (iter != m_prefixSystemDefenceSkills.end())
{
DnSkillHandle hSkill = iter->second.hSkill;
#if defined(PRE_ADD_PREFIX_SYSTE_RENEW)
RemovePrefixDefenceSkill(hSkill);
#endif // PRE_ADD_PREFIX_SYSTE_RENEW
RemoveProcessPrefixDefenceSkill(hSkill);
SAFE_RELEASE_SPTR(hSkill);
m_prefixSystemDefenceSkills.erase(iter);
//RefreshPrefixDefenceSkills();
}
}
void MASkillUser::RemoveProcessPrefixDefenceSkill(DnSkillHandle hSkill)
{
list<DnSkillHandle>::iterator iter = m_listProcessPreFixDefenceSkills.begin();
for( ; iter != m_listProcessPreFixDefenceSkills.end(); )
{
DnSkillHandle hProcessPrefixDefenceSkill = *iter;
if (hProcessPrefixDefenceSkill == hSkill)
{
iter = m_listProcessPreFixDefenceSkills.erase(iter);
continue;
}
++iter;
}
}
void MASkillUser::RefreshPrefixDefenceSkills()
{
PREFIX_SYSTEM_SKILL_COLLECTION sameSkillList;
//1. <20><><EFBFBD>Ժ<EFBFBD><D4BA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
GroupingPrefixDefenceSkillsBySameSkillID(m_prefixSystemDefenceSkills, sameSkillList);
PREFIX_SYSTEM_SKILL_LIST tempCandiateDefenceSkills;
//2. <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> Ȯ<><C8AE><EFBFBD><EFBFBD> <20><><EFBFBD>ؼ<EFBFBD> Ȯ<><C8AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD>, <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><EFBFBD><E0BCAE> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
CalculateProbabilitySkill(tempCandiateDefenceSkills, sameSkillList);
//3. <20><>ųID<49><44><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><EFBFBD><E0BCAE> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><EFBFBD><ECBCB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>׷<EFBFBD><D7B7><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
GroupingSkillByPriority(m_PrefixSystemCandiateDefenceSkills, tempCandiateDefenceSkills);
}
bool MASkillUser::AddPreFixSystemOffenceSkill(int slotIndex, DnSkillHandle hSkill)
{
if (!hSkill)
{
RemovePreFixSystemOffenceSkill(slotIndex);
return false;
}
PREFIX_SYSTEM_SKILLINFO skillInfo;
skillInfo.slotIndex = slotIndex;
skillInfo.hSkill = hSkill;
skillInfo.hSkill->SetItemPrefixSkill();
//<2F>ش<EFBFBD> <20><>ų<EFBFBD><C5B3> Ȯ<><C8AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>.
CDnProbabilityChecker* pProbabilityChecker = static_cast<CDnProbabilityChecker*>(hSkill->GetChecker(IDnSkillUsableChecker::PROB_CHECKER));
skillInfo.fRatio = pProbabilityChecker ? pProbabilityChecker->GetProbability() : 0.0f;
bool bResult = m_prefixSystemOffenceSkills.insert(PREFIX_SYSTEM_SKILL_LIST::value_type(slotIndex, skillInfo)).second;
// if (bResult)
// RefreshPrefixOffenceSkills();
#if defined(PRE_ADD_PREFIX_SYSTE_RENEW)
AddPrefixOffenceSkill(hSkill);
#endif // PRE_ADD_PREFIX_SYSTE_RENEW
return bResult;
}
void MASkillUser::RemovePreFixSystemOffenceSkill(int slotIndex)
{
PREFIX_SYSTEM_SKILL_LIST::iterator iter = m_prefixSystemOffenceSkills.begin();
for( ; iter != m_prefixSystemOffenceSkills.end(); )
{
if( iter->first == slotIndex )
{
DnSkillHandle hSkill = iter->second.hSkill;
hSkill->OnEnd( 0, 0.f );
#if defined(PRE_ADD_PREFIX_SYSTE_RENEW)
RemovePrefixOffenceSkill(hSkill);
#endif // PRE_ADD_PREFIX_SYSTE_RENEW
RemoveProcessPrefixOffenceSkill(hSkill);
SAFE_RELEASE_SPTR(hSkill);
iter = m_prefixSystemOffenceSkills.erase(iter);
continue;
}
++iter;
}
}
void MASkillUser::RemoveProcessPrefixOffenceSkill(DnSkillHandle hSkill)
{
list<DnSkillHandle>::iterator iter = m_listProcessPreFixOffenceSkills.begin();
for( ; iter != m_listProcessPreFixOffenceSkills.end(); )
{
DnSkillHandle hProcessPrefixOffenceSkill = *iter;
if (hProcessPrefixOffenceSkill == hSkill)
{
iter = m_listProcessPreFixOffenceSkills.erase(iter);
continue;
}
++iter;
}
}
void MASkillUser::RefreshPrefixOffenceSkills(float fHitDamageProb)
{
PREFIX_SYSTEM_SKILL_COLLECTION sameSkillList;
//1. <20><><EFBFBD>Ժ<EFBFBD><D4BA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
GroupingPrefixDefenceSkillsBySameSkillID(m_prefixSystemOffenceSkills, sameSkillList);
PREFIX_SYSTEM_SKILL_LIST tempCandiateOffenceSkills;
//2. <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> Ȯ<><C8AE><EFBFBD><EFBFBD> <20><><EFBFBD>ؼ<EFBFBD> Ȯ<><C8AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD>, <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><EFBFBD><E0BCAE> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
CalculateProbabilitySkill(tempCandiateOffenceSkills, sameSkillList);
//3. <20><>ųID<49><44><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><EFBFBD><E0BCAE> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><EFBFBD><ECBCB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>׷<EFBFBD><D7B7><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
GroupingSkillByPriority(m_PrefixSystemCandiateOffenceSkills, tempCandiateOffenceSkills, fHitDamageProb);
}
void MASkillUser::ProcessPrefixDefenceSkill(DnActorHandle hHitter)
{
//<2F><><EFBFBD>ξ<EFBFBD> <20>ý<EFBFBD><C3BD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD>ϵ<EFBFBD> <20>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʴٸ<CAB4>
if (m_prefixSystemDefenceSkills.empty())
return;
OutputDebug("<EFBFBD><EFBFBD><EFBFBD>ξ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD>-----------------------------!!\n");
//<2F><><EFBFBD>ξ<EFBFBD> <20>ý<EFBFBD><C3BD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD>..
RefreshPrefixDefenceSkills();
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD>߿<EFBFBD><DFBF><EFBFBD> <20><EFBFBD><ECBCB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
if (m_PrefixSystemCandiateDefenceSkills.empty())
{
OutputDebug("<EFBFBD><EFBFBD><EFBFBD>ξ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD>õȰ<C3B5> <20><><EFBFBD><EFBFBD>.-----------------------------!!\n");
return;
}
PREFIX_SYSTEM_SKILL_COLLECTION::iterator selectIter = m_PrefixSystemCandiateDefenceSkills.begin();
PRESIX_SYSTEM_SKILLS &skills = selectIter->second;
PRESIX_SYSTEM_SKILLS::iterator iter = skills.begin();
PRESIX_SYSTEM_SKILLS::iterator endIter = skills.end();
for (; iter != endIter; ++iter)
{
DnSkillHandle hSkill = (*iter).hSkill;
if (!hSkill /*|| CDnSkill::UsingResult::Success != hSkill->CanExecute()*/)
continue;
/*
//<2F><>Ÿ<EFBFBD><C5B8> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>dzʶ<C7B3>.
if (hSkill->GetCoolTime() != 0.0f && hSkill->GetElapsedDelayTime() > 0.0f)
continue;
*/
OutputDebug("<EFBFBD><EFBFBD><EFBFBD>ξ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų(%d) <20><><EFBFBD><EFBFBD>....\n", hSkill->GetClassID());
//Skill <20><>Ÿ<EFBFBD><C5B8> <20><><EFBFBD><EFBFBD>?
hSkill->OnBeginCoolTime();
m_PrefixSkillCoolTimeManager.AddCoolTime(hSkill);
int nStateEffectCount = hSkill->GetStateEffectCount();
// <20>ش<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> ȿ<><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20>ߺ<EFBFBD> ó<><C3B3> Ȯ<><C8AE><EFBFBD>ϰ<EFBFBD>,
// <20><><EFBFBD>ͺ<EFBFBD><CDBA><EFBFBD> <20><><EFBFBD><EFBFBD> ȿ<><C8BF> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ؾ<EFBFBD> <20>ҵ<EFBFBD> <20>ѵ<EFBFBD>...
for( DWORD k = 0; k < hSkill->GetStateEffectCount(); k++ )
{
CDnSkill::StateEffectStruct *pLocalStruct = hSkill->GetStateEffectFromIndex(k);
DnActorHandle hApplyActor;
// <20><><EFBFBD><EFBFBD> ȿ<><C8BF> <20><><EFBFBD><EFBFBD> Ÿ<><C5B8> Ÿ<>Կ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
switch( pLocalStruct->ApplyType )
{
case CDnSkill::ApplySelf: // <20>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD>
hApplyActor = m_pActor->GetActorHandle();
break;
case CDnSkill::ApplyTarget: // Ÿ<><C5B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
hApplyActor = hHitter;
break;
case CDnSkill::ApplyEnemy: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.. (<28><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ƴϸ<C6B4> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̴<EFBFBD>..)
if( m_pActor->GetTeam() == hHitter->GetTeam() )
continue;
else
hApplyActor = hHitter;
break;
case CDnSkill::ApplyFriend: // <20><><EFBFBD><EFBFBD> <20><>.. (<28><><EFBFBD><EFBFBD> <20><><EFBFBD≯<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>..?)
if( m_pActor->GetTeam() != hHitter->GetTeam() )
continue;
else
hApplyActor = hHitter;
break;
}
// <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> 0<>̰<EFBFBD> <20>ڽſ<DABD><C5BF><EFBFBD> <20>Ŵ<EFBFBD> <20><><EFBFBD><EFBFBD> ȿ<><C8BF><EFBFBD><EFBFBD>
// <20><>ų<EFBFBD><C5B3> m_vlApplyNoPacketStateEffectList<73><74> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>...[2011/01/13 semozz]
bool isSelfPermentStateEffect = false;
if (CDnSkill::ApplySelf == pLocalStruct->ApplyType &&
(0 == pLocalStruct->nDurationTime ||
-1 == pLocalStruct->nDurationTime))
{
pLocalStruct->nDurationTime = -1;
isSelfPermentStateEffect = true;
}
CDnStateBlow *pStateBlow = hApplyActor->GetStateBlow();
CDnSkill::CanApply eResult = CDnSkill::CanApply::Apply;
if (pStateBlow)
eResult = pStateBlow->CanApplySkillStateEffect(hSkill->GetInfo(), *pLocalStruct);
if (CDnSkill::CanApply::Fail != eResult)
{
hApplyActor->RemoveResetStateBlow();
int nBlowID = hApplyActor->CmdAddStateEffect( hSkill->GetInfo(), (STATE_BLOW::emBLOW_INDEX)pLocalStruct->nID,
pLocalStruct->nDurationTime, pLocalStruct->szValue.c_str(), false, false );
if (isSelfPermentStateEffect)
hSkill->AddPrefixBlow(hApplyActor, nBlowID);
}
hApplyActor->InitStateBlowIDToRemove();
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>´<EFBFBD>..
m_listProcessPreFixDefenceSkills.push_back(hSkill);
}
OutputDebug("<EFBFBD><EFBFBD><EFBFBD>ξ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų <20><> -----------------------------!!\n");
}
void MASkillUser::ProcessPrefixOffenceSkill(float fHitDamageProb)
{
//<2F><><EFBFBD>ξ<EFBFBD> <20>ý<EFBFBD><C3BD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD>ϵ<EFBFBD> <20>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʴٸ<CAB4>
if (m_prefixSystemOffenceSkills.empty())
return;
//<2F><><EFBFBD>ξ<EFBFBD> <20>ý<EFBFBD><C3BD><EFBFBD> <20><><EFBFBD>ݿ<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD>..
RefreshPrefixOffenceSkills(fHitDamageProb);
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD>߿<EFBFBD><DFBF><EFBFBD> <20><EFBFBD><ECBCB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
if (m_PrefixSystemCandiateOffenceSkills.empty())
return;
PREFIX_SYSTEM_SKILL_COLLECTION::iterator selectIter = m_PrefixSystemCandiateOffenceSkills.begin();
PRESIX_SYSTEM_SKILLS &skills = selectIter->second;
PRESIX_SYSTEM_SKILLS::iterator iter = skills.begin();
PRESIX_SYSTEM_SKILLS::iterator endIter = skills.end();
for (; iter != endIter; ++iter)
{
DnSkillHandle hSkill = (*iter).hSkill;
if (!hSkill/* || CDnSkill::UsingResult::Success != hSkill->CanExecute()*/)
continue;
//Skill <20><>Ÿ<EFBFBD><C5B8> <20><><EFBFBD><EFBFBD>?
hSkill->OnBeginCoolTime();
m_PrefixSkillCoolTimeManager.AddCoolTime(hSkill);
int nStateEffectCount = hSkill->GetStateEffectCount();
// <20>ش<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> ȿ<><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20>ߺ<EFBFBD> ó<><C3B3> Ȯ<><C8AE><EFBFBD>ϰ<EFBFBD>,
// <20><><EFBFBD>ͺ<EFBFBD><CDBA><EFBFBD> <20><><EFBFBD><EFBFBD> ȿ<><C8BF> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ؾ<EFBFBD> <20>ҵ<EFBFBD> <20>ѵ<EFBFBD>...
for( DWORD k = 0; k < hSkill->GetStateEffectCount(); k++ )
{
CDnSkill::StateEffectStruct *pLocalStruct = hSkill->GetStateEffectFromIndex(k);
DnActorHandle hApplyActor;
// <20><><EFBFBD><EFBFBD> ȿ<><C8BF> <20><><EFBFBD><EFBFBD> Ÿ<><C5B8> Ÿ<>Կ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
switch( pLocalStruct->ApplyType )
{
case CDnSkill::ApplySelf: // <20>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD>
hApplyActor = m_pActor->GetActorHandle();
break;
case CDnSkill::ApplyTarget: // Ÿ<><C5B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
continue;
case CDnSkill::ApplyEnemy: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.. (<28><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ƴϸ<C6B4> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̴<EFBFBD>..)
continue;
break;
case CDnSkill::ApplyFriend: // <20><><EFBFBD><EFBFBD> <20><>.. (<28><><EFBFBD><EFBFBD> <20><><EFBFBD≯<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>..?)
continue;
break;
}
// <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> 0<>̰<EFBFBD> <20>ڽſ<DABD><C5BF><EFBFBD> <20>Ŵ<EFBFBD> <20><><EFBFBD><EFBFBD> ȿ<><C8BF><EFBFBD><EFBFBD>
// <20><>ų<EFBFBD><C5B3> m_vlApplyNoPacketStateEffectList<73><74> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>...[2011/01/13 semozz]
bool isSelfPermentStateEffect = false;
if (CDnSkill::ApplySelf == pLocalStruct->ApplyType &&
(0 == pLocalStruct->nDurationTime ||
-1 == pLocalStruct->nDurationTime))
{
pLocalStruct->nDurationTime = -1;
isSelfPermentStateEffect = true;
}
CDnStateBlow *pStateBlow = hApplyActor->GetStateBlow();
CDnSkill::CanApply eResult = CDnSkill::CanApply::Apply;
if (pStateBlow)
eResult = pStateBlow->CanApplySkillStateEffect(hSkill->GetInfo(), *pLocalStruct);
if (CDnSkill::CanApply::Fail != eResult)
{
hApplyActor->RemoveResetStateBlow();
int nBlowID = hApplyActor->CmdAddStateEffect( hSkill->GetInfo(), (STATE_BLOW::emBLOW_INDEX)pLocalStruct->nID,
pLocalStruct->nDurationTime, pLocalStruct->szValue.c_str(), false, false );
if (isSelfPermentStateEffect)
hSkill->AddPrefixBlow(hApplyActor, nBlowID);
}
hApplyActor->InitStateBlowIDToRemove();
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>´<EFBFBD>..
m_listProcessPreFixOffenceSkills.push_back(hSkill);
}
}
void MASkillUser::ApplyPrefixOffenceSkillToTarget(DnActorHandle hTarget)
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD>߿<EFBFBD><DFBF><EFBFBD> <20><EFBFBD><ECBCB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
if (m_listProcessPreFixOffenceSkills.empty())
return;
list<DnSkillHandle>::iterator iter = m_listProcessPreFixOffenceSkills.begin();
list<DnSkillHandle>::iterator endIter = m_listProcessPreFixOffenceSkills.end();
for (; iter != endIter; ++iter)
{
DnSkillHandle hSkill = (*iter);
if (!hSkill)
continue;
int nStateEffectCount = hSkill->GetStateEffectCount();
// <20>ش<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> ȿ<><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20>ߺ<EFBFBD> ó<><C3B3> Ȯ<><C8AE><EFBFBD>ϰ<EFBFBD>,
// <20><><EFBFBD>ͺ<EFBFBD><CDBA><EFBFBD> <20><><EFBFBD><EFBFBD> ȿ<><C8BF> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ؾ<EFBFBD> <20>ҵ<EFBFBD> <20>ѵ<EFBFBD>...
for( DWORD k = 0; k < hSkill->GetStateEffectCount(); k++ )
{
CDnSkill::StateEffectStruct *pLocalStruct = hSkill->GetStateEffectFromIndex(k);
DnActorHandle hApplyActor;
// <20><><EFBFBD><EFBFBD> ȿ<><C8BF> <20><><EFBFBD><EFBFBD> Ÿ<><C5B8> Ÿ<>Կ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
switch( pLocalStruct->ApplyType )
{
case CDnSkill::ApplySelf: // <20>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD>
continue;
case CDnSkill::ApplyTarget: // Ÿ<><C5B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
hApplyActor = hTarget;
break;
case CDnSkill::ApplyEnemy: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.. (<28><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ƴϸ<C6B4> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̴<EFBFBD>..)
if( m_pActor->GetTeam() == hTarget->GetTeam() )
continue;
else
hApplyActor = hTarget;
break;
case CDnSkill::ApplyFriend: // <20><><EFBFBD><EFBFBD> <20><>.. (<28><><EFBFBD><EFBFBD> <20><><EFBFBD≯<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>..?)
if( m_pActor->GetTeam() != hTarget->GetTeam() )
continue;
else
hApplyActor = hTarget;
break;
}
// <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> 0<>̰<EFBFBD> <20>ڽſ<DABD><C5BF><EFBFBD> <20>Ŵ<EFBFBD> <20><><EFBFBD><EFBFBD> ȿ<><C8BF><EFBFBD><EFBFBD>
// <20><>ų<EFBFBD><C5B3> m_vlApplyNoPacketStateEffectList<73><74> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>...[2011/01/13 semozz]
bool isSelfPermentStateEffect = false;
if (CDnSkill::ApplySelf == pLocalStruct->ApplyType &&
(0 == pLocalStruct->nDurationTime ||
-1 == pLocalStruct->nDurationTime))
{
pLocalStruct->nDurationTime = -1;
isSelfPermentStateEffect = true;
}
CDnStateBlow *pStateBlow = hApplyActor->GetStateBlow();
CDnSkill::CanApply eResult = CDnSkill::CanApply::Apply;
if (pStateBlow)
eResult = pStateBlow->CanApplySkillStateEffect(hSkill->GetInfo(), *pLocalStruct);
if (CDnSkill::CanApply::Fail != eResult)
{
hApplyActor->RemoveResetStateBlow();
int nBlowID = hApplyActor->CmdAddStateEffect( hSkill->GetInfo(), (STATE_BLOW::emBLOW_INDEX)pLocalStruct->nID,
pLocalStruct->nDurationTime, pLocalStruct->szValue.c_str(), false, false );
if (isSelfPermentStateEffect)
hSkill->AddPrefixBlow(hApplyActor, nBlowID);
}
hApplyActor->InitStateBlowIDToRemove();
}
}
}
void MASkillUser::CalculateProbabilitySkill(PREFIX_SYSTEM_SKILL_LIST &candidateSkills,
PREFIX_SYSTEM_SKILL_COLLECTION &sameSkillList)
{
//<2F>ĺ<EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD>Ʈ <20>ʱ<EFBFBD>ȭ
candidateSkills.clear();
PREFIX_SYSTEM_SKILL_COLLECTION::iterator iter = sameSkillList.begin();
PREFIX_SYSTEM_SKILL_COLLECTION::iterator endIter = sameSkillList.end();
for (; iter != endIter; ++iter)
{
//<2F><><EFBFBD><EFBFBD> <20><>ųID<49><44> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> Ȯ<><C8AE><EFBFBD><EFBFBD> <20>ջ<EFBFBD><D5BB>Ѵ<EFBFBD>.
PRESIX_SYSTEM_SKILLS::iterator skillIter = iter->second.begin();
PRESIX_SYSTEM_SKILLS::iterator skillEndIter = iter->second.end();
float fProbability = 0.0f;
DnSkillHandle hSelectedSkill;
int nSlotIndex = -1;
for (; skillIter != skillEndIter; ++skillIter)
{
if (skillIter->hSkill)
{
fProbability += skillIter->fRatio;
// <20>ش<EFBFBD> <20><>ų
if (!hSelectedSkill)
{
hSelectedSkill = skillIter->hSkill;
nSlotIndex = skillIter->slotIndex;
}
else
{
if (hSelectedSkill->GetLevel() < skillIter->hSkill->GetLevel())
{
hSelectedSkill = skillIter->hSkill;
nSlotIndex = skillIter->slotIndex;
}
}
}
}
// <20><><EFBFBD>õ<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų <20>ĺ<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>߰<EFBFBD><DFB0>Ѵ<EFBFBD>.
if (hSelectedSkill && -1 != nSlotIndex && 0.0f != fProbability)
{
int nSkillID = hSelectedSkill->GetClassID();
PREFIX_SYSTEM_SKILLINFO skillInfo;
skillInfo.fRatio = fProbability;
skillInfo.hSkill = hSelectedSkill;
skillInfo.slotIndex = nSlotIndex;
OutputDebug("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų(%d) <20>ջ<EFBFBD> <20><><EFBFBD><EFBFBD> Ȯ<><C8AE> (%f) <20><><EFBFBD><EFBFBD> Index(%d)<29><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!!!!!\n", skillInfo.hSkill->GetClassID(), skillInfo.fRatio, skillInfo.slotIndex);
candidateSkills.insert(PREFIX_SYSTEM_SKILL_LIST::value_type(nSkillID, skillInfo));
}
}
}
void MASkillUser::GroupingPrefixDefenceSkillsBySameSkillID(PREFIX_SYSTEM_SKILL_LIST &skillList, PREFIX_SYSTEM_SKILL_COLLECTION &sameSkillList)
{
PREFIX_SYSTEM_SKILL_LIST::iterator iter = skillList.begin();
PREFIX_SYSTEM_SKILL_LIST::iterator endIter = skillList.end();
for (; iter != endIter; ++iter)
{
int nSkillID = -1;
int nSlotIndex = iter->first; //<2F><><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD>
PREFIX_SYSTEM_SKILLINFO skillInfo = iter->second;
if (!skillInfo.hSkill)
continue;
nSkillID = skillInfo.hSkill->GetClassID();
PREFIX_SYSTEM_SKILL_COLLECTION::iterator findIter = sameSkillList.find(nSkillID);
if (findIter != sameSkillList.end())
{
//<2F>̹<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ųID<49><44> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>ִٸ<D6B4>
skillInfo.slotIndex = nSlotIndex;
findIter->second.push_back(skillInfo);
}
else
{
//<2F><><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʴٸ<CAB4> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>..
PRESIX_SYSTEM_SKILLS skillList;
skillInfo.slotIndex = nSlotIndex;
skillList.push_back(skillInfo);
sameSkillList.insert(PREFIX_SYSTEM_SKILL_COLLECTION::value_type(nSkillID, skillList));
}
}
}
void MASkillUser::GroupingSkillByPriority(PREFIX_SYSTEM_SKILL_COLLECTION& prefixSystemSkills, PREFIX_SYSTEM_SKILL_LIST& tempCandiateSkills, float fHitDamageProb/* = 1.0f*/)
{
prefixSystemSkills.clear();
PREFIX_SYSTEM_SKILL_LIST::iterator iter = tempCandiateSkills.begin();
PREFIX_SYSTEM_SKILL_LIST::iterator endIter = tempCandiateSkills.end();
//<2F><>ǥ <20><>ų <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><>ȸ <20>ϸ鼭 <20><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>׷<EFBFBD><D7B7><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
for (; iter != endIter; ++iter)
{
int nPriority = 0;
PREFIX_SYSTEM_SKILLINFO skillInfo = iter->second;
if (!skillInfo.hSkill)
continue;
nPriority = skillInfo.hSkill->GetPrefixSystemPriority();
//<2F><>ų <20><>Ÿ<EFBFBD><C5B8> Ȯ<><C8AE>...
//if (skillInfo.hSkill->GetCoolTime() > 0.0f && skillInfo.hSkill->GetElapsedDelayTime() > 0.0f)
if (m_PrefixSkillCoolTimeManager.IsCoolTime(skillInfo.hSkill->GetClassID()))
{
OutputDebug("<EFBFBD><EFBFBD>ų(%d) <20><>Ÿ<EFBFBD><C5B8> <20><>.........!!!!\n", skillInfo.hSkill->GetClassID());
continue;
}
//Ȯ<><C8AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>߰<EFBFBD><DFB0>Ѵ<EFBFBD>...
bool bExecuteable = rand() % 10000 <= (iter->second.fRatio * fHitDamageProb);
if (!bExecuteable)
{
OutputDebug("<EFBFBD><EFBFBD>ų(%d) Ȯ<><C8AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɷ<EFBFBD><C9B7><EFBFBD>...!!!!\n", skillInfo.hSkill->GetClassID());
continue;
}
OutputDebug("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (%d)<29><> <20><>ų(%d) <20><><EFBFBD>ϵ<EFBFBD>!!!!\n", nPriority, skillInfo.hSkill->GetClassID());
PREFIX_SYSTEM_SKILL_COLLECTION::iterator findIter = prefixSystemSkills.find(nPriority);
if (findIter != prefixSystemSkills.end())
{
//<2F>̹<EFBFBD> <20><EFBFBD><ECBCB1><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD> <20>ִٸ<D6B4>
//<2F><EFBFBD><ECBCB1><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0>Ѵ<EFBFBD>.
findIter->second.push_back(skillInfo);
}
else
{
//<2F><><EFBFBD><EFBFBD> <20><EFBFBD><ECBCB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʴٸ<CAB4>..
//<2F><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><>ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>߰<EFBFBD><DFB0>Ѵ<EFBFBD>.
PRESIX_SYSTEM_SKILLS skillList;
skillList.push_back(skillInfo);
prefixSystemSkills.insert(PREFIX_SYSTEM_SKILL_COLLECTION::value_type(nPriority, skillList));
}
}
}
void MASkillUser::EndPrefixSystemSkill( LOCAL_TIME LocalTime, float fDelta )
{
list<DnSkillHandle>::iterator iter = m_listProcessPreFixDefenceSkills.begin();
for( iter; iter != m_listProcessPreFixDefenceSkills.end(); ++iter )
{
DnSkillHandle hAutoPassive = *iter;
hAutoPassive->OnEnd( LocalTime, fDelta );
}
iter = m_listProcessPreFixOffenceSkills.begin();
for( iter; iter != m_listProcessPreFixOffenceSkills.end(); ++iter )
{
DnSkillHandle hAutoPassive = *iter;
hAutoPassive->OnEnd( LocalTime, fDelta );
}
}
void MASkillUser::InitPrefixOffenceSkills()
{
m_PrefixSystemCandiateOffenceSkills.clear();
}
bool MASkillUser::IsPrefixTriggerSkill()
{
if (!m_hProcessSkill)
return false;
return m_hProcessSkill->IsPrefixTriggerSkill();
}
#endif // _GAMESERVER
void MASkillUser::UpdateSkillLevelUpInfo()
{
std::map<int, SkillLevelUpInfo>::iterator iter = m_SkillLevelUpInfoList.begin();
std::map<int, SkillLevelUpInfo>::iterator endIter = m_SkillLevelUpInfoList.end();
m_SkillLevelUpInfo.clear();
for (; iter != endIter; ++iter)
{
SkillLevelUpInfo& skillLevelUpInfo = iter->second;
//<2F><>ų ID / <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD><CCB6><EFBFBD>
if (skillLevelUpInfo.nSkillID != 0 && skillLevelUpInfo.nLevelUp != 0)
{
//<2F><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD>̵<EFBFBD><CCB5><EFBFBD> ã<>´<EFBFBD>.
std::map<int, int>::iterator findIter = m_SkillLevelUpInfo.find(skillLevelUpInfo.nSkillID);
if (findIter != m_SkillLevelUpInfo.end())
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> ũ<>ٸ<EFBFBD> <20>dzʶ<C7B3>.
if (findIter->second > skillLevelUpInfo.nLevelUp)
continue;
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ũ<><C5A9> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>..
m_SkillLevelUpInfo.erase(findIter);
}
// <20><><EFBFBD>ο<EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
m_SkillLevelUpInfo.insert(std::make_pair(skillLevelUpInfo.nSkillID, skillLevelUpInfo.nLevelUp));
}
}
}
void MASkillUser::AddSkillLevelUpInfo(int nSlotIndex, int nSkillID, int nLevelUp)
{
DnSkillHandle hSkill = FindSkill(nSkillID);
if( hSkill )
{
if (hSkill->GetElapsedDelayTime() > 0.0f || hSkill->IsToggleOn())
return;
}
SkillLevelUpInfo skillLevelUpInfo;
skillLevelUpInfo.nSkillID = nSkillID;
skillLevelUpInfo.nLevelUp = nLevelUp;
m_SkillLevelUpInfoList.insert(std::make_pair(nSlotIndex, skillLevelUpInfo));
//<2F><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>..
UpdateSkillLevelUpInfo();
int nSkillLevelUp = GetSkillLevelUpValue(nSkillID);
SkillLevelUp(nSkillID, nSkillLevelUp);
}
void MASkillUser::RemoveSkillLevelUpInfo(int nSlotIndex)
{
std::map<int, SkillLevelUpInfo>::iterator findIter = m_SkillLevelUpInfoList.find(nSlotIndex);
if (findIter != m_SkillLevelUpInfoList.end())
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ۿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų ID<49><44> <20>޾<EFBFBD> <20><><EFBFBD>´<EFBFBD>.
int nSkillID = findIter->second.nSkillID;
DnSkillHandle hSkill = FindSkill(nSkillID);
if( hSkill )
{
if (hSkill->GetElapsedDelayTime() > 0.0f || hSkill->IsToggleOn())
return;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_SkillLevelUpInfoList.erase(findIter);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
UpdateSkillLevelUpInfo();
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>
int nLevelUp = GetSkillLevelUpValue(nSkillID);
SkillLevelUp(nSkillID, nLevelUp);
}
}
int MASkillUser::GetSkillLevelUpValue(int nSkillID)
{
int nLevelUpValue = 0;
int nLevelUpValueByNormalItem = 0;
std::map<int, int>::iterator findNormalIter = m_SkillLevelUpInfo.find(nSkillID);
if (findNormalIter != m_SkillLevelUpInfo.end())
nLevelUpValueByNormalItem = findNormalIter->second;
int nLevelUpValueByCashItem = 0;
std::map<int, int>::iterator findCashIter = m_CashSkillLevelUpInfo.find(nSkillID);
if (findCashIter != m_CashSkillLevelUpInfo.end())
nLevelUpValueByCashItem = findCashIter->second;
//ij<>þ<EFBFBD><C3BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 1
if (nLevelUpValueByCashItem > 1)
nLevelUpValueByCashItem = 1;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ߺ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʰ<EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ϵ<EFBFBD><CFB5><EFBFBD> <20>Ѵ<EFBFBD>.
nLevelUpValue = max(nLevelUpValueByNormalItem, nLevelUpValueByCashItem);
return nLevelUpValue;
}
bool MASkillUser::ExistSkillLevelUpValue()
{
if( m_SkillLevelUpInfo.empty() && m_CashSkillLevelUpInfo.empty() )
return false;
return true;
}
void MASkillUser::SkillLevelUp(int nSkillID, int nLevelUp)
{
//<2F><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> ã<>Ƽ<EFBFBD> <20><>ų<EFBFBD><C5B3> <20>ְ<EFBFBD>, <20>ʱ<EFBFBD>ȭ <20><> <20><>ų<EFBFBD><C5B3> <20>ƴϸ<C6B4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ų<EFBFBD><C5B2>.
DnSkillHandle hSkill = FindSkill(nSkillID);
if (!hSkill)
return;
int nCurentSkillLevel = hSkill->GetLevel();
int nCurLevlUpValue = hSkill->GetLevelUpValue();
bool bChangeLevel = true;
if (nCurentSkillLevel == 0)
bChangeLevel = false;
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʿ䰡 <20><><EFBFBD><EFBFBD>.
if (nCurLevlUpValue == nLevelUp)
bChangeLevel = false;
if (bChangeLevel)
{
//SetSkillLevel<65><6C><EFBFBD><EFBFBD> AddSkill<6C><6C><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..
int nOrigLevel = nCurentSkillLevel - nCurLevlUpValue;
ChangeSkillLevelUp(nSkillID, nOrigLevel);
}
#if defined(_GAMESERVER)
#else
else
hSkill->DisableSkillByItemMove(false);
#endif // _GAMESERVER
}
void MASkillUser::ChangeSkillLevelUp(int nSkillID, int nOrigLevel)
{
RemoveSkill(nSkillID);
AddSkill(nSkillID, nOrigLevel);
}
// std::map<int, SkillLevelUpInfo> m_CashSkillLevelUpInfoList;
void MASkillUser::AddSkillLevelUpInfoByCashItem(int nSlotIndex, int nSkillID, int nLevelUp)
{
SkillLevelUpInfo skillLevelUpInfo;
skillLevelUpInfo.nSkillID = nSkillID;
skillLevelUpInfo.nLevelUp = nLevelUp;
m_CashSkillLevelUpInfoList.insert(std::make_pair(nSlotIndex, skillLevelUpInfo));
//<2F><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>..
UpdateSkillLevelUpInfoByCashItem();
int nSkillLevelUp = GetSkillLevelUpValue(nSkillID);
SkillLevelUp(nSkillID, nSkillLevelUp);
}
void MASkillUser::UpdateSkillLevelUpInfoByCashItem()
{
std::map<int, SkillLevelUpInfo>::iterator iter = m_CashSkillLevelUpInfoList.begin();
std::map<int, SkillLevelUpInfo>::iterator endIter = m_CashSkillLevelUpInfoList.end();
m_CashSkillLevelUpInfo.clear();
for (; iter != endIter; ++iter)
{
SkillLevelUpInfo& skillLevelUpInfo = iter->second;
//<2F><>ų ID / <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD><CCB6><EFBFBD>
if (skillLevelUpInfo.nSkillID != 0 && skillLevelUpInfo.nLevelUp != 0)
{
//<2F><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD>̵<EFBFBD><CCB5><EFBFBD> ã<>´<EFBFBD>.
std::map<int, int>::iterator findIter = m_CashSkillLevelUpInfo.find(skillLevelUpInfo.nSkillID);
if (findIter != m_CashSkillLevelUpInfo.end())
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> ũ<>ٸ<EFBFBD> <20>dzʶ<C7B3>.
if (findIter->second > skillLevelUpInfo.nLevelUp)
continue;
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ũ<><C5A9> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>..
m_CashSkillLevelUpInfo.erase(findIter);
}
// <20><><EFBFBD>ο<EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
m_CashSkillLevelUpInfo.insert(std::make_pair(skillLevelUpInfo.nSkillID, skillLevelUpInfo.nLevelUp));
}
}
}
void MASkillUser::RemoveSkillLevelUpInfoByCashItem(int nSlotIndex)
{
std::map<int, SkillLevelUpInfo>::iterator findIter = m_CashSkillLevelUpInfoList.find(nSlotIndex);
if (findIter != m_CashSkillLevelUpInfoList.end())
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ۿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų ID<49><44> <20>޾<EFBFBD> <20><><EFBFBD>´<EFBFBD>.
int nSkillID = findIter->second.nSkillID;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_CashSkillLevelUpInfoList.erase(findIter);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
UpdateSkillLevelUpInfoByCashItem();
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>
int nLevelUp = GetSkillLevelUpValue(nSkillID);
SkillLevelUp(nSkillID, nLevelUp);
}
}
#if defined(PRE_ADD_PREFIX_SYSTE_RENEW)
#if defined(_GAMESERVER)
void MASkillUser::AddPrefixDefenceSkill(DnSkillHandle hSkill)
{
if (!hSkill)
return;
//<2F><> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD>λ<EFBFBD> <20><>ų Ÿ<><C5B8>(<28><><EFBFBD><EFBFBD>/<2F>ı<EFBFBD>....)
int nPrefixSkillType = hSkill->GetPrefixSkillType();
PREFIX_SKILL_INFO::iterator findIter = m_PrefixDefenceSkills.find(nPrefixSkillType);
//<2F><><EFBFBD><EFBFBD> ī<>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD> <20>ִٸ<D6B4>
if (findIter != m_PrefixDefenceSkills.end())
{
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD>λ<EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC> <20><>ų<EFBFBD><C5B3> <20>߰<EFBFBD> <20>ϰ<EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
findIter->second->AddSkill(hSkill);
}
else
{
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD>ϵ<EFBFBD> <20><><EFBFBD>λ<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
CDnPrefixSkill* pPrefixSkill = new CDnPrefixSkill(nPrefixSkillType);
pPrefixSkill->AddSkill(hSkill);
m_PrefixDefenceSkills.insert(make_pair(nPrefixSkillType, pPrefixSkill));
}
}
void MASkillUser::RemovePrefixDefenceSkill(DnSkillHandle hSkill)
{
//<2F><> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD>λ<EFBFBD> <20><>ų Ÿ<><C5B8>(<28><><EFBFBD><EFBFBD>/<2F>ı<EFBFBD>....)
int nPrefixSkillType = hSkill->GetPrefixSkillType();
PREFIX_SKILL_INFO::iterator findIter = m_PrefixDefenceSkills.find(nPrefixSkillType);
//<2F><><EFBFBD><EFBFBD> ī<>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD> <20>ִٸ<D6B4>
if (findIter != m_PrefixDefenceSkills.end())
{
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD>λ<EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
findIter->second->RemoveSkill(hSkill);
//<2F><><EFBFBD>ϵ<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
if (findIter->second->GetSkillCount() == 0)
{
SAFE_DELETE(findIter->second);
m_PrefixDefenceSkills.erase(findIter);
}
}
}
void MASkillUser::ProcessPrefixDefenceSkill_New(DnActorHandle hHitter)
{
//<2F><><EFBFBD>ξ<EFBFBD> <20>ý<EFBFBD><C3BD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD>ϵ<EFBFBD> <20>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʴٸ<CAB4>
if (m_PrefixDefenceSkills.empty())
return;
OutputDebug("<EFBFBD><EFBFBD><EFBFBD>ξ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD>-----------------------------!!\n");
//<2F><><EFBFBD>λ<EFBFBD> <20><>ų <20>ߵ<EFBFBD> Ȯ<><C8AE> <20><><EFBFBD><EFBFBD>..
PREFIX_SKILL_INFO::iterator iter = m_PrefixDefenceSkills.begin();
PREFIX_SKILL_INFO::iterator endIter = m_PrefixDefenceSkills.end();
for (; iter != endIter; ++iter)
{
CDnPrefixSkill* pPrefixSkill = iter->second;
if (!pPrefixSkill)
continue;
//<2F><><EFBFBD>λ<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><>Ÿ<EFBFBD><C5B8> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE><EFBFBD>Ѵ<EFBFBD>..
if (m_PrefixSkillCoolTimeManager.IsCoolTime(pPrefixSkill->GetSkillType()))
{
OutputDebug("<EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų(%d) <20><>Ÿ<EFBFBD><C5B8> <20><>!!!!!!!!!!\n", pPrefixSkill->GetSkillType());
continue;
}
//<2F><><EFBFBD>λ<EFBFBD> <20><>ų <20>ߵ<EFBFBD> Ȯ<><C8AE> Ȯ<><C8AE>.
bool bExecuteable = rand() % 10000 <= pPrefixSkill->GetProbability();
if (!bExecuteable)
{
OutputDebug("<EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų(%d) Ȯ<><C8AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɷ<EFBFBD><C9B7><EFBFBD>...!!!!\n", pPrefixSkill->GetSkillType());
continue;
}
//<2F><>ǥ <20><>ų
DnSkillHandle hSkill = pPrefixSkill->GetSkillHandle();
if (!hSkill)
continue;
hSkill->OnBeginCoolTime();
//Skill <20><>Ÿ<EFBFBD><C5B8> <20><><EFBFBD><EFBFBD>?
m_PrefixSkillCoolTimeManager.AddCoolTime(pPrefixSkill);
int nStateEffectCount = pPrefixSkill->GetStateEffectCount();
// <20>ش<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> ȿ<><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20>ߺ<EFBFBD> ó<><C3B3> Ȯ<><C8AE><EFBFBD>ϰ<EFBFBD>,
// <20><><EFBFBD>ͺ<EFBFBD><CDBA><EFBFBD> <20><><EFBFBD><EFBFBD> ȿ<><C8BF> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ؾ<EFBFBD> <20>ҵ<EFBFBD> <20>ѵ<EFBFBD>...
for( int k = 0; k < pPrefixSkill->GetStateEffectCount(); k++ )
{
CDnSkill::StateEffectStruct *pLocalStruct = pPrefixSkill->GetStateEffectFromIndex(k);
DnActorHandle hApplyActor;
// <20><><EFBFBD><EFBFBD> ȿ<><C8BF> <20><><EFBFBD><EFBFBD> Ÿ<><C5B8> Ÿ<>Կ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
switch( pLocalStruct->ApplyType )
{
case CDnSkill::ApplySelf: // <20>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD>
hApplyActor = m_pActor->GetActorHandle();
break;
case CDnSkill::ApplyTarget: // Ÿ<><C5B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
hApplyActor = hHitter;
break;
case CDnSkill::ApplyEnemy: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.. (<28><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ƴϸ<C6B4> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̴<EFBFBD>..)
if( m_pActor->GetTeam() == hHitter->GetTeam() )
continue;
else
hApplyActor = hHitter;
break;
case CDnSkill::ApplyFriend: // <20><><EFBFBD><EFBFBD> <20><>.. (<28><><EFBFBD><EFBFBD> <20><><EFBFBD≯<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>..?)
if( m_pActor->GetTeam() != hHitter->GetTeam() )
continue;
else
hApplyActor = hHitter;
break;
}
// <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> 0<>̰<EFBFBD> <20>ڽſ<DABD><C5BF><EFBFBD> <20>Ŵ<EFBFBD> <20><><EFBFBD><EFBFBD> ȿ<><C8BF><EFBFBD><EFBFBD>
// <20><>ų<EFBFBD><C5B3> m_vlApplyNoPacketStateEffectList<73><74> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>...[2011/01/13 semozz]
bool isSelfPermentStateEffect = false;
if (CDnSkill::ApplySelf == pLocalStruct->ApplyType &&
(0 == pLocalStruct->nDurationTime ||
-1 == pLocalStruct->nDurationTime))
{
pLocalStruct->nDurationTime = -1;
isSelfPermentStateEffect = true;
}
CDnStateBlow *pStateBlow = hApplyActor->GetStateBlow();
CDnSkill::CanApply eResult = CDnSkill::CanApply::Apply;
if (pStateBlow)
eResult = pStateBlow->CanApplySkillStateEffect(hSkill->GetInfo(), *pLocalStruct);
if (CDnSkill::CanApply::Fail != eResult)
{
hApplyActor->RemoveResetStateBlow();
int nBlowID = hApplyActor->CmdAddStateEffect( hSkill->GetInfo(), (STATE_BLOW::emBLOW_INDEX)pLocalStruct->nID,
pLocalStruct->nDurationTime, pLocalStruct->szValue.c_str(), false, false );
OutputDebug("<EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų(%d) <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> (%d)-(%s)\n", pPrefixSkill->GetSkillType(), pLocalStruct->nID, pLocalStruct->szValue.c_str());
if (isSelfPermentStateEffect)
hSkill->AddPrefixBlow(hApplyActor, nBlowID);
}
hApplyActor->InitStateBlowIDToRemove();
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>´<EFBFBD>..
m_listProcessPreFixDefenceSkills.push_back(hSkill);
}
OutputDebug("<EFBFBD><EFBFBD><EFBFBD>ξ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų <20><> -----------------------------!!\n");
}
void MASkillUser::AddPrefixOffenceSkill(DnSkillHandle hSkill)
{
if (!hSkill)
return;
//<2F><> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD>λ<EFBFBD> <20><>ų Ÿ<><C5B8>(<28><><EFBFBD><EFBFBD>/<2F>ı<EFBFBD>....)
int nPrefixSkillType = hSkill->GetPrefixSkillType();
PREFIX_SKILL_INFO::iterator findIter = m_PrefixOffenceSkills.find(nPrefixSkillType);
//<2F><><EFBFBD><EFBFBD> ī<>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD> <20>ִٸ<D6B4>
if (findIter != m_PrefixOffenceSkills.end())
{
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD>λ<EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC> <20><>ų<EFBFBD><C5B3> <20>߰<EFBFBD> <20>ϰ<EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
findIter->second->AddSkill(hSkill);
}
else
{
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD>ϵ<EFBFBD> <20><><EFBFBD>λ<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
CDnPrefixSkill* pPrefixSkill = new CDnPrefixSkill(nPrefixSkillType);
pPrefixSkill->AddSkill(hSkill);
m_PrefixOffenceSkills.insert(make_pair(nPrefixSkillType, pPrefixSkill));
}
}
void MASkillUser::RemovePrefixOffenceSkill(DnSkillHandle hSkill)
{
//<2F><> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD>λ<EFBFBD> <20><>ų Ÿ<><C5B8>(<28><><EFBFBD><EFBFBD>/<2F>ı<EFBFBD>....)
int nPrefixSkillType = hSkill->GetPrefixSkillType();
PREFIX_SKILL_INFO::iterator findIter = m_PrefixOffenceSkills.find(nPrefixSkillType);
//<2F><><EFBFBD><EFBFBD> ī<>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD> <20>ִٸ<D6B4>
if (findIter != m_PrefixOffenceSkills.end())
{
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD>λ<EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
findIter->second->RemoveSkill(hSkill);
//<2F><><EFBFBD>ϵ<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
if (findIter->second->GetSkillCount() == 0)
{
RemoveProcessPrefixOffenceSkill(findIter->second);
SAFE_DELETE(findIter->second);
m_PrefixOffenceSkills.erase(findIter);
}
}
}
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD>(<28><> <20><><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD><D3BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20>̷<EFBFBD><CCB7><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ѵ<EFBFBD>..) <20><><EFBFBD>ݿ<EFBFBD> <20><><EFBFBD>̻<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20>ɶ<EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD>̻<EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
void MASkillUser::RemoveProcessPrefixOffenceSkill(CDnPrefixSkill* pRemovePrefixSkill)
{
if (NULL == pRemovePrefixSkill)
return;
list<CDnPrefixSkill*>::iterator iter = m_ProcessPrefixOffenceSkills.begin();
for (; iter != m_ProcessPrefixOffenceSkills.end(); )
{
CDnPrefixSkill* pPrefixSkill = (*iter);
if (pPrefixSkill && pPrefixSkill == pRemovePrefixSkill)
{
iter = m_ProcessPrefixOffenceSkills.erase(iter);
continue;
}
++iter;
}
}
void MASkillUser::ProcessPrefixOffenceSkill_New()
{
//<2F><><EFBFBD>ξ<EFBFBD> <20>ý<EFBFBD><C3BD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD>ϵ<EFBFBD> <20>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʴٸ<CAB4>
if (m_PrefixOffenceSkills.empty())
return;
//<2F><><EFBFBD>λ<EFBFBD> <20><>ų <20>ߵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
m_ProcessPrefixOffenceSkills.clear();
//<2F><><EFBFBD>λ<EFBFBD> <20><>ų <20>ߵ<EFBFBD> Ȯ<><C8AE> <20><><EFBFBD><EFBFBD>..
PREFIX_SKILL_INFO::iterator iter = m_PrefixOffenceSkills.begin();
PREFIX_SKILL_INFO::iterator endIter = m_PrefixOffenceSkills.end();
for (; iter != endIter; ++iter)
{
CDnPrefixSkill* pPrefixSkill = iter->second;
if (!pPrefixSkill)
continue;
//<2F><><EFBFBD>λ<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><>Ÿ<EFBFBD><C5B8> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE><EFBFBD>Ѵ<EFBFBD>..(<28><><EFBFBD><EFBFBD>/<2F><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȴ<EFBFBD>??)
if (m_PrefixSkillCoolTimeManager.IsCoolTime(pPrefixSkill->GetSkillType()))
{
OutputDebug("<EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų(%d) <20><>Ÿ<EFBFBD><C5B8> <20><>!!!!!!!!!!\n", pPrefixSkill->GetSkillType());
continue;
}
//<2F><><EFBFBD>λ<EFBFBD> <20><>ų <20>ߵ<EFBFBD> Ȯ<><C8AE> Ȯ<><C8AE>.
bool bExecuteable = rand() % 10000 <= pPrefixSkill->GetProbability();
if (!bExecuteable)
{
OutputDebug("<EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų(%d) Ȯ<><C8AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɷ<EFBFBD><C9B7><EFBFBD>...!!!!\n", pPrefixSkill->GetSkillType());
continue;
}
//<2F><>ǥ <20><>ų
DnSkillHandle hSkill = pPrefixSkill->GetSkillHandle();
if (!hSkill)
continue;
//Skill <20><>Ÿ<EFBFBD><C5B8> <20><><EFBFBD><EFBFBD>?
hSkill->OnBeginCoolTime();
m_PrefixSkillCoolTimeManager.AddCoolTime(pPrefixSkill);
int nStateEffectCount = pPrefixSkill->GetStateEffectCount();
// <20>ش<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> ȿ<><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20>ߺ<EFBFBD> ó<><C3B3> Ȯ<><C8AE><EFBFBD>ϰ<EFBFBD>,
// <20><><EFBFBD>ͺ<EFBFBD><CDBA><EFBFBD> <20><><EFBFBD><EFBFBD> ȿ<><C8BF> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ؾ<EFBFBD> <20>ҵ<EFBFBD> <20>ѵ<EFBFBD>...
for( int k = 0; k < pPrefixSkill->GetStateEffectCount(); k++ )
{
CDnSkill::StateEffectStruct *pLocalStruct = pPrefixSkill->GetStateEffectFromIndex(k);
DnActorHandle hApplyActor;
// <20><><EFBFBD><EFBFBD> ȿ<><C8BF> <20><><EFBFBD><EFBFBD> Ÿ<><C5B8> Ÿ<>Կ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
switch( pLocalStruct->ApplyType )
{
case CDnSkill::ApplySelf: // <20>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD>
hApplyActor = m_pActor->GetActorHandle();
break;
case CDnSkill::ApplyTarget: // Ÿ<><C5B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
continue;
case CDnSkill::ApplyEnemy: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.. (<28><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ƴϸ<C6B4> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̴<EFBFBD>..)
continue;
break;
case CDnSkill::ApplyFriend: // <20><><EFBFBD><EFBFBD> <20><>.. (<28><><EFBFBD><EFBFBD> <20><><EFBFBD≯<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>..?)
continue;
break;
}
// <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> 0<>̰<EFBFBD> <20>ڽſ<DABD><C5BF><EFBFBD> <20>Ŵ<EFBFBD> <20><><EFBFBD><EFBFBD> ȿ<><C8BF><EFBFBD><EFBFBD>
// <20><>ų<EFBFBD><C5B3> m_vlApplyNoPacketStateEffectList<73><74> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>...[2011/01/13 semozz]
bool isSelfPermentStateEffect = false;
if (CDnSkill::ApplySelf == pLocalStruct->ApplyType &&
(0 == pLocalStruct->nDurationTime ||
-1 == pLocalStruct->nDurationTime))
{
pLocalStruct->nDurationTime = -1;
isSelfPermentStateEffect = true;
}
CDnStateBlow *pStateBlow = hApplyActor->GetStateBlow();
CDnSkill::CanApply eResult = CDnSkill::CanApply::Apply;
if (pStateBlow)
eResult = pStateBlow->CanApplySkillStateEffect(hSkill->GetInfo(), *pLocalStruct);
if (CDnSkill::CanApply::Fail != eResult)
{
hApplyActor->RemoveResetStateBlow();
int nBlowID = hApplyActor->CmdAddStateEffect( hSkill->GetInfo(), (STATE_BLOW::emBLOW_INDEX)pLocalStruct->nID,
pLocalStruct->nDurationTime, pLocalStruct->szValue.c_str(), false, false );
//
OutputDebug("<EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų(%d) <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (%d)-(%s)\n", pPrefixSkill->GetSkillType(), pLocalStruct->nID, pLocalStruct->szValue.c_str());
if (isSelfPermentStateEffect)
hSkill->AddPrefixBlow(hApplyActor, nBlowID);
}
hApplyActor->InitStateBlowIDToRemove();
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>´<EFBFBD>..
m_listProcessPreFixOffenceSkills.push_back(hSkill);
//<2F><><EFBFBD><EFBFBD> <20>ߵ<EFBFBD><DFB5><EFBFBD> <20><><EFBFBD>ݿ<EFBFBD> <20><><EFBFBD>λ<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>´<EFBFBD>.
m_ProcessPrefixOffenceSkills.push_back(pPrefixSkill);
}
}
void MASkillUser::ApplyPrefixOffenceSkillToTarget_New(DnActorHandle hTarget)
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD>߿<EFBFBD><DFBF><EFBFBD> <20><EFBFBD><ECBCB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
if (m_ProcessPrefixOffenceSkills.empty())
return;
list<CDnPrefixSkill*>::iterator iter = m_ProcessPrefixOffenceSkills.begin();
list<CDnPrefixSkill*>::iterator endIter = m_ProcessPrefixOffenceSkills.end();
for (; iter != endIter; ++iter)
{
CDnPrefixSkill* pPrefixSkill = (*iter);
if (!pPrefixSkill)
continue;
DnSkillHandle hSkill = pPrefixSkill->GetSkillHandle();
if (!hSkill)
continue;
int nStateEffectCount = pPrefixSkill->GetStateEffectCount();
// <20>ش<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> ȿ<><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20>ߺ<EFBFBD> ó<><C3B3> Ȯ<><C8AE><EFBFBD>ϰ<EFBFBD>,
// <20><><EFBFBD>ͺ<EFBFBD><CDBA><EFBFBD> <20><><EFBFBD><EFBFBD> ȿ<><C8BF> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ؾ<EFBFBD> <20>ҵ<EFBFBD> <20>ѵ<EFBFBD>...
for( int k = 0; k < pPrefixSkill->GetStateEffectCount(); k++ )
{
CDnSkill::StateEffectStruct *pLocalStruct = pPrefixSkill->GetStateEffectFromIndex(k);
DnActorHandle hApplyActor;
// <20><><EFBFBD><EFBFBD> ȿ<><C8BF> <20><><EFBFBD><EFBFBD> Ÿ<><C5B8> Ÿ<>Կ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
switch( pLocalStruct->ApplyType )
{
case CDnSkill::ApplySelf: // <20>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD>
continue;
case CDnSkill::ApplyTarget: // Ÿ<><C5B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
hApplyActor = hTarget;
break;
case CDnSkill::ApplyEnemy: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.. (<28><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ƴϸ<C6B4> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̴<EFBFBD>..)
if( m_pActor->GetTeam() == hTarget->GetTeam() )
continue;
else
hApplyActor = hTarget;
break;
case CDnSkill::ApplyFriend: // <20><><EFBFBD><EFBFBD> <20><>.. (<28><><EFBFBD><EFBFBD> <20><><EFBFBD≯<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>..?)
if( m_pActor->GetTeam() != hTarget->GetTeam() )
continue;
else
hApplyActor = hTarget;
break;
}
// <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> 0<>̰<EFBFBD> <20>ڽſ<DABD><C5BF><EFBFBD> <20>Ŵ<EFBFBD> <20><><EFBFBD><EFBFBD> ȿ<><C8BF><EFBFBD><EFBFBD>
// <20><>ų<EFBFBD><C5B3> m_vlApplyNoPacketStateEffectList<73><74> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>...[2011/01/13 semozz]
bool isSelfPermentStateEffect = false;
if (CDnSkill::ApplySelf == pLocalStruct->ApplyType &&
(0 == pLocalStruct->nDurationTime ||
-1 == pLocalStruct->nDurationTime))
{
pLocalStruct->nDurationTime = -1;
isSelfPermentStateEffect = true;
}
CDnStateBlow *pStateBlow = hApplyActor->GetStateBlow();
CDnSkill::CanApply eResult = CDnSkill::CanApply::Apply;
if (pStateBlow)
eResult = pStateBlow->CanApplySkillStateEffect(hSkill->GetInfo(), *pLocalStruct);
if (CDnSkill::CanApply::Fail != eResult)
{
hApplyActor->RemoveResetStateBlow();
int nBlowID = hApplyActor->CmdAddStateEffect( hSkill->GetInfo(), (STATE_BLOW::emBLOW_INDEX)pLocalStruct->nID,
pLocalStruct->nDurationTime, pLocalStruct->szValue.c_str(), false, false );
OutputDebug("<EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų(%d) <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><20><><EFBFBD><EFBFBD> (%d)-(%s)\n", pPrefixSkill->GetSkillType(), pLocalStruct->nID, pLocalStruct->szValue.c_str());
if (isSelfPermentStateEffect)
hSkill->AddPrefixBlow(hApplyActor, nBlowID);
}
hApplyActor->InitStateBlowIDToRemove();
}
}
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ǽ<EFBFBD> <20>ڵ<EFBFBD> <20><><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..
m_ProcessPrefixOffenceSkills.clear();
}
#endif // _GAMESERVER
#endif // PRE_ADD_PREFIX_SYSTE_RENEW
void MASkillUser::SkillToggle(DnSkillHandle hSkill, bool isOn)
{
if (!hSkill) return;
#if defined(_CLIENT)
CDnSkill::DurationTypeEnum eDurationType = hSkill->GetDurationType();
if (eDurationType == CDnSkill::DurationTypeEnum::SummonOnOff)
{
hSkill->SummonMonsterOff();
}
#endif // _CLIENT
int skillID = hSkill->GetClassID();
TOGGLESKILLLIST::iterator findIter = m_ToggleOnSkillList.find(skillID);
if (isOn)
{
//<2F>̹<EFBFBD> <20><>ų <20><><EFBFBD>ϵǾ<CFB5> <20><><EFBFBD><EFBFBD>..
if (findIter != m_ToggleOnSkillList.end())
return;
m_ToggleOnSkillList.insert(std::make_pair(skillID, hSkill));
}
else
{
//<2F><><EFBFBD>ϵ<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD>ٸ<EFBFBD>
if (findIter == m_ToggleOnSkillList.end())
return;
m_ToggleOnSkillList.erase(findIter);
}
}
void MASkillUser::SummonOnOffSkillInit(DWORD dwSummonMonsterID)
{
DNVector(DnSkillHandle) summonOnOffSkills;
#if defined(PRE_FIX_SKILLLIST)
for( DWORD i=0; i<m_vlSkillObjects.size(); i++ )
{
DnSkillHandle hSkill = m_vlSkillObjects[i].hSkill;
if (hSkill && hSkill->GetDurationType() == CDnSkill::DurationTypeEnum::SummonOnOff)
summonOnOffSkills.push_back(hSkill);
}
#endif // PRE_FIX_SKILLLIST
for (DWORD i =0; i < summonOnOffSkills.size(); ++i)
{
DnSkillHandle hSkill = summonOnOffSkills[i];
if (hSkill && hSkill->GetSummonMonsterID() == dwSummonMonsterID)
hSkill->EnableToggle(false);
}
}
#if defined(PRE_ADD_TOTAL_LEVEL_SKILL)
void MASkillUser::UpdateGlobalCoolTime(float fRate)
{
for( DWORD i = 0; i < m_vlSkillObjects.size(); ++i )
{
if(m_vlSkillObjects.at( i ).hSkill)
m_vlSkillObjects.at( i ).hSkill->UpdateGlobalCoolTime(fRate);
}
}
void MASkillUser::ResetGlobalCoolTime(float fRate)
{
for( DWORD i = 0; i < m_vlSkillObjects.size(); ++i )
{
if(m_vlSkillObjects.at( i ).hSkill)
m_vlSkillObjects.at( i ).hSkill->ResetGlobalCoolTime(fRate);
}
}
#endif // PRE_ADD_TOTAL_LEVEL_SKILL