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

3629 lines
No EOL
106 KiB
C++
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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

#include "StdAfx.h"
#include "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();
//¹æ¾î¿ë ½ºÅ³ ÃʱâÈ­
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);
//°ø°Ý¿ë ½ºÅ³ ÃʱâÈ­
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)
{
//Á¢µÎ»ç ¹æ¾î¿ë ½ºÅ³
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();
//Á¢µÎ»ç °ø°Ý¿ë ½ºÅ³
iter = m_PrefixOffenceSkills.begin();
endIter = m_PrefixOffenceSkills.end();
for (; iter != endIter; ++iter)
{
if(iter->second)
SAFE_DELETE(iter->second);
}
m_PrefixOffenceSkills.clear();
//»ç¿ëÁßÀÎ Á¢µÎ»ç °ø°Ý¿ë ½ºÅ³ ¸®½ºÆ®
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*/ )
{
// ÆÐ½Ãºê À̸鼭 ¹öÇÁ°í »óÅÂÈ¿°ú Self ·Î ºÙ¾îÀÖ´Â ½ºÅ³Àº °ð¹Ù·Î Àû¿ë½ÃÄÑ ÁÜ..
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
//·¹º§¾÷ Á¤º¸°¡ ÀÖÀ¸¸é Ãß°¡ ÇÑ´Ù.
int nLevelUp = GetSkillLevelUpValue(nSkillTableID);
nLevel += nLevelUp;
DnSkillHandle hSkill = CDnSkill::CreateSkill( m_pActor->GetMySmartPtr(), nSkillTableID, nLevel );
//·¹º§¾÷À» ½Ãµµ Çߴµ¥ ½ºÅ³ »ý¼ºÀÌ ¾ÈµÆ´Ù¸é
if (nLevelUp != 0 && !hSkill)
{
OutputDebug("½ºÅ³ (%d) ·¹º§ (%d) »ý¼º ½ÇÆÐ.. ½ºÅ³ ·¹º§ Å×À̺í È®ÀÎ ¿ä¸Á!!!!!!\n", nSkillTableID, nLevel);
_ASSERT( hSkill && "½ºÅ³ ·¹º§¾÷ ½Ãµµ ½ÇÆÐ.. ·¹º§ Å×À̺í È®ÀÎ" );
//´Ù½Ã ¿ø·¡ ·¹º§·Î »ý¼º ½Ãµµ..
nLevel -= nLevelUp;
hSkill = CDnSkill::CreateSkill(m_pActor->GetMySmartPtr(), nSkillTableID, nLevel);
nLevelUp = 0;
}
if( !hSkill )
return false;
//Ãß°¡µÈ ·¹º§¾÷ Á¤º¸¸¦ ¼³Á¤ ÇÑ´Ù.
hSkill->SetLevelUpValue(nLevelUp);
// ½ºÅ³·¹º§ Å×À̺í Àû¿ëŸÀÔ ¼ÂÆÃ
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
// Åä±Û, ¿À¶ó ½ºÅ³Àº µû·Î ¸®½ºÆ®¿¡ ´ã¾ÆµÒ
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°¡ ¼³Á¤µÈ ½ºÅ³ÀÌ Ãß°¡ µÉ¶§ ±âÁ¸¿¡ °°Àº ID¸¦ »ç¿ëÇÏ´À ½ºÅ³ÀÇ ÄðŸÀÓÀ» Ãß°¡ µÇ´Â ½ºÅ³¿¡µµ ¼³Á¤ ÇØÁØ´Ù.
if (nGlobalSkillGroupID != 0)
{
for( DWORD i = 0; i < GetSkillCount(); ++i )
{
// m_vlGroupedSkillIDs ÀÇ °ªµéÀº Å×ÀÌºí¿¡¼­ ±×³É ²ôÁý¾î ³½ °ÍÀ̱⠶§¹®¿¡
// ½ÇÁ¦ ½ºÅ³À» ½ÀµæÇß´ÂÁö ¿©ºÎ°¡ È®ÀεǾî¾ß ÇÑ´Ù.
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
// °×¼­¹ö¿¡¼­´Â ¸ó½ºÅÍ¿¡¼­¸¸ ½ºÅ³ °´Ã¼·Î Á÷Á¢ addskill ÇÕ´Ï´Ù.
// Ç÷¹ÀÌ¾î ¾×ÅÍ¿¡°Ô´Â ½ºÅ³ Æ®¸® °ü¸®°¡ Áß°£¿¡ µé¾î°¡±â ¶§¹®¿¡ ¼­¹ö¿¡¼­ °¡»óÇÔ¼ö·Î
// playeractor °¡ ¿À¹ö¶óÀ̵åÇÏ¿© »ç¿ëÇÏÁö ¾Ê´Â ÀÌ ÇÔ¼ö »ç¿ëÇÏ¸é ¾ÈµË´Ï´Ù.
// ÃßÈÄ¿¡ »ç¿ëÇÏ°Ô µÈ´Ù¸é ±â¾ïÇϱâ À§Çؼ­ assert °É¾î³õ½À´Ï´Ù.
//_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
// Åä±Û, ¿À¶ó ½ºÅ³Àº µû·Î ¸®½ºÆ®¿¡ ´ã¾ÆµÒ
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 ÀÚ±âÀÚ½ÅÀÇ ½ºÅ³µéÀ» ÃʱâÈ­ÇÒ¶© CDnSkillTask ÂÊ¿¡¼­ ½ÇÁ¦ ȹµæÇÑ ½ºÅ³¸®½ºÆ®¸¦ ±âÁØÀ¸·Î AddSkill() ÇÔ¼ö¸¦
// È£ÃâÇØÁֱ⠶§¹®¿¡ ¹®Á¦ ¾øÁö¸¸ ´Ù¸¥ Ç÷¹À̾îÀÇ °æ¿ì¿£ ±×³É ¼­¹ö¿¡¼­ ¹Ð¾îÁÖ´Â ½ºÅ³¸®½ºÆ®(¸®¼ÂµÈ ·¹º§ 0Â¥¸® ½ºÅ³ Æ÷ÇÔ)
// ±×´ë·Î AddSkill() ÇÔ¼ö¸¦ È£ÃâÇØÁֱ⠶§¹®¿¡ ¸®¼ÂµÈ ÆÐ½Ãºê ½ºÅ³µµ Àû¿ë½ÃÄÑÁà¹ö¸®´Â ¹®Á¦°¡ ÀÖ´Ù.
// µû¶ó¼­ ¿©±â¼­ ȹµæ »óŰ¡ ¾Æ´Ï¸é ÆÐ½Ãºê ¹öÇÁ ½ºÅ³À» ¹ßµ¿½ÃÄÑÁÖÁö ¾Êµµ·Ï ÇÑ´Ù. (hp/mp ÃÖ´ëÄ¡ Áõ°¡ ½ºÅ³µîµî..)
// °ÔÀÓ¼­¹öÂÊ¿¡¼­´Â Ŭ¶óÀÌ¾ðÆ®¿Í ´Ù¸£°Ô °¢ CDnPlayerActor °´Ã¼µéÀÌ ½ÇÁ¦ º¸À¯ÇÑ ½ºÅ³¸¸ °®°í ÀÖ´Ù.
// Ŭ¶óÀ̾ðÆ®ÂÊ¿¡¼­´Â LocalPlayerActor ÀÎ °æ¿ì¿¡ ¸®¼ÂµÈ ½ºÅ³ÀÇ Á¤º¸µµ ÇÊ¿äÇϹǷΠPlayerActor ¸¦ µû·Î ±¸ºÐ ¾ÈÇÏ°í ½ºÅ³¸®½ºÆ® ¸ðµÎ ³Ö¾îÁØ´Ù..
#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ÀÌ -1 ÀÌ¸é ¹«ÇÑ Àû¿ëÀÓ
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ÀÌ -1 ÀÌ¸é ¹«ÇÑ Àû¿ëÀÓ
#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( "[ÆÐ½Ãºê ¹öÇÁ ½ºÅ³ Àû¿ëµÊ: %d] \"%s\" »óÅÂÈ¿°ú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( "[ÆÐ½Ãºê ¹öÇÁ ½ºÅ³ Àû¿ë¾ÈµÊ: %d] \"%s\" ½ºÅ³¿¡ ÁöÁ¤µÈ ÇÊ¿ä ¹«±â ŸÀÔÀÌ ¸ÂÁö ¾Ê½À´Ï´Ù.\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( "[½ºÅ³ µ¥ÀÌÅÍ È®ÀÎ ¿ä¸Á: %d] \"%s\" ÆÐ½Ãºê ¹öÇÁ ½ºÅ³·Î »ý°¢µÇ³ª Buff ·Î ¼³Á¤µÇ¾îÀÖÁö ¾Ê¾Æ¼­ Àû¿ë ¾ÈµÊ\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 ±è¹ä
m_vlhSelfPassiveBlowSkill.erase( m_vlhSelfPassiveBlowSkill.begin()+iPassiveBlowSkill );
break;
}
}
#if defined(PRE_ADD_TOTAL_LEVEL_SKILL)
//ÅëÇÕ·¹º§ ½ºÅ³ÀÎ °æ¿ì ¾Æ·§ÂÊ ·çƾÀ» Å» Çʿ䰡 ¾øÀ½...
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 ) {
// Åä±ÛÀ̳ª ¿À¶ó ½ºÅ³À̶ó¸é º°µµÀÇ ¸®½ºÆ®¿¡¼­ »èÁ¦
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 )
{
// Åä±ÛÀ̳ª ¿À¶ó ½ºÅ³À̶ó¸é º°µµÀÇ ¸®½ºÆ®¿¡¼­ »èÁ¦
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 )
{
// ÆÐ½Ãºê ºí·Î¿ì ½ºÅ³Àΰ¡. ±×·¸´Ù¸é ±âÁ¸ »óÅÂÈ¿°ú ¸ðµÎ ¾ø¾Ö°í »õ·Î Àû¿ë½ÃÄÑ ÁØ´Ù.
DNVector(DnSkillHandle)::iterator iter = find( m_vlhSelfPassiveBlowSkill.begin(), m_vlhSelfPassiveBlowSkill.end(), m_vlhSkillList[ i ] );
if( m_vlhSelfPassiveBlowSkill.end() != iter )
{
// Àû¿ëµÇ¾î ÀÖ´Â »óÅÂÈ¿°ú¸¦ Á¦°ÅÇÑ´Ù.
// ºÎ¸ð½ºÅ³ÀÌ ÀÏÄ¡ÇÏ´Â »óÅÂÈ¿°ú¸¦ ã¾Æ³»¼­ »èÁ¦ÇÑ´Ù.
if( !IsValidActor() ) continue;
// HP, SP ¿Ã·ÁÁÖ´Â ÆÐ½Ãºê ½ºÅ³Àº »èÁ¦µÇ¸é ¿ø·¡ ½ºÅ³ ¾ø´Â »óÅÂÀÇ ¼ø¼ö HP SP ·Î ÇöÀç HP/SP°¡
// Ŭ¸®ÇÎ µÇ°Ô ¶§¹®¿¡ ¹Ì¸® ¹Þ¾Æµ×´Ù°¡ ¼ÂÆÃÇØÁØ´Ù..
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( "[ÆÐ½Ãºê ¹öÇÁ ½ºÅ³ »èÁ¦µÊ: %d] %s »óÅÂÈ¿°ú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 ] )
{
// ÀÚ½ÅÀÌ »ý¼ºÇÑ ½ºÅ³Àº ÀÚ½ÅÀÌ Áö¿ö¾ß ÇϹǷÎ.
DnSkillHandle hSkillToRelease = m_vlhSkillList[ i ];
// ¿À¶ó, Åä±Û ½ºÅ³ ¸®½ºÆ®¿¡¼­µµ °Ë»öÇØ¼­ ´ëü ½ÃÅ´
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
{
// ½ºÅ³ ŽºÅ©¿¡¼­ »ý¼ºÇÑ ½ºÅ³ °´Ã¼´Â ¿©±â¼­ Áö¿ìÁö ¾Ê´Â´Ù.
DnSkillHandle hPrevLevelSkill = m_vlhSkillList[ i ];
// ¿À¶ó, Åä±Û ½ºÅ³ ¸®½ºÆ®¿¡¼­µµ °Ë»öÇØ¼­ ´ëü ½ÃÅ´
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 )
{
// ÆÐ½Ãºê ºí·Î¿ì ½ºÅ³Àΰ¡. ±×·¸´Ù¸é ±âÁ¸ »óÅÂÈ¿°ú ¸ðµÎ ¾ø¾Ö°í »õ·Î Àû¿ë½ÃÄÑ ÁØ´Ù.
DNVector(DnSkillHandle)::iterator iter = find( m_vlhSelfPassiveBlowSkill.begin(), m_vlhSelfPassiveBlowSkill.end(), hSkill );
if( m_vlhSelfPassiveBlowSkill.end() != iter )
{
// Àû¿ëµÇ¾î ÀÖ´Â »óÅÂÈ¿°ú¸¦ Á¦°ÅÇÑ´Ù.
// ºÎ¸ð½ºÅ³ÀÌ ÀÏÄ¡ÇÏ´Â »óÅÂÈ¿°ú¸¦ ã¾Æ³»¼­ »èÁ¦ÇÑ´Ù.
if( !IsValidActor() ) continue;
// HP, SP ¿Ã·ÁÁÖ´Â ÆÐ½Ãºê ½ºÅ³Àº »èÁ¦µÇ¸é ¿ø·¡ ½ºÅ³ ¾ø´Â »óÅÂÀÇ ¼ø¼ö HP SP ·Î ÇöÀç HP/SP°¡
// Ŭ¸®ÇÎ µÇ°Ô ¶§¹®¿¡ ¹Ì¸® ¹Þ¾Æµ×´Ù°¡ ¼ÂÆÃÇØÁØ´Ù..
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( "[ÆÐ½Ãºê ¹öÇÁ ½ºÅ³ »èÁ¦µÊ: %d] %s »óÅÂÈ¿°ú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 )
{
// ÀÚ½ÅÀÌ »ý¼ºÇÑ ½ºÅ³Àº ÀÚ½ÅÀÌ Áö¿ö¾ß ÇϹǷÎ.
DnSkillHandle hSkillToRelease = hSkill;
// ¿À¶ó, Åä±Û ½ºÅ³ ¸®½ºÆ®¿¡¼­µµ °Ë»öÇØ¼­ ´ëü ½ÃÅ´
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
{
// ½ºÅ³ ŽºÅ©¿¡¼­ »ý¼ºÇÑ ½ºÅ³ °´Ã¼´Â ¿©±â¼­ Áö¿ìÁö ¾Ê´Â´Ù.
DnSkillHandle hPrevLevelSkill = hSkill;
// ¿À¶ó, Åä±Û ½ºÅ³ ¸®½ºÆ®¿¡¼­µµ °Ë»öÇØ¼­ ´ëü ½ÃÅ´
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
// °°Àº ÇÁ·¹ÀÓ¿¡ ¾×Ƽºê ½ºÅ³ ¿©·¯°³ »ç¿ë ºÒ°¡.
if( m_hProcessSkill &&
m_hProcessSkill->GetSkillType() == CDnSkill::Active &&
hSkill->GetSkillType() == CDnSkill::Active )
if( m_bSkillExecutedThisFrame )
return CDnSkill::UsingResult::Failed;
#endif
// [2011/02/22 semozz]
// ¾Ö´Ï¸ÞÀÌ¼Ç Àüȯ °¡´É üũ´Â Ŭ¶óÀÌ¾ðÆ®¸¸ ÇÏ¸é µÉµí...
#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 ¿À¶ó ½ºÅ³Àº ¿À¶ó¸¦ ²°À» ¶§ onend µÈ´Ù.
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:
// ¸¶À»¿¡¼­´Â SP ¾È ±ïÀ̵µ·Ï
#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 ÇÔ¼ö´Â OnBegin À¸·Î À̸§ÀÌ ¹Ù²î¾ú´Ù.
//m_hProcessSkill->Execute( LocalTime, fDelta );
m_hProcessSkill->OnBegin( LocalTime, fDelta );
// ±Û·Î¹ú ÄðŸÀÓÀÌ ¼³Á¤µÇ¾îÀÖ´Ù¸é °°Àº ±×·ìÀÇ ½ºÅ³µéµµ ÄðŸÀÓ ½ÃÀÛ..
if( m_hProcessSkill && 0 < m_hProcessSkill->GetGlobalSkillGroupID() )
{
for( DWORD i = 0; i < GetSkillCount(); ++i )
{
// m_vlGroupedSkillIDs ÀÇ °ªµéÀº Å×ÀÌºí¿¡¼­ ±×³É ²ôÁý¾î ³½ °ÍÀ̱⠶§¹®¿¡
// ½ÇÁ¦ ½ºÅ³À» ½ÀµæÇß´ÂÁö ¿©ºÎ°¡ È®ÀεǾî¾ß ÇÑ´Ù.
DnSkillHandle hExistSkill = GetSkillFromIndex( i );
if( hExistSkill &&
hExistSkill != m_hProcessSkill &&
hExistSkill->GetGlobalSkillGroupID() == m_hProcessSkill->GetGlobalSkillGroupID() )
{
// ±Û·Î¹ú ÄðŸÀÓÀ¸·Î °°ÀÌ µµ´Â ½ºÅ³µéÀº »ç¿ëµÈ ½ºÅ³ÀÇ ÄðŸÀÓÀ¸·Î ¹Ù²ãÁØ´Ù.
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: Åä±ÛÀÌ ÄÑÁú ´ç½ÃÀÇ °ø°Ý·ÂÀ» ÀúÀåÇØµÐ´Ù. ÃßÈÄ¿¡ °ø°Ý·Â ¸»°í ´Ù¸¥ °ÍµéÀÌ Ãß°¡µÉ ¼öµµ ÀÖ´Ù.
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:
{
// ¿À¶ó ½ºÅ³µé³¢¸® Åä±Û¸µ ÇØÁÜ. ´Ù¸¥ ¿À¶ó ½ºÅ³ÀÌ ÄÑÁö¸é ²¨Áö°í, ÇöÀç ½ÃÀüÁßÀÎ ¿À¶ó ½ºÅ³ÀÌ¸é ²¨ÁØ´Ù.
// ¿À¶ó ½ºÅ³µéÀ» ¸ÕÀú Á¾·á½ÃŰ°í »õ·Î ÄÑÁö´Â ¿À¶ó¸¦ ½ÇÇàÇØ¾ß »õ·Î ½ÇÇàµÉ ¿À¶ó¿¡¼­ self blow Å¥¿¡ ½×ÀÎ °ÍµéÀÌ
// Ŭ¸®¾î µÇÁö ¾Ê°í Á¦´ë·Î Àû¿ëµÈ´Ù.
bool bProcessingAuraOff = false; // °°Àº ¿À¶ó ½ºÅ³ÀÌ execute µÇ¸é ¿À¶ó°¡ ²¨Áö´Â °ÍÀÓ.
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;
}
}
// ´Ù¸¥ ¿À¶ó½ºÅ³À» »ç¿ëÇØ¼­ ±âÁ¸ÀÇ ¿À¶ó°¡ ²¨Áö°í »õ·Î ¹ßµ¿µÊ.
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 Çѱâ: m_hProcessSkill ½º¸¶Æ® Æ÷ÀÎÅÍ´Â ¿À¶ó ½ºÅ³ »ç¿ëÇÏ´Â ¾×¼ÇÀÌ Àç»ýµÇ´Â µ¿¾ÈÀº À¯È¿Çؾß
// °ÔÀÓ ¼­¹ö¿¡¼­ CDnPlayerActor::CmdStop() ÂÊ¿¡¼­ °É·¯Áö±â ¶§¹®¿¡ °× ¼­¹ö¿¡¼­ ÇØ´ç ¾×¼Ç ½Ã±×³ÎÀÌ ³¡±îÁö
// 󸮵Ê. µû¶ó¼­ CDnActor::OnChangeAction ÂÊ¿¡¼­ ProcessSkill À» Identity ½ÃÅ´.
}
}
}
else
{
// ÄÑÁ® ÀÖ´ø ¿À¶ó°¡ ²¨Áü.
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 );
// ¹ßµ¿µÈ ¸®½ºÆ®¿¡ ³Ö¾îµÐ´Ù. process µ¹·Á¾ß Çϱ⠶§¹®¿¡,
m_listProcessAutoPassiveSkills.push_back( hSkill );
// »ç¿ëµÈ ¿ÀÅä ÆÐ½Ãºê ½ºÅ³Àº ¸Ç µÚ¿¡ ºÙÀδÙ. ½ÇÇà ¿ì¼±¼øÀ§¸¦ ³·Ãã.
m_listAutoPassiveSkills.erase( iter );
m_listAutoPassiveSkills.push_back( hSkill );
// ProcessSkill Àº ¾Æ´Ï¹Ç·Î ÃʱâÈ­ ½ÃÅ´. ProcessSkill ÀÌ ÀÖÀ¸¸é CmdStop ÀÌ ¸ÔÁö ¾Ê´Â´Ù.
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 )
{
//°ÔÀÓ ¼­¹ö¿¡¼­¸¸ ÆÇ´ÜÇØ¼­ ¼­¹öÂÊ Á¾·á ½Ã۰í/Ŭ¶óÀÌ¾ðÆ®·Î ÆÐŶ Àü¼Û...
#if defined(_GAMESERVER)
if( m_hAuraSkill->IsFinished() )
{
if (m_pActor)
m_pActor->CmdFinishAuraSkill(m_hAuraSkill->GetClassID());
// [2011/03/22 semozz]
// ÇöÀç ½ºÅ³ÀÌ ¿À¶ó ½ºÅ³°ú °°Àº ½ºÅ³À̸é ÇöÀç ½ºÅ³µµ ÃʱâÈ­.
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;
//½ºÅ³ ÇÚµé À¯È¿¼º üũ Ãß°¡
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;
//½ºÅ³ ÇÚµé À¯È¿¼º üũ Ãß°¡
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 );
}
// ÄðŸÀÓ °¨¼Ò »óÅÂÈ¿°ú°¡ ÀÖ´Ù¸é µ¨Å¸°ª¿¡ ¿µÇâÀ» ÁÙ °ªÀ» °è»êÇÑ´Ù.
if( m_pActor && m_pActor->IsAppliedThisStateBlow( STATE_BLOW::BLOW_096 ) )
{
DNVector(DnBlowHandle) vlhCoolTimeBlows;
m_pActor->GetStateBlow()->GetStateBlowFromBlowIndex( STATE_BLOW::BLOW_096, vlhCoolTimeBlows );
// ÄðŸÀÓ °¨¼Ò »óÅÂÈ¿°ú´Â - ±âÁØÀ̱⶧¹®¿¡ ÁßøµÇ¸é »©ÁØ´Ù.
float fCoolTimeDeltaAdjust = 1.0f;
int iNumBlow = (int)vlhCoolTimeBlows.size();
for( int i = 0; i < iNumBlow; ++i )
{
fCoolTimeDeltaAdjust -= (1.0f - vlhCoolTimeBlows.at( i )->GetFloatValue());
}
// #40670 ½ºÇǸ´ ºÎ½ºÆ®µµ ÄðŸÀÓ °¨¼Ò »óÅÂÈ¿°ú¸¦ »ç¿ëÇÏ°Ô µÊ.
// Áßø½Ã WeightTable ¿¡¼­ Á¦ÇÑÀ» ¹Þ°Ô µÈ´Ù.
float fCoolTimeAccelMax = CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::CoolTimeAccellSE_Max );
if( fCoolTimeDeltaAdjust < 1.0f - fCoolTimeAccelMax )
fCoolTimeDeltaAdjust = 1.0f - fCoolTimeAccelMax;
// 1.0f À» Á¤»ó¼öÄ¡ ±âÁØÀ¸·Î »óÅÂÈ¿°ú ÀÎÀÚ°ªÀ» Àüü ÄðŸÀÓ¿¡ ±×´ë·Î Àû¿ëÇÑ °á°ú°ªÀÌ ÇöÀç ÃÖÁ¾ ÄðŸÀÓ ±âÁØÀ̹ǷÎ
// ¸Å ÇÁ·¹ÀÓ Ã³¸®ÇØÁÖ´Â µ¨Å¸ °ª¿¡ ºñÀ²ÀÇ ¿ª¼ö¸¦ °öÇÑ´Ù.
// °á°ú·Î ³ª¿Â °ªÀº °¢ ½ºÅ³¿¡¼­ ·çÇÁ¸¦ µ¹ ¶§ ¾×ÅÍ¿¡¼­ ¾ò¾î¿Í¼­ Á÷Á¢ Àû¿ëÇÑ´Ù. 2415ÀÇ Å¸ÀÓ ¿¢¼¿·¯·¹ÀÌ¼Ç ½ºÅ³¸¸ Á¦¿ÜÇϰí.
m_fCoolTimeDeltaAdjustValue = 1.0f / fCoolTimeDeltaAdjust;
}
else
m_fCoolTimeDeltaAdjustValue = 1.0f;
#ifdef _GAMESERVER
#ifndef PRE_FIX_SKILLLIST
#ifdef PRE_FIX_GAMESERVER_PERFOMANCE
// ÄðŸÀÓ Ã³¸®. ÃßÈÄ¿¡ Äð ŸÀÓ »Ó¸¸ ¾Æ´Ï¶ó ±âŸµîµîÀÇ ¿©·¯°¡Áö Áö¼ÓÀûÀÎ Processing À» ÇÏ°Ô µÉ °ÍÀÓ.
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" );
// ÄðŸÀÓ Ã³¸®. ÃßÈÄ¿¡ Äð ŸÀÓ »Ó¸¸ ¾Æ´Ï¶ó ±âŸµîµîÀÇ ¿©·¯°¡Áö Áö¼ÓÀûÀÎ Processing À» ÇÏ°Ô µÉ °ÍÀÓ.
for( DWORD i = 0; i < m_vlSkillObjects.size(); i++ )
{
// Ŭ¶óÀ̾ðÆ®ÀÎ °æ¿ì¿£ ½ºÅ³ °´Ã¼ °ü¸®¸¦ ÇÏ´Â SkillTask °¡ ¸ÕÀú ¼Ò¸êµÇ¾î valid üũ¸¦ ÇØ¾ß ÇÔ.
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
// ÄðŸÀÓ Ã³¸®. ÃßÈÄ¿¡ Äð ŸÀÓ »Ó¸¸ ¾Æ´Ï¶ó ±âŸµîµîÀÇ ¿©·¯°¡Áö Áö¼ÓÀûÀÎ Processing À» ÇÏ°Ô µÉ °ÍÀÓ.
for( DWORD i = 0; i < m_vlSkillObjects.size(); i++ )
{
// Ŭ¶óÀ̾ðÆ®ÀÎ °æ¿ì¿£ ½ºÅ³ °´Ã¼ °ü¸®¸¦ ÇÏ´Â SkillTask °¡ ¸ÕÀú ¼Ò¸êµÇ¾î valid üũ¸¦ ÇØ¾ß ÇÔ.
if( m_vlSkillObjects.at( i ).hSkill )
m_vlSkillObjects.at( i ).hSkill->Process( LocalTime, fDelta );
}
#endif // #ifndef PRE_FIX_SKILLLIST
#endif // #ifdef _GAMESERVER
// ¾ÆÀÌÅÛ¿¡ ºÙÀº ½ºÅ³ÀÌ ÀÖ´Ù¸é 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 );
}
// Á¾·á ¿¹¾àµÈ ½ºÅ³µé Á¾·á ½ÃÅ´.
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();
}
// ÀÌ ÇÔ¼ö´Â ¸ó½ºÅ͵ç Ç÷¹À̾îµç ¹«±âµç OnSignal ¿¡¼­ Projectile ÀÌ °É¸®¸é Ç×»ó È£ÃâµÈ´Ù!!
void MASkillUser::OnSkillProjectile( CDnProjectile *pProjectile )
{
if( !IsValidActor() )
return;
// Projectile ÀÇ °Ñ¸ð½ÀÀ» ½ÇÁ¦·Î ¹Ù²ãÁØ´Ù.
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() )
{
// ÇöÀç Åä±Û Enable µÉ »óÅÂÀÎ ½ºÅ³À» ó¸®ÇÏ´Â °ÍÀÓ.
_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()) )
{
// ¸¶À»¿¡¼­´Â SP ¾È ±ïÀ̵µ·Ï
#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 À̶ó°í ÁöÈ£¾¾°¡ Ãß°¡ÇÑ °Å ÀÖÀ½
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()) )
{
// ¸¶À»¿¡¼­´Â SP ¾È ±ïÀ̵µ·Ï
#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 Çѱâ: Á÷Á¢ µ¥¹ÌÁö °è»ê¿¡ ÇÊ¿äÇÑ ActorState ¸¦ Projectile ¿¡ ½Ç¾î¼­ ³¯¸®´Â ¹æ¹ýÀ¸·Î º¯°æ.
// Åä±Û ½ºÅ³ÀÌ ¾Æ´Ñ ÇÁ·ÎÁ§Å¸ÀÏÀ» ½î´Â ½ºÅ³ÀÎ °æ¿ì¿£ ¿©±â¼­ °ø°Ý·Â Àû¿ë½ÃÄÑÁÜ
if( !m_hToggleSkill && m_hProcessSkill )
{
static_cast<CDnActor*>(this)->GetStateBlow()->Process( 0, 0.0f );
CDnActor* pActor = static_cast<CDnActor*>(this);
// üÀÎ ½ºÅ³ »óÅÂÈ¿°ú¸¦ ¾²´Â ¹ß»çü´Â
// CDnState º¹»ç°¡ ¸Å¿ì ºó¹øÇÏ°Ô ÀϾ ¼ö ÀÖÀ¸¹Ç·Î shaared_ptr »ç¿ë.
boost::shared_ptr<CDnState> pActorStateSnapshot = boost::shared_ptr<CDnState>(new CDnState);
*pActorStateSnapshot = *(static_cast<CDnState*>(pActor));
// ½ºÅ³ÀÎ °æ¿ì¿¡¸¸ ¿©±â¼­
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() )
{
// ÇöÀç Åä±Û ½ºÅ³Àº »ç¿ëµÇÁö ¾ÊÁö¸¸ ÃßÈÄ ¾îÂîµÉÁö ¸ô¶ó ÄÚµå ³²°ÜµÒ. 2011.03.15
// Åä±ÛÀ» ÄÒ ´ç½ÃÀÇ ´É·ÂÄ¡·Î ÇÁ·ÎÁ§Å¸ÀÏ¿¡ ¼ÂÆÃÇØ ÁÜ.
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 ½ºÅÄµå ¾×¼Ç º¯°æ »óÅÂÈ¿°ú¿¡¼­ ¹ß»çü¸¦ ½î´Â °æ¿ì¿¡µµ ½ºÅ³ ¹ß»çü·Î ó¸® ÇÔ.
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:
// ¸¶À»¿¡¼­´Â SP ¾È ±ïÀ̵µ·Ï
#ifndef _GAMESERVER
if( CDnWorld::MapTypeVillage != CDnWorld::GetInstance().GetMapType() )
#endif
// Åä±Û¸µÇÒ¶© ±ïÀÌÁö ¾Ê´Â´Ù. ¾µ ¶§ ±ïÀÓ
//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:
// ¸¶À»¿¡¼­´Â SP ¾È ±ïÀ̵µ·Ï
#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
// ¼­¹öÀÇ ÄðŸÀÓ ¿ÀÂ÷¸¦ °¨¾ÈÇØ¼­ 0.5ÃÊÀÇ ¿©À¯¸¦ µÎ°í ÀÖÁö¸¸,
// Á¸À̵¿ÇÒ¶§³ª ±âŸ 0.5ÃÊ ÀÌ»ó Ŭ¶óÀÌ¾ðÆ®¿Í ¹ú¾îÁö´Â ´Ù¸¥ »õ·Î¿î °æ¿ìµéÀÌ »ý±æ ¼ö ÀÖÀ¸¹Ç·Î
// ÃÖÁ¾ ½ºÅ³ »ç¿ëÇÑ Å¸ÀÓ ½ºÅÆÇÁ¸¦ Âï¾îµÎ¾î µ¥ÀÌÅÍ¿¡ ÁöÁ¤µÈ ½ºÅ³ÀÇ ÄðŸÀÓº¸Å¸ °£°ÝÀÌ Å©´Ù¸é
// ¼­¹öÀÇ ½ºÅ³ °´Ã¼¿¡ ÀúÀåµÇ¾îÀÖ´Â ÄðŸÀÓÀ» ÃʱâÈ­ ½ÃÄÑÁÖµµ·Ï ÇÑ´Ù. (#19737)
hSkill->UpdateSkillCoolTimeExactly();
#endif
eResult = CanExecuteSkill( hSkill );
if( !bCheckValid || CDnSkill::UsingResult::Success == eResult )
{
#if defined(_CLIENT)
//½ºÅ³ »ç¿ëÀÌ ¼º°øÀÌ¶óµµ ¼Òȯ ¸ó½ºÅͰ¡ ÀÖ´Ù¸é ¼Òȯ ¸ó½ºÅ͸¦ ¼Òȯ ÇØÁ¦¸¸ ÇÏ°í ½ÇÁ¦ ½ºÅ³ »ç¿ëÀº ¾ÈµÊ..
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
{
// ½ºÅ³ »ç¿ëÀÌ ½ÇÆÐ Çß´õ¶óµµ ¼Òȯ ¸ó½ºÅͰ¡ ÀÖ´Ù¸é ¼Òȯ ¸ó½ºÅÍ ¼Òȯ ÇØÁ¦ ½ÃÅ´.
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:
{
// ¿©±â¼­ »ý¼ºµÈ ¾ÆÀÌÅÛ ½ºÅ³Àº OnProcessSkill ÇÔ¼ö¿¡¼­ Finish üũ¸¦ ÇÏ¿© ¸®½ºÆ®¿¡¼­ ¾Ë¾Æ¼­ »èÁ¦ÇØÁØ´Ù.
DnSkillHandle hSkill = CDnSkill::CreateSkill( m_pActor->GetMySmartPtr(), nSkillTableID, nSkillLevelTableID );
if( !hSkill ) {
bResult = false;
break;
}
// ¾ÆÀÌÅÛ¿¡ ºÙÀº ½ºÅ³·Î ¼ÂÆÃÇØÁÜ.
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;
// »èÁ¦ ¿¹Á¤.
case CDnItem::ApplyStateBlow:
{
//// ¿©±â¿¡ µé¾î¿À´Â Instant ¾ÆÀÌÅÛÀÎ °æ¿ì CDnItemTask ¿¡¼­ ¾ÆÀÌÅÛ »ý¼ºÇÏ°í °ð¹Ù·Î »èÁ¦ÇÔ.
//DnSkillHandle hSkill = CDnSkill::CreateSkill( m_pActor->GetMySmartPtr(), nSkillTableID, nSkillLevelTableID );
//
//if( !hSkill )
// bResult = false;
//hSkill->AsItemSkill();
//// °­Á¦·Î »óÅÂÈ¿°ú µ¿±â¸¦ ¸ÂÃçÁÖ´Â ÇÔ¼ö.
//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 )
{
// ÆÐ½Ãºê ½ºÅ³µé Áß¿¡ »ç¿ë°¡´É ¹«±â¸¦ Á¤ÀÇÇÑ °ÍµéÀÌ ÀÖ³ª üũ.
// ´Ù¸¥ ¹«±â¸¦ Â÷°í À־ ÆÐ½Ãºê »óÅÂÈ¿°úµéÀÌ Àû¿ëµÈ »óŰ¡ ¾Æ´Ï¶ó¸é Ȱ¼ºÈ­ ½ÃÄÑÁØ´Ù.
int iNumSelfBlowPassiveSkills = (int)m_vlhSelfPassiveBlowSkill.size();
for( int i = 0; i < iNumSelfBlowPassiveSkills; ++i )
{
DnSkillHandle hSkill = m_vlhSelfPassiveBlowSkill.at( i );
if( false == hSkill->IsAppliedPassiveBlows() )
{
// ³»ºÎ¿¡¼­ »ç¿ë°¡´É ¹«±â üũ ÇÔ.
ApplyPassiveSkill( hSkill );
}
}
// rangechecker ÀÖ´Â ½ºÅ³µéÀº ¹«±â áÀ» ¶§ ¾÷µ¥ÀÌÆ® ÇØÁØ´Ù.
#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 )
{
// ÆÐ½Ãºê ½ºÅ³µé Áß¿¡ »ç¿ë°¡´É ¹«±â¸¦ Á¤ÀÇÇÑ °ÍµéÀÌ ÀÖ³ª üũ.
// ¿ä±¸ÇÏ´Â ¹«±â¿Í ¸ÂÁö ¾Ê´Â´Ù¸é ÆÐ½Ãºê ½ºÅ³¿¡ µþ¸° »óÅÂÈ¿°úµéÀ» Á¦°ÅÇÑ´Ù.
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() )
{
// Çö½ÃÁ¡¿¡¼­ °ð¹Ù·Î »èÁ¦
//m_pActor->GetStateBlow()->RemoveImediatlyStateEffectFromID( hBlow->GetBlowID() );
//RebirthBlow¿¡¼­ OnBegin¿¡¼­ Ÿ°í µé¾î¿Í¼­ »èÁ¦°¡ µÇ´Â °æ¿ì°¡ ¹ß»ý.
//Áï½Ã Áö¿ìÁö ¾Ê°í Áö¿ò ¸®½ºÆ®¿¡ Ãß°¡ Çϵµ·Ï ¼öÁ¤
m_pActor->GetStateBlow()->RemoveStateBlowFromID(hBlow->GetBlowID());
}
}
}
hSkill->SetAppliedPassiveBlows( false );
}
}
}
// rangechecker ÀÖ´Â ½ºÅ³µéÀº ¹«±â áÀ» ¶§ ¾÷µ¥ÀÌÆ® ÇØÁØ´Ù.
#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();
//ÇØ´ç ½ºÅ³ÀÇ È®·ü°ªÀ» °¡Á®¿Â´Ù.
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. ½½·Ôº°·Î ÀúÀåµÈ ½ºÅ³µéÀ» °°Àº ½ºÅ³³¢¸® ¼öÁýÇÑ´Ù.
GroupingPrefixDefenceSkillsBySameSkillID(m_prefixSystemDefenceSkills, sameSkillList);
PREFIX_SYSTEM_SKILL_LIST tempCandiateDefenceSkills;
//2. °°Àº ½ºÅ³µé È®·üÀ» ´õÇØ¼­ È®·üÀ» °áÁ¤Çϰí, °°Àº ½ºÅ³Áß ·¹º§ÀÌ ³ôÀº ³à¼®À» ¼±ÅÃÇÑ´Ù.
CalculateProbabilitySkill(tempCandiateDefenceSkills, sameSkillList);
//3. ½ºÅ³IDº°·Î ·¹º§ÀÌ ³ôÀº ³à¼®ÀÇ ¸®½ºÆ®¿¡¼­ ½ºÅ³ÀÇ ¿ì¼±¼øÀ§º°·Î ±×·ìÇÎÇÑ´Ù.
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();
//ÇØ´ç ½ºÅ³ÀÇ È®·ü°ªÀ» °¡Á®¿Â´Ù.
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. ½½·Ôº°·Î ÀúÀåµÈ ½ºÅ³µéÀ» °°Àº ½ºÅ³³¢¸® ¼öÁýÇÑ´Ù.
GroupingPrefixDefenceSkillsBySameSkillID(m_prefixSystemOffenceSkills, sameSkillList);
PREFIX_SYSTEM_SKILL_LIST tempCandiateOffenceSkills;
//2. °°Àº ½ºÅ³µé È®·üÀ» ´õÇØ¼­ È®·üÀ» °áÁ¤Çϰí, °°Àº ½ºÅ³Áß ·¹º§ÀÌ ³ôÀº ³à¼®À» ¼±ÅÃÇÑ´Ù.
CalculateProbabilitySkill(tempCandiateOffenceSkills, sameSkillList);
//3. ½ºÅ³IDº°·Î ·¹º§ÀÌ ³ôÀº ³à¼®ÀÇ ¸®½ºÆ®¿¡¼­ ½ºÅ³ÀÇ ¿ì¼±¼øÀ§º°·Î ±×·ìÇÎÇÑ´Ù.
GroupingSkillByPriority(m_PrefixSystemCandiateOffenceSkills, tempCandiateOffenceSkills, fHitDamageProb);
}
void MASkillUser::ProcessPrefixDefenceSkill(DnActorHandle hHitter)
{
//Á¢µÎ¾î ½Ã½ºÅÛ ¹æ¾î¿ë ½ºÅ³ µî·ÏµÇ µÇ¾î ÀÖÁö ¾Ê´Ù¸é
if (m_prefixSystemDefenceSkills.empty())
return;
OutputDebug("Á¢µÎ¾î ¹æ¾î¿ë ½ºÅ³ ½ÃÀÛ-----------------------------!!\n");
//Á¢µÎ¾î ½Ã½ºÅÛ ¹æ¾î¿ë ½ºÅ³Áß ¼±ÅÃ..
RefreshPrefixDefenceSkills();
// ÃÖÁ¾ ¸®½ºÆ®¿¡ ´ã±ä ½ºÅ³Áß¿¡¼­ ¿ì¼±¼øÀ§°¡ °¡Àå ³ôÀº ¸®½ºÆ®¿¡ ÀúÀåµÈ ½ºÅ³¸¸ »ç¿ëÇÑ´Ù.
if (m_PrefixSystemCandiateDefenceSkills.empty())
{
OutputDebug("Á¢µÎ¾î ¹æ¾î¿ë ½ºÅ³ ¼±ÅõȰоøÀ½.-----------------------------!!\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;
/*
//ÄðŸÀÓ ³²¾Æ ÀÖÀ¸¸é °Ç³Ê¶Ü.
if (hSkill->GetCoolTime() != 0.0f && hSkill->GetElapsedDelayTime() > 0.0f)
continue;
*/
OutputDebug("Á¢µÎ¾î ¹æ¾î¿ë ½ºÅ³(%d) ½ÃÀÛ....\n", hSkill->GetClassID());
//Skill ÄðŸÀÓ ½ÃÀÛ?
hSkill->OnBeginCoolTime();
m_PrefixSkillCoolTimeManager.AddCoolTime(hSkill);
int nStateEffectCount = hSkill->GetStateEffectCount();
// ÇØ´ç ½ºÅ³ÀÇ »óÅ ȿ°úº° Àû¿ë ¾×Å͸¦ °áÁ¤Çؼ­ Áߺ¹ ó¸® È®ÀÎÇϰí,
// ¾×Åͺ°·Î »óÅ ȿ°ú Àû¿ëÀ» ÇØ¾ß ÇÒµí Çѵ¥...
for( DWORD k = 0; k < hSkill->GetStateEffectCount(); k++ )
{
CDnSkill::StateEffectStruct *pLocalStruct = hSkill->GetStateEffectFromIndex(k);
DnActorHandle hApplyActor;
// »óÅ ȿ°ú Àû¿ë Ÿ°Ù ŸÀÔ¿¡ µû¶ó Àû¿ëµÉ ¾×Å͸¦ °áÁ¤ÇÑ´Ù.
switch( pLocalStruct->ApplyType )
{
case CDnSkill::ApplySelf: // ÀÚ½ÅÇÑÅ×
hApplyActor = m_pActor->GetActorHandle();
break;
case CDnSkill::ApplyTarget: // Ÿ°ÙÇÑÅ×
hApplyActor = hHitter;
break;
case CDnSkill::ApplyEnemy: // ÀûÇÑÅ×.. (°°Àº ÆíÀÌ ¾Æ´Ï¸é ³ª¸¦ ¶§¸° ³ðÀÌ ÀûÀÌ´Ù..)
if( m_pActor->GetTeam() == hHitter->GetTeam() )
continue;
else
hApplyActor = hHitter;
break;
case CDnSkill::ApplyFriend: // °°Àº Æí.. (°°Àº ÆíÀÌ¸é ³ª¸¦ ¶§¸° ³ðÀÌ °°Àº Æí..?)
if( m_pActor->GetTeam() != hHitter->GetTeam() )
continue;
else
hApplyActor = hHitter;
break;
}
// »óÅÂÈ¿°úÁß Áö¼Ó ½Ã°£ÀÌ 0À̰í Àڽſ¡°Ô °Å´Â »óÅ ȿ°ú´Â
// ½ºÅ³ÀÇ m_vlApplyNoPacketStateEffectList¿¡ ´ã¾Æ ³õ°í ½ºÅ³ ³¡³¯¶§
// Áö¿ö Áöµµ·Ï ÇÑ´Ù...[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();
}
//»ç¿ëµÈ ¹æ¾î ½ºÅ³Àº ¸®½ºÆ®¿¡ ´ã¾Æ ³õ´Â´Ù..
m_listProcessPreFixDefenceSkills.push_back(hSkill);
}
OutputDebug("Á¢µÎ¾î ¹æ¾î¿ë ½ºÅ³ ³¡ -----------------------------!!\n");
}
void MASkillUser::ProcessPrefixOffenceSkill(float fHitDamageProb)
{
//Á¢µÎ¾î ½Ã½ºÅÛ ¹æ¾î¿ë ½ºÅ³ µî·ÏµÇ µÇ¾î ÀÖÁö ¾Ê´Ù¸é
if (m_prefixSystemOffenceSkills.empty())
return;
//Á¢µÎ¾î ½Ã½ºÅÛ °ø°Ý¿ë ½ºÅ³Áß ¼±ÅÃ..
RefreshPrefixOffenceSkills(fHitDamageProb);
// ÃÖÁ¾ ¸®½ºÆ®¿¡ ´ã±ä ½ºÅ³Áß¿¡¼­ ¿ì¼±¼øÀ§°¡ °¡Àå ³ôÀº ¸®½ºÆ®¿¡ ÀúÀåµÈ ½ºÅ³¸¸ »ç¿ëÇÑ´Ù.
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 ÄðŸÀÓ ½ÃÀÛ?
hSkill->OnBeginCoolTime();
m_PrefixSkillCoolTimeManager.AddCoolTime(hSkill);
int nStateEffectCount = hSkill->GetStateEffectCount();
// ÇØ´ç ½ºÅ³ÀÇ »óÅ ȿ°úº° Àû¿ë ¾×Å͸¦ °áÁ¤Çؼ­ Áߺ¹ ó¸® È®ÀÎÇϰí,
// ¾×Åͺ°·Î »óÅ ȿ°ú Àû¿ëÀ» ÇØ¾ß ÇÒµí Çѵ¥...
for( DWORD k = 0; k < hSkill->GetStateEffectCount(); k++ )
{
CDnSkill::StateEffectStruct *pLocalStruct = hSkill->GetStateEffectFromIndex(k);
DnActorHandle hApplyActor;
// »óÅ ȿ°ú Àû¿ë Ÿ°Ù ŸÀÔ¿¡ µû¶ó Àû¿ëµÉ ¾×Å͸¦ °áÁ¤ÇÑ´Ù.
switch( pLocalStruct->ApplyType )
{
case CDnSkill::ApplySelf: // ÀÚ½ÅÇÑÅ×
hApplyActor = m_pActor->GetActorHandle();
break;
case CDnSkill::ApplyTarget: // Ÿ°ÙÇÑÅ×
continue;
case CDnSkill::ApplyEnemy: // ÀûÇÑÅ×.. (°°Àº ÆíÀÌ ¾Æ´Ï¸é ³ª¸¦ ¶§¸° ³ðÀÌ ÀûÀÌ´Ù..)
continue;
break;
case CDnSkill::ApplyFriend: // °°Àº Æí.. (°°Àº ÆíÀÌ¸é ³ª¸¦ ¶§¸° ³ðÀÌ °°Àº Æí..?)
continue;
break;
}
// »óÅÂÈ¿°úÁß Áö¼Ó ½Ã°£ÀÌ 0À̰í Àڽſ¡°Ô °Å´Â »óÅ ȿ°ú´Â
// ½ºÅ³ÀÇ m_vlApplyNoPacketStateEffectList¿¡ ´ã¾Æ ³õ°í ½ºÅ³ ³¡³¯¶§
// Áö¿ö Áöµµ·Ï ÇÑ´Ù...[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();
}
//»ç¿ëµÈ ¹æ¾î ½ºÅ³Àº ¸®½ºÆ®¿¡ ´ã¾Æ ³õ´Â´Ù..
m_listProcessPreFixOffenceSkills.push_back(hSkill);
}
}
void MASkillUser::ApplyPrefixOffenceSkillToTarget(DnActorHandle hTarget)
{
// ÃÖÁ¾ ¸®½ºÆ®¿¡ ´ã±ä ½ºÅ³Áß¿¡¼­ ¿ì¼±¼øÀ§°¡ °¡Àå ³ôÀº ¸®½ºÆ®¿¡ ÀúÀåµÈ ½ºÅ³¸¸ »ç¿ëÇÑ´Ù.
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();
// ÇØ´ç ½ºÅ³ÀÇ »óÅ ȿ°úº° Àû¿ë ¾×Å͸¦ °áÁ¤Çؼ­ Áߺ¹ ó¸® È®ÀÎÇϰí,
// ¾×Åͺ°·Î »óÅ ȿ°ú Àû¿ëÀ» ÇØ¾ß ÇÒµí Çѵ¥...
for( DWORD k = 0; k < hSkill->GetStateEffectCount(); k++ )
{
CDnSkill::StateEffectStruct *pLocalStruct = hSkill->GetStateEffectFromIndex(k);
DnActorHandle hApplyActor;
// »óÅ ȿ°ú Àû¿ë Ÿ°Ù ŸÀÔ¿¡ µû¶ó Àû¿ëµÉ ¾×Å͸¦ °áÁ¤ÇÑ´Ù.
switch( pLocalStruct->ApplyType )
{
case CDnSkill::ApplySelf: // ÀÚ½ÅÇÑÅ×
continue;
case CDnSkill::ApplyTarget: // Ÿ°ÙÇÑÅ×
hApplyActor = hTarget;
break;
case CDnSkill::ApplyEnemy: // ÀûÇÑÅ×.. (°°Àº ÆíÀÌ ¾Æ´Ï¸é ³ª¸¦ ¶§¸° ³ðÀÌ ÀûÀÌ´Ù..)
if( m_pActor->GetTeam() == hTarget->GetTeam() )
continue;
else
hApplyActor = hTarget;
break;
case CDnSkill::ApplyFriend: // °°Àº Æí.. (°°Àº ÆíÀÌ¸é ³ª¸¦ ¶§¸° ³ðÀÌ °°Àº Æí..?)
if( m_pActor->GetTeam() != hTarget->GetTeam() )
continue;
else
hApplyActor = hTarget;
break;
}
// »óÅÂÈ¿°úÁß Áö¼Ó ½Ã°£ÀÌ 0À̰í Àڽſ¡°Ô °Å´Â »óÅ ȿ°ú´Â
// ½ºÅ³ÀÇ m_vlApplyNoPacketStateEffectList¿¡ ´ã¾Æ ³õ°í ½ºÅ³ ³¡³¯¶§
// Áö¿ö Áöµµ·Ï ÇÑ´Ù...[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)
{
//Èĺ¸ ½ºÅ³ ¸®½ºÆ® ÃʱâÈ­
candidateSkills.clear();
PREFIX_SYSTEM_SKILL_COLLECTION::iterator iter = sameSkillList.begin();
PREFIX_SYSTEM_SKILL_COLLECTION::iterator endIter = sameSkillList.end();
for (; iter != endIter; ++iter)
{
//°°Àº ½ºÅ³ID¸¦ °¡Áø ½ºÅ³µé È®·üÀ» ÇÕ»êÇÑ´Ù.
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;
// ÇØ´ç ½ºÅ³
if (!hSelectedSkill)
{
hSelectedSkill = skillIter->hSkill;
nSlotIndex = skillIter->slotIndex;
}
else
{
if (hSelectedSkill->GetLevel() < skillIter->hSkill->GetLevel())
{
hSelectedSkill = skillIter->hSkill;
nSlotIndex = skillIter->slotIndex;
}
}
}
}
// ¼±ÅÃµÈ ½ºÅ³ÀÌ ÀÖÀ¸¸é ÃÖÁ¾ ½ºÅ³ Èĺ¸ ¸®½ºÆ®¿¡ Ãß°¡ÇÑ´Ù.
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("°°Àº ½ºÅ³(%d) ÇÕ»ê ÃÖÁ¾ È®·ü (%f) ½½·Ô Index(%d)·Î °áÁ¤µÊ!!!!!\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; //½½·Ô À妽º
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())
{
//ÀÌ¹Ì °°Àº ½ºÅ³ID¸¦ °¡Áø ½ºÅ³ÀÌ ¸®½ºÆ®¿¡ ÀÖ´Ù¸é
skillInfo.slotIndex = nSlotIndex;
findIter->second.push_back(skillInfo);
}
else
{
//¾ÆÁ÷ ½ºÅ³ µî·ÏÀÌ µÇ¾î ÀÖÁö ¾Ê´Ù¸é ¸®½ºÆ®¸¦ ¸¸µé¾î µî·Ï..
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();
//´ëÇ¥ ½ºÅ³ ¸®½ºÆ®¸¦ ¼øÈ¸ Çϸ鼭 ¿ì¼± ¼øÀ§º°·Î ±×·ìÇÎÀ» ÇÑ´Ù.
for (; iter != endIter; ++iter)
{
int nPriority = 0;
PREFIX_SYSTEM_SKILLINFO skillInfo = iter->second;
if (!skillInfo.hSkill)
continue;
nPriority = skillInfo.hSkill->GetPrefixSystemPriority();
//½ºÅ³ ÄðŸÀÓ È®ÀÎ...
//if (skillInfo.hSkill->GetCoolTime() > 0.0f && skillInfo.hSkill->GetElapsedDelayTime() > 0.0f)
if (m_PrefixSkillCoolTimeManager.IsCoolTime(skillInfo.hSkill->GetClassID()))
{
OutputDebug("½ºÅ³(%d) ÄðŸÀÓ Áß.........!!!!\n", skillInfo.hSkill->GetClassID());
continue;
}
//È®·ü°è»ê ÇØ¼­ Åë°úµÈ ½ºÅ³¸¸ ¸®½ºÆ®¿¡ Ãß°¡ÇÑ´Ù...
bool bExecuteable = rand() % 10000 <= (iter->second.fRatio * fHitDamageProb);
if (!bExecuteable)
{
OutputDebug("½ºÅ³(%d) È®·ü¿¡¼­ °É·¯Áü...!!!!\n", skillInfo.hSkill->GetClassID());
continue;
}
OutputDebug("¿ì¼±¼øÀ§ (%d)¿¡ ½ºÅ³(%d) µî·ÏµÊ!!!!\n", nPriority, skillInfo.hSkill->GetClassID());
PREFIX_SYSTEM_SKILL_COLLECTION::iterator findIter = prefixSystemSkills.find(nPriority);
if (findIter != prefixSystemSkills.end())
{
//ÀÌ¹Ì ¿ì¼±¼øÀ§ Á¤º¸°¡ µî·Ï µÇ¾î ÀÖ´Ù¸é
//¿ì¼±¼øÀ§ ¸®½ºÆ®¿¡ ½ºÅ³ Á¤º¸¸¦ Ãß°¡ÇÑ´Ù.
findIter->second.push_back(skillInfo);
}
else
{
//¾ÆÁ÷ ¿ì¼±¼øÀ§°¡ µî·ÏÀÌ µÇ¾î ÀÖÁö ¾Ê´Ù¸é..
//½ºÅ³ ÀúÀåÇÒ ¸®½ºÆ® ¸¸µé°í
//½ºÅ³ Á¤º¸ ¼³Á¤ ÇØ¼­ ¸®½ºÆ®¿¡ Ãß°¡ÇÑ´Ù.
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;
//½ºÅ³ ID / ·¹º§¾÷ °ªÀÌ Á¤»óÀ̶ó¸é
if (skillLevelUpInfo.nSkillID != 0 && skillLevelUpInfo.nLevelUp != 0)
{
//½ºÅ³ ·¹º§¾÷ Á¤º¸ ¸®½ºÆ®¿¡¼­ °°Àº ½ºÅ³ ¾ÆÀ̵𸦠ã´Â´Ù.
std::map<int, int>::iterator findIter = m_SkillLevelUpInfo.find(skillLevelUpInfo.nSkillID);
if (findIter != m_SkillLevelUpInfo.end())
{
// ±âÁ¸ ·¹º§¾÷ °ªÀÌ ´õ Å©´Ù¸é °Ç³Ê¶Ü.
if (findIter->second > skillLevelUpInfo.nLevelUp)
continue;
// ±âÁ¸ ·¹º§¾÷ °ªÀÌ Å©Áö ¾ÊÀ¸¸é ¸®½ºÆ®¿¡¼­ Á¦°Å ÇÑ´Ù..
m_SkillLevelUpInfo.erase(findIter);
}
// »õ·Î¿î ½ºÅ³ ·¹º§¾÷ Á¤º¸¸¦ ÀúÀåÇÑ´Ù.
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));
//½ºÅ³ ·¹º§¾÷ Á¤º¸ °»½Å..
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())
{
//Áö¿öÁú ·¹º§¾÷ ¾ÆÀÌÅÛ¿¡ Àû¿ëµÈ ½ºÅ³ ID¸¦ ¹Þ¾Æ ³õ´Â´Ù.
int nSkillID = findIter->second.nSkillID;
DnSkillHandle hSkill = FindSkill(nSkillID);
if( hSkill )
{
if (hSkill->GetElapsedDelayTime() > 0.0f || hSkill->IsToggleOn())
return;
}
//·¹º§¾÷ Á¤º¸¸¦ ¸®½ºÆ®¿¡¼­ Áö¿ì°í
m_SkillLevelUpInfoList.erase(findIter);
//·¹º§¾÷ Á¤º¸ °»½Å
UpdateSkillLevelUpInfo();
//·¹º§¾÷ Á¤º¸°¡ ¾ø¾îÁö¹Ç·Î
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½Ã¾ÆÀÌÅÛÀÇ ·¹º§¾÷ Á¦ÇÑ °ªÀº 1
if (nLevelUpValueByCashItem > 1)
nLevelUpValueByCashItem = 1;
//·¹º§¾÷ ¾ÆÀÌÅÛÀº Áߺ¹ µÇÁö ¾Ê°í, ¼öÂ÷°¡ ³ôÀº °ªÀ» Àû¿ë Çϵµ·Ï ÇÑ´Ù.
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)
{
//±âÁ¸ ½ºÅ³À» ã¾Æ¼­ ½ºÅ³ÀÌ ÀÖ°í, ÃʱâÈ­ µÈ ½ºÅ³ÀÌ ¾Æ´Ï¸é ·¹º§¾÷ ½ÃŲ´Ù.
DnSkillHandle hSkill = FindSkill(nSkillID);
if (!hSkill)
return;
int nCurentSkillLevel = hSkill->GetLevel();
int nCurLevlUpValue = hSkill->GetLevelUpValue();
bool bChangeLevel = true;
if (nCurentSkillLevel == 0)
bChangeLevel = false;
//»õ·Î ·¹º§¾÷ ÇÒ ¼öÄ¡¿Í ÇöÀç ·¹º§¾÷ÀÌ Àû¿ëµÈ ¼öÄ¡°¡ °°À¸¸é ½ºÅ³À» º¯°æÇÒ Çʿ䰡 ¾øÀ½.
if (nCurLevlUpValue == nLevelUp)
bChangeLevel = false;
if (bChangeLevel)
{
//SetSkillLevel³»ºÎ AddSkill¿¡¼­ ¿ø·¡ ·¹º§¿¡ Áö±ÝÀÇ Áõ°¡Ä¡°¡ °è»êµÇ¾î ½ºÅ³ÀÌ »ý¼ºµÊ..
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));
//½ºÅ³ ·¹º§¾÷ Á¤º¸ °»½Å..
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;
//½ºÅ³ ID / ·¹º§¾÷ °ªÀÌ Á¤»óÀ̶ó¸é
if (skillLevelUpInfo.nSkillID != 0 && skillLevelUpInfo.nLevelUp != 0)
{
//½ºÅ³ ·¹º§¾÷ Á¤º¸ ¸®½ºÆ®¿¡¼­ °°Àº ½ºÅ³ ¾ÆÀ̵𸦠ã´Â´Ù.
std::map<int, int>::iterator findIter = m_CashSkillLevelUpInfo.find(skillLevelUpInfo.nSkillID);
if (findIter != m_CashSkillLevelUpInfo.end())
{
// ±âÁ¸ ·¹º§¾÷ °ªÀÌ ´õ Å©´Ù¸é °Ç³Ê¶Ü.
if (findIter->second > skillLevelUpInfo.nLevelUp)
continue;
// ±âÁ¸ ·¹º§¾÷ °ªÀÌ Å©Áö ¾ÊÀ¸¸é ¸®½ºÆ®¿¡¼­ Á¦°Å ÇÑ´Ù..
m_CashSkillLevelUpInfo.erase(findIter);
}
// »õ·Î¿î ½ºÅ³ ·¹º§¾÷ Á¤º¸¸¦ ÀúÀåÇÑ´Ù.
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())
{
//Áö¿öÁú ·¹º§¾÷ ¾ÆÀÌÅÛ¿¡ Àû¿ëµÈ ½ºÅ³ ID¸¦ ¹Þ¾Æ ³õ´Â´Ù.
int nSkillID = findIter->second.nSkillID;
//·¹º§¾÷ Á¤º¸¸¦ ¸®½ºÆ®¿¡¼­ Áö¿ì°í
m_CashSkillLevelUpInfoList.erase(findIter);
//·¹º§¾÷ Á¤º¸ °»½Å
UpdateSkillLevelUpInfoByCashItem();
//·¹º§¾÷ Á¤º¸°¡ ¾ø¾îÁö¹Ç·Î
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;
//ÀÌ ½ºÅ³ÀÇ Á¢µÎ»ç ½ºÅ³ ŸÀÔ(Çà¿î/ÆÄ±«....)
int nPrefixSkillType = hSkill->GetPrefixSkillType();
PREFIX_SKILL_INFO::iterator findIter = m_PrefixDefenceSkills.find(nPrefixSkillType);
//±âÁ¸ Ä«Å×°í¸®°¡ ÀÖ´Ù¸é
if (findIter != m_PrefixDefenceSkills.end())
{
//±âÁ¸ Á¢µÎ»ç ½ºÅ³ °ü¸® °´Ã¼¿¡ ½ºÅ³À» Ãß°¡ Çϰí, Á¤º¸¸¦ °»½ÅÇÑ´Ù.
findIter->second->AddSkill(hSkill);
}
else
{
//¾ÆÁ÷ µî·ÏµÈ Á¢µÎ»ç ½ºÅ³ÀÌ ¾ø´Ù¸é »õ·Î ¸¸µé¾î¼­ µî·Ï ÇÑ´Ù.
CDnPrefixSkill* pPrefixSkill = new CDnPrefixSkill(nPrefixSkillType);
pPrefixSkill->AddSkill(hSkill);
m_PrefixDefenceSkills.insert(make_pair(nPrefixSkillType, pPrefixSkill));
}
}
void MASkillUser::RemovePrefixDefenceSkill(DnSkillHandle hSkill)
{
//ÀÌ ½ºÅ³ÀÇ Á¢µÎ»ç ½ºÅ³ ŸÀÔ(Çà¿î/ÆÄ±«....)
int nPrefixSkillType = hSkill->GetPrefixSkillType();
PREFIX_SKILL_INFO::iterator findIter = m_PrefixDefenceSkills.find(nPrefixSkillType);
//±âÁ¸ Ä«Å×°í¸®°¡ ÀÖ´Ù¸é
if (findIter != m_PrefixDefenceSkills.end())
{
//±âÁ¸ Á¢µÎ»ç ½ºÅ³ °ü¸® °´Ã¼¿¡¼­ ½ºÅ³À» Á¦°Å ÇÑ´Ù.
findIter->second->RemoveSkill(hSkill);
//µî·ÏµÈ ½ºÅ³ÀÌ ¾øÀ¸¸é ¸®½ºÆ®¿¡¼­ Á¦°Å ÇÑ´Ù.
if (findIter->second->GetSkillCount() == 0)
{
SAFE_DELETE(findIter->second);
m_PrefixDefenceSkills.erase(findIter);
}
}
}
void MASkillUser::ProcessPrefixDefenceSkill_New(DnActorHandle hHitter)
{
//Á¢µÎ¾î ½Ã½ºÅÛ ¹æ¾î¿ë ½ºÅ³ µî·ÏµÇ µÇ¾î ÀÖÁö ¾Ê´Ù¸é
if (m_PrefixDefenceSkills.empty())
return;
OutputDebug("Á¢µÎ¾î ¹æ¾î¿ë ½ºÅ³ ½ÃÀÛ-----------------------------!!\n");
//Á¢µÎ»ç ½ºÅ³ ¹ßµ¿ È®·ü °è»ê..
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;
//Á¢µÎ»ç ½ºÅ³ÀÌ ÄðŸÀÓ ÁßÀÎÁö È®ÀÎÇÑ´Ù..
if (m_PrefixSkillCoolTimeManager.IsCoolTime(pPrefixSkill->GetSkillType()))
{
OutputDebug("Á¢µÎ»ç ¹æ¾î ½ºÅ³(%d) ÄðŸÀÓ Áß!!!!!!!!!!\n", pPrefixSkill->GetSkillType());
continue;
}
//Á¢µÎ»ç ½ºÅ³ ¹ßµ¿ È®·ü È®ÀÎ.
bool bExecuteable = rand() % 10000 <= pPrefixSkill->GetProbability();
if (!bExecuteable)
{
OutputDebug("Á¢µÎ»ç ¹æ¾î ½ºÅ³(%d) È®·ü¿¡¼­ °É·¯Áü...!!!!\n", pPrefixSkill->GetSkillType());
continue;
}
//´ëÇ¥ ½ºÅ³
DnSkillHandle hSkill = pPrefixSkill->GetSkillHandle();
if (!hSkill)
continue;
hSkill->OnBeginCoolTime();
//Skill ÄðŸÀÓ ½ÃÀÛ?
m_PrefixSkillCoolTimeManager.AddCoolTime(pPrefixSkill);
int nStateEffectCount = pPrefixSkill->GetStateEffectCount();
// ÇØ´ç ½ºÅ³ÀÇ »óÅ ȿ°úº° Àû¿ë ¾×Å͸¦ °áÁ¤Çؼ­ Áߺ¹ ó¸® È®ÀÎÇϰí,
// ¾×Åͺ°·Î »óÅ ȿ°ú Àû¿ëÀ» ÇØ¾ß ÇÒµí Çѵ¥...
for( int k = 0; k < pPrefixSkill->GetStateEffectCount(); k++ )
{
CDnSkill::StateEffectStruct *pLocalStruct = pPrefixSkill->GetStateEffectFromIndex(k);
DnActorHandle hApplyActor;
// »óÅ ȿ°ú Àû¿ë Ÿ°Ù ŸÀÔ¿¡ µû¶ó Àû¿ëµÉ ¾×Å͸¦ °áÁ¤ÇÑ´Ù.
switch( pLocalStruct->ApplyType )
{
case CDnSkill::ApplySelf: // ÀÚ½ÅÇÑÅ×
hApplyActor = m_pActor->GetActorHandle();
break;
case CDnSkill::ApplyTarget: // Ÿ°ÙÇÑÅ×
hApplyActor = hHitter;
break;
case CDnSkill::ApplyEnemy: // ÀûÇÑÅ×.. (°°Àº ÆíÀÌ ¾Æ´Ï¸é ³ª¸¦ ¶§¸° ³ðÀÌ ÀûÀÌ´Ù..)
if( m_pActor->GetTeam() == hHitter->GetTeam() )
continue;
else
hApplyActor = hHitter;
break;
case CDnSkill::ApplyFriend: // °°Àº Æí.. (°°Àº ÆíÀÌ¸é ³ª¸¦ ¶§¸° ³ðÀÌ °°Àº Æí..?)
if( m_pActor->GetTeam() != hHitter->GetTeam() )
continue;
else
hApplyActor = hHitter;
break;
}
// »óÅÂÈ¿°úÁß Áö¼Ó ½Ã°£ÀÌ 0À̰í Àڽſ¡°Ô °Å´Â »óÅ ȿ°ú´Â
// ½ºÅ³ÀÇ m_vlApplyNoPacketStateEffectList¿¡ ´ã¾Æ ³õ°í ½ºÅ³ ³¡³¯¶§
// Áö¿ö Áöµµ·Ï ÇÑ´Ù...[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("Á¢µÎ»ç ¹æ¾î ½ºÅ³(%d) »óÅÂÈ¿°ú (%d)-(%s)\n", pPrefixSkill->GetSkillType(), pLocalStruct->nID, pLocalStruct->szValue.c_str());
if (isSelfPermentStateEffect)
hSkill->AddPrefixBlow(hApplyActor, nBlowID);
}
hApplyActor->InitStateBlowIDToRemove();
}
//»ç¿ëµÈ ¹æ¾î ½ºÅ³Àº ¸®½ºÆ®¿¡ ´ã¾Æ ³õ´Â´Ù..
m_listProcessPreFixDefenceSkills.push_back(hSkill);
}
OutputDebug("Á¢µÎ¾î ¹æ¾î¿ë ½ºÅ³ ³¡ -----------------------------!!\n");
}
void MASkillUser::AddPrefixOffenceSkill(DnSkillHandle hSkill)
{
if (!hSkill)
return;
//ÀÌ ½ºÅ³ÀÇ Á¢µÎ»ç ½ºÅ³ ŸÀÔ(Çà¿î/ÆÄ±«....)
int nPrefixSkillType = hSkill->GetPrefixSkillType();
PREFIX_SKILL_INFO::iterator findIter = m_PrefixOffenceSkills.find(nPrefixSkillType);
//±âÁ¸ Ä«Å×°í¸®°¡ ÀÖ´Ù¸é
if (findIter != m_PrefixOffenceSkills.end())
{
//±âÁ¸ Á¢µÎ»ç ½ºÅ³ °ü¸® °´Ã¼¿¡ ½ºÅ³À» Ãß°¡ Çϰí, Á¤º¸¸¦ °»½ÅÇÑ´Ù.
findIter->second->AddSkill(hSkill);
}
else
{
//¾ÆÁ÷ µî·ÏµÈ Á¢µÎ»ç ½ºÅ³ÀÌ ¾ø´Ù¸é »õ·Î ¸¸µé¾î¼­ µî·Ï ÇÑ´Ù.
CDnPrefixSkill* pPrefixSkill = new CDnPrefixSkill(nPrefixSkillType);
pPrefixSkill->AddSkill(hSkill);
m_PrefixOffenceSkills.insert(make_pair(nPrefixSkillType, pPrefixSkill));
}
}
void MASkillUser::RemovePrefixOffenceSkill(DnSkillHandle hSkill)
{
//ÀÌ ½ºÅ³ÀÇ Á¢µÎ»ç ½ºÅ³ ŸÀÔ(Çà¿î/ÆÄ±«....)
int nPrefixSkillType = hSkill->GetPrefixSkillType();
PREFIX_SKILL_INFO::iterator findIter = m_PrefixOffenceSkills.find(nPrefixSkillType);
//±âÁ¸ Ä«Å×°í¸®°¡ ÀÖ´Ù¸é
if (findIter != m_PrefixOffenceSkills.end())
{
//±âÁ¸ Á¢µÎ»ç ½ºÅ³ °ü¸® °´Ã¼¿¡¼­ ½ºÅ³À» Á¦°Å ÇÑ´Ù.
findIter->second->RemoveSkill(hSkill);
//µî·ÏµÈ ½ºÅ³ÀÌ ¾øÀ¸¸é ¸®½ºÆ®¿¡¼­ Á¦°Å ÇÑ´Ù.
if (findIter->second->GetSkillCount() == 0)
{
RemoveProcessPrefixOffenceSkill(findIter->second);
SAFE_DELETE(findIter->second);
m_PrefixOffenceSkills.erase(findIter);
}
}
}
//´ýÇÁ °ü·ÃÇØ¼­(ÇÑ ÇÁ·¹ÀÓ¿¡¼­ µ¿ÀÛÇØ¼­ ÀÌ·²ÀÏÀº ¾øÀ»µí Çѵ¥..) °ø°Ý¿ë Á¢¹Ì»ç ½ºÅ³ÀÌ Á¦°Å µÉ¶§
//½ÇÇàµÇ°í ÀÖ´Â Á¢¹Ì»ç ½ºÅ³ ¸®½ºÆ®¿¡ °°Àº ½ºÅ³ÀÌ ÀÖÀ¸¸é Á¦°Å Çϵµ·ÏÇÑ´Ù.
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()
{
//Á¢µÎ¾î ½Ã½ºÅÛ ¹æ¾î¿ë ½ºÅ³ µî·ÏµÇ µÇ¾î ÀÖÁö ¾Ê´Ù¸é
if (m_PrefixOffenceSkills.empty())
return;
//Á¢µÎ»ç ½ºÅ³ ¹ßµ¿ Àü¿¡ ¸®½ºÆ®¸¦ ºñ¿î´Ù.
m_ProcessPrefixOffenceSkills.clear();
//Á¢µÎ»ç ½ºÅ³ ¹ßµ¿ È®·ü °è»ê..
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;
//Á¢µÎ»ç ½ºÅ³ÀÌ ÄðŸÀÓ ÁßÀÎÁö È®ÀÎÇÑ´Ù..(¹«±â/¹æ¾î±¸ ±¸ºÐÀÌ µÈ´Ù??)
if (m_PrefixSkillCoolTimeManager.IsCoolTime(pPrefixSkill->GetSkillType()))
{
OutputDebug("Á¢µÎ»ç °ø°Ý ½ºÅ³(%d) ÄðŸÀÓ Áß!!!!!!!!!!\n", pPrefixSkill->GetSkillType());
continue;
}
//Á¢µÎ»ç ½ºÅ³ ¹ßµ¿ È®·ü È®ÀÎ.
bool bExecuteable = rand() % 10000 <= pPrefixSkill->GetProbability();
if (!bExecuteable)
{
OutputDebug("Á¢µÎ»ç °ø°Ý ½ºÅ³(%d) È®·ü¿¡¼­ °É·¯Áü...!!!!\n", pPrefixSkill->GetSkillType());
continue;
}
//´ëÇ¥ ½ºÅ³
DnSkillHandle hSkill = pPrefixSkill->GetSkillHandle();
if (!hSkill)
continue;
//Skill ÄðŸÀÓ ½ÃÀÛ?
hSkill->OnBeginCoolTime();
m_PrefixSkillCoolTimeManager.AddCoolTime(pPrefixSkill);
int nStateEffectCount = pPrefixSkill->GetStateEffectCount();
// ÇØ´ç ½ºÅ³ÀÇ »óÅ ȿ°úº° Àû¿ë ¾×Å͸¦ °áÁ¤Çؼ­ Áߺ¹ ó¸® È®ÀÎÇϰí,
// ¾×Åͺ°·Î »óÅ ȿ°ú Àû¿ëÀ» ÇØ¾ß ÇÒµí Çѵ¥...
for( int k = 0; k < pPrefixSkill->GetStateEffectCount(); k++ )
{
CDnSkill::StateEffectStruct *pLocalStruct = pPrefixSkill->GetStateEffectFromIndex(k);
DnActorHandle hApplyActor;
// »óÅ ȿ°ú Àû¿ë Ÿ°Ù ŸÀÔ¿¡ µû¶ó Àû¿ëµÉ ¾×Å͸¦ °áÁ¤ÇÑ´Ù.
switch( pLocalStruct->ApplyType )
{
case CDnSkill::ApplySelf: // ÀÚ½ÅÇÑÅ×
hApplyActor = m_pActor->GetActorHandle();
break;
case CDnSkill::ApplyTarget: // Ÿ°ÙÇÑÅ×
continue;
case CDnSkill::ApplyEnemy: // ÀûÇÑÅ×.. (°°Àº ÆíÀÌ ¾Æ´Ï¸é ³ª¸¦ ¶§¸° ³ðÀÌ ÀûÀÌ´Ù..)
continue;
break;
case CDnSkill::ApplyFriend: // °°Àº Æí.. (°°Àº ÆíÀÌ¸é ³ª¸¦ ¶§¸° ³ðÀÌ °°Àº Æí..?)
continue;
break;
}
// »óÅÂÈ¿°úÁß Áö¼Ó ½Ã°£ÀÌ 0À̰í Àڽſ¡°Ô °Å´Â »óÅ ȿ°ú´Â
// ½ºÅ³ÀÇ m_vlApplyNoPacketStateEffectList¿¡ ´ã¾Æ ³õ°í ½ºÅ³ ³¡³¯¶§
// Áö¿ö Áöµµ·Ï ÇÑ´Ù...[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("Á¢µÎ»ç °ø°Ý ½ºÅ³(%d) »óÅÂÈ¿°ú ÀÚ½ÅÇÑÅ× Àû¿ë (%d)-(%s)\n", pPrefixSkill->GetSkillType(), pLocalStruct->nID, pLocalStruct->szValue.c_str());
if (isSelfPermentStateEffect)
hSkill->AddPrefixBlow(hApplyActor, nBlowID);
}
hApplyActor->InitStateBlowIDToRemove();
}
//»ç¿ëµÈ ¹æ¾î ½ºÅ³Àº ¸®½ºÆ®¿¡ ´ã¾Æ ³õ´Â´Ù..
m_listProcessPreFixOffenceSkills.push_back(hSkill);
//Áö±Ý ¹ßµ¿µÈ °ø°Ý¿ë Á¢µÎ»ç ½ºÅ³À» ´ã¾Æ ³õ´Â´Ù.
m_ProcessPrefixOffenceSkills.push_back(pPrefixSkill);
}
}
void MASkillUser::ApplyPrefixOffenceSkillToTarget_New(DnActorHandle hTarget)
{
// ÃÖÁ¾ ¸®½ºÆ®¿¡ ´ã±ä ½ºÅ³Áß¿¡¼­ ¿ì¼±¼øÀ§°¡ °¡Àå ³ôÀº ¸®½ºÆ®¿¡ ÀúÀåµÈ ½ºÅ³¸¸ »ç¿ëÇÑ´Ù.
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();
// ÇØ´ç ½ºÅ³ÀÇ »óÅ ȿ°úº° Àû¿ë ¾×Å͸¦ °áÁ¤Çؼ­ Áߺ¹ ó¸® È®ÀÎÇϰí,
// ¾×Åͺ°·Î »óÅ ȿ°ú Àû¿ëÀ» ÇØ¾ß ÇÒµí Çѵ¥...
for( int k = 0; k < pPrefixSkill->GetStateEffectCount(); k++ )
{
CDnSkill::StateEffectStruct *pLocalStruct = pPrefixSkill->GetStateEffectFromIndex(k);
DnActorHandle hApplyActor;
// »óÅ ȿ°ú Àû¿ë Ÿ°Ù ŸÀÔ¿¡ µû¶ó Àû¿ëµÉ ¾×Å͸¦ °áÁ¤ÇÑ´Ù.
switch( pLocalStruct->ApplyType )
{
case CDnSkill::ApplySelf: // ÀÚ½ÅÇÑÅ×
continue;
case CDnSkill::ApplyTarget: // Ÿ°ÙÇÑÅ×
hApplyActor = hTarget;
break;
case CDnSkill::ApplyEnemy: // ÀûÇÑÅ×.. (°°Àº ÆíÀÌ ¾Æ´Ï¸é ³ª¸¦ ¶§¸° ³ðÀÌ ÀûÀÌ´Ù..)
if( m_pActor->GetTeam() == hTarget->GetTeam() )
continue;
else
hApplyActor = hTarget;
break;
case CDnSkill::ApplyFriend: // °°Àº Æí.. (°°Àº ÆíÀÌ¸é ³ª¸¦ ¶§¸° ³ðÀÌ °°Àº Æí..?)
if( m_pActor->GetTeam() != hTarget->GetTeam() )
continue;
else
hApplyActor = hTarget;
break;
}
// »óÅÂÈ¿°úÁß Áö¼Ó ½Ã°£ÀÌ 0À̰í Àڽſ¡°Ô °Å´Â »óÅ ȿ°ú´Â
// ½ºÅ³ÀÇ m_vlApplyNoPacketStateEffectList¿¡ ´ã¾Æ ³õ°í ½ºÅ³ ³¡³¯¶§
// Áö¿ö Áöµµ·Ï ÇÑ´Ù...[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("Á¢µÎ»ç °ø°Ý ½ºÅ³(%d) »óÅÂÈ¿°ú »ó´ë¿¡ Àû¿ë (%d)-(%s)\n", pPrefixSkill->GetSkillType(), pLocalStruct->nID, pLocalStruct->szValue.c_str());
if (isSelfPermentStateEffect)
hSkill->AddPrefixBlow(hApplyActor, nBlowID);
}
hApplyActor->InitStateBlowIDToRemove();
}
}
//´ýÇÁ °ü·Ã ÀÇ½É ÄÚµå Á¤¸®
//Àû¿ëÇÏ°í ¸®½ºÆ®¸¦ ºñ¿î´Ù..
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)
{
//ÀÌ¹Ì ½ºÅ³ µî·ÏµÇ¾î ÀÖÀ½..
if (findIter != m_ToggleOnSkillList.end())
return;
m_ToggleOnSkillList.insert(std::make_pair(skillID, hSkill));
}
else
{
//µî·ÏµÈ ½ºÅ³ÀÌ ¾ø´Ù¸é
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