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

4904 lines
No EOL
154 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

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

#include "StdAfx.h"
#include "DnSkill.h"
#include "DnTableDB.h"
#include "DnItemTask.h"
#include "IDnSkillUsableChecker.h"
#include "IDnSkillProcessor.h"
#include "DnDivideSEArgumentByTargets.h"
#include "DnPlayerActor.h"
#include "DnBlow.h"
#include "TaskManager.h"
#include "DnPartyTask.h"
#include "DNUserSession.h"
#include "DnPlayAniProcess.h"
#include "DnPartialPlayProcessor.h"
#include "DnApplySEWhenActionSetBlowEnabledProcessor.h"
#include "DnChangeActionStrProcessor.h"
#include "DnChangeActionStrByBubbleProcessor.h"
#include "DnStateEffectApplyOnOffByBubbleProcessor.h"
#include "DnStateBlow.h"
#include "DnBubbleSystem.h"
#include "DnObserverEventMessage.h"
#include "DnPingpongBlow.h"
#include "DnBasicBlow.h"
#include "DnHealingBlow.h"
#include "DnHPIncBlow.h"
#include "DnInvincibleAtBlow.h"
#include "DnProbabilityChecker.h"
#include "DnCreateBlow.h"
#include "DnAllowedSkillsBlow.h"
#include "DnMonsterActor.h"
#include "DnProjectile.h"
#include "DnAdditionalStateInfoBlow.h"
#include "DnAddStateBySkillGroupBlow.h"
#include "DnTransformBlow.h"
#include "DnBloodSuckingBlow.h"
#include "DnOrderMySummonedMonsterBlow.h"
#if defined(PRE_FIX_NEXTSKILLINFO)
#include "DNGameDataManager.h"
#endif // PRE_FIX_NEXTSKILLINFO
#if defined(PRE_FIX_46381)
#include "DnContinueBaseMPIncBlow.h"
#endif // PRE_FIX_46381
using namespace BubbleSystem;
using namespace boost;
DECL_MULTISMART_PTR_STATIC( CDnSkill, MAX_SESSION_COUNT, 100 )
CDnSkill::CDnSkill( DnActorHandle hActor ) : CMultiSmartPtrBase< CDnSkill, MAX_SESSION_COUNT >(hActor->GetRoom()),
m_hActor( hActor ),
m_LastTimeToggleMPDecreaseTime( 0 ),
m_bToggle( false ),
m_bAura( false ),
m_bItemSkill( false ),
m_fPassiveActionSkillLength( 0.0f ),
m_eElement( CDnState::ElementEnum_Amount ),
m_iNextLevelSkillPoint( -1 ),
m_bChainingPassiveSkill( false ),
m_bAppliedPassiveSelfBlows( false ),
m_bTempSkill( false )
{
SecureZeroMemory( m_iNeedItemID, sizeof(m_iNeedItemID) );
SecureZeroMemory( m_iNeedItemDecreaseCount, sizeof(m_iNeedItemDecreaseCount) );
SecureZeroMemory( m_fHPConsumeType, sizeof(m_fHPConsumeType) );
SecureZeroMemory( m_fMPConsumeType, sizeof(m_fMPConsumeType) );
SecureZeroMemory( m_iNeedHP, sizeof(m_iNeedHP) );
SecureZeroMemory( m_iNeedMP, sizeof(m_iNeedMP) );
SecureZeroMemory( m_iIncreaseRange, sizeof(m_iIncreaseRange) );
SecureZeroMemory( m_iDecreaseHP, sizeof(m_iDecreaseHP) );
SecureZeroMemory( m_iDecreaseMP, sizeof(m_iDecreaseMP) );
SecureZeroMemory( m_fOriginalDelayTime, sizeof(m_fOriginalDelayTime) );
SecureZeroMemory( m_fDelayTime, sizeof(m_fDelayTime) );
m_iSkillID = 0;
m_iSkillLevelID = 0;
m_iDissolvable = 0;
m_iDuplicateCount = 0;
m_iSkillDuplicateMethod = 0;
m_iEffectDuplicateMethod = 0;
m_iLevel = 0;
m_iMaxLevel = 0;
m_eSkillType = SkillTypeEnum::Active;
m_eDurationType = DurationTypeEnum::Instantly;
m_eTargetType = TargetTypeEnum::Self;
m_iLevelLimit = 0;
m_fLeftDelayTime = 0.f;
m_fCoolTime = 0.f;
m_iAdditionalThreat = 0;
m_iCPScore = 0;
m_pEffectAction = NULL;
m_fOnceDelayTime = 0.0f;
m_fOnceElapsedDelayTime = 0.0f;
m_bEquipItemSkill = false;
m_iEquipIndex = -1;
m_fCoolTimeAdjustBlowValue = 1.0f;
m_fStartSuperArmor = 0.0f;
m_bStartCanHit = true;
m_fResetCooltime = 0.0f;
m_dwLastUseSkillTimeStamp = 0;
m_iExclusiveID = 0;
m_iSelectedSkillLevelDataApplyType = PVE; // <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> pve <20>̴<EFBFBD>.
m_iBaseSkillID = 0;
m_iAppliedEnchantPassiveSkillID = 0;
m_nPriority = 0;
m_nItemID = -1;
m_fCoolTimeMultipier = 1.0f;
m_isIgnoreImmuneBackup = false;
m_nLevelUpValue = 0;
#if defined(PRE_ADD_PREFIX_SYSTE_RENEW)
m_nPrefixSkillType = -1;
#endif // PRE_ADD_PREFIX_SYSTE_RENEW
m_iGlobalSkillGroupID = 0;
SecureZeroMemory( m_afGlobalCoolTime, sizeof(m_afGlobalCoolTime) );
m_fAnotherGlobalSkillCoolTime = 0.0f;
m_nAnotherGlobakSkillID = 0;
#if defined( PRE_ADD_ACADEMIC )
m_iSummonerDecreaseSP = 0;
m_iSummonerDecreaseSPSkillID = 0;
#endif // #if defined( PRE_ADD_ACADEMIC )
m_SummonMonsterID = -1;
m_bAddStateEffectQueue = false;
m_bEnchantedFromBubble = false;
m_SkillStartTime = 0;
m_bFinished = false;
m_bIsPrefixTriggerSkill = false;
m_iNeedJobClassID = 0;
m_iNowLevelSkillPoint = 0;
memset (m_iOriginalNeedMP, 0x00, sizeof(m_iOriginalNeedMP));
memset (m_aeNeedEquipType, 0x00, sizeof(m_aeNeedEquipType));
#if defined(PRE_FIX_64312)
m_isAppliedSummonMonsterEnchantSkill = false;
m_bIsSummonMonsterSkill = false;
#endif // PRE_FIX_64312
#if defined(PRE_ADD_TOTAL_LEVEL_SKILL)
m_fDeltaGlobalCoolTime = 0.0f;
#endif // PRE_ADD_TOTAL_LEVEL_SKILL
}
CDnSkill::~CDnSkill(void)
{
for( int iSelectedLevelData = PVE; iSelectedLevelData < NUM_SKILLLEVEL_APPLY_TYPE; ++iSelectedLevelData )
{
SAFE_DELETE_PVEC( m_vlpUsableCheckers[ iSelectedLevelData ] );
}
for( int iSelectedLevelData = PVE; iSelectedLevelData < NUM_SKILLLEVEL_APPLY_TYPE; ++iSelectedLevelData )
{
SAFE_DELETE_PVEC( m_vlpProcessors[ iSelectedLevelData ] );
}
for( int iSelectedLevelData = PVE; iSelectedLevelData < NUM_SKILLLEVEL_APPLY_TYPE; ++iSelectedLevelData )
{
SAFE_DELETE_PVEC( m_vlpProcessorBackup[ iSelectedLevelData ] );
}
#if defined(PRE_FIX_66175)
for( int iSelectedLevelData = PVE; iSelectedLevelData < NUM_SKILLLEVEL_APPLY_TYPE; ++iSelectedLevelData )
{
SAFE_DELETE_PVEC( m_vlUsableCheckersBackup[ iSelectedLevelData ] );
}
#endif // PRE_FIX_66175
}
void CDnSkill::SetHasActor( DnActorHandle hActor )
{
_ASSERT( hActor && "CDnSkill::SetHasActor() <20><><EFBFBD><EFBFBD> <20>ڵ<EFBFBD><DAB5><EFBFBD> NULL <20><>" );
m_hActor = hActor;
for( int iSelectedLevelData = PVE; iSelectedLevelData < NUM_SKILLLEVEL_APPLY_TYPE; ++iSelectedLevelData )
{
int iNumChecker = (int)m_vlpUsableCheckers[ iSelectedLevelData ].size();
for( int iChecker = 0; iChecker < iNumChecker; ++iChecker )
{
IDnSkillUsableChecker* pChecker = m_vlpUsableCheckers[ iSelectedLevelData ].at( iChecker );
pChecker->SetHasActor( hActor );
}
}
for( int iSelectedLevelData = PVE; iSelectedLevelData < NUM_SKILLLEVEL_APPLY_TYPE; ++iSelectedLevelData )
{
int iNumProcessor = (int)m_vlpProcessors[ iSelectedLevelData ].size();
for( int iProcessor = 0; iProcessor < iNumProcessor; ++iProcessor )
{
IDnSkillProcessor* pProcessor = m_vlpProcessors[ iSelectedLevelData ].at( iProcessor );
pProcessor->SetHasActor( hActor );
pProcessor->SetParentSkill( GetMySmartPtr() );
}
}
}
DnSkillHandle CDnSkill::CreateSkill( DnActorHandle hActor, int iSkillTableID, int iLevel )
{
CDnSkill* pNewSkill = NULL;
// <20><>ų <20>ߵ<EFBFBD> <20><><EFBFBD><EFBFBD>, <20>ߵ<EFBFBD> <20><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>޾<EFBFBD><DEBE>ش<EFBFBD>.
// <20><><EFBFBD><EFBFBD> 5<><35><EFBFBD><EFBFBD> <20>ְ<EFBFBD> <20>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD>ʹ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 10<31><30><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD> <20>ִ<EFBFBD>.
pNewSkill = new CDnSkill( hActor );
bool bResult = pNewSkill->Initialize( iSkillTableID, iLevel );
if( false == bResult )
{
delete pNewSkill;
return CDnSkill::Identity();
}
if( hActor && hActor->IsPlayerActor() )
{
CDnPlayerActor* pPlayerActor = static_cast<CDnPlayerActor*>(hActor.GetPointer());
pNewSkill->RegisterObserver( pPlayerActor->GetBubbleSystem() );
}
return pNewSkill->GetMySmartPtr();
}
#ifdef PRE_FIX_GAMESERVER_OPTIMIZE
bool CDnSkill::_LoadMonsterSkillLevelData( int iSkillTableID, int iLevel, int iSkillLevelDataApplyType )
{
DNTableFileFormat* pSkillTable = GetDNTable( CDnTableDB::TSKILL );
DNTableFileFormat* pSkillLevelTable = GetDNTable( CDnTableDB::TSKILLLEVEL );
vector<int> vlSkillLevelList;
if( pSkillLevelTable->GetItemIDListFromField( "_SkillIndex", iSkillTableID, vlSkillLevelList ) <= 0 )
return false;
if( !pSkillTable->IsExistItem( iSkillTableID) )
return false;
// pve, pvp <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE><EFBFBD>Ͽ<EFBFBD> <20>ɷ<EFBFBD><C9B7><EFBFBD>.
vector<int>::iterator iterLevelList = vlSkillLevelList.begin();
for( iterLevelList; iterLevelList != vlSkillLevelList.end(); )
{
int iSkillLevelTableID = *iterLevelList;
int iApplyType = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, "_ApplyType" )->GetInteger();
if( iApplyType != iSkillLevelDataApplyType )
iterLevelList = vlSkillLevelList.erase( iterLevelList );
else
++iterLevelList;
}
// <20>ش<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20>׳<EFBFBD> <20>ƹ<EFBFBD><C6B9>͵<EFBFBD> <20><><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20>ȴ<EFBFBD>.
if( vlSkillLevelList.empty() )
return true;
int iSkillLevelTableID = -1;
for( int i = 0; i < (int)vlSkillLevelList.size(); ++i )
{
int iNowLevel = pSkillLevelTable->GetFieldFromLablePtr( vlSkillLevelList.at(i), "_SkillLevel" )->GetInteger();
if( iNowLevel == iLevel )
{
iSkillLevelTableID = vlSkillLevelList.at( i );
break;
}
}
if( -1 == iSkillLevelTableID )
return false;
char caLabel[ 32 ];
int iCheckerParamOffset = 0;
int iProcessorParamOffset = 0;
for( int i = 0; i < MAX_PROCESSOR_COUNT; ++i )
{
// <20>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD> <20><>ü <20≯<EFBFBD><CCB8><EFBFBD> ã<>´<EFBFBD>. <20>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD> <20>ʵ尡 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD><D4BC><EFBFBD><E9BFA1> NULL <20><><EFBFBD>ϵ<EFBFBD>
sprintf_s( caLabel, "_UsableChecker%d", i + 1 );
int iUsableChecker = pSkillTable->GetFieldFromLablePtr( iSkillTableID, caLabel )->GetInteger();
sprintf_s( caLabel, "_Processor%d", i + 1 );
int iProcessor = pSkillTable->GetFieldFromLablePtr( iSkillTableID, caLabel )->GetInteger();
int iOffsetCheck = iCheckerParamOffset;
IDnSkillUsableChecker* pUsableChecker = IDnSkillUsableChecker::Create( m_hActor, iUsableChecker, iSkillLevelTableID, &iCheckerParamOffset );
if( NULL != pUsableChecker )
{
if( (iCheckerParamOffset - iOffsetCheck) != pUsableChecker->GetNumArgument() )
{
OutputDebug( "[SkillLevelTable Error!] %d <20><> <20>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߸<EFBFBD><DFB8>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD>ϴ<EFBFBD>.\n", iSkillLevelTableID );
_ASSERT( !"<EFBFBD><EFBFBD>ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD> <20>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD> <20>߸<EFBFBD><DFB8><EFBFBD>. OutputDebug <20><><EFBFBD><EFBFBD> Ȯ<><C8AE>!" );
}
this->AddUsableCheckers( pUsableChecker, iSkillLevelDataApplyType );
}
iOffsetCheck = iProcessorParamOffset;
IDnSkillProcessor* pSkillProcessor = IDnSkillProcessor::Create( m_hActor, iProcessor, iSkillLevelTableID, &iProcessorParamOffset, this->GetUseActionNames() );
if( NULL != pSkillProcessor )
{
if( (iProcessorParamOffset - iOffsetCheck) != pSkillProcessor->GetNumArgument() )
{
OutputDebug( "[SkillLevelTable Error!] %d <20><> <20>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߸<EFBFBD><DFB8>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD>ϴ<EFBFBD>.\n", iSkillLevelTableID );
_ASSERT( !"<EFBFBD><EFBFBD>ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD> <20>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD> <20>߸<EFBFBD><DFB8><EFBFBD>. OutputDebug <20><><EFBFBD><EFBFBD> Ȯ<><C8AE>!" );
}
this->AddProcessor( pSkillProcessor, iSkillLevelDataApplyType );
}
}
// skill table
m_strStaticName = pSkillTable->GetFieldFromLablePtr( iSkillTableID, "_StaticName" )->GetString();
char caLable[ 64 ];
ZeroMemory( caLable, sizeof(caLable) );
for( int i = 0; i < 2; ++i )
{
sprintf_s( caLable, "_NeedWeaponType%d", i+1 );
int iEquipType = pSkillTable->GetFieldFromLablePtr( iSkillTableID, caLable )->GetInteger();
if( -1 != iEquipType )
m_aeNeedEquipType[ i ] = (CDnWeapon::EquipTypeEnum)iEquipType;
else
m_aeNeedEquipType[ i ] = CDnWeapon::EquipTypeEnum_Amount;
}
// <20><>ų <20><><EFBFBD>̺<EFBFBD><CCBA><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ŷ<EFBFBD><C5B7><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>. -_-
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ.
if( 0 == m_iMaxLevel )
{
m_iMaxLevel = (int)vlSkillLevelList.size();
}
else
{
_ASSERT( m_iMaxLevel == (int)vlSkillLevelList.size() );
}
m_eSkillType = (SkillTypeEnum)pSkillTable->GetFieldFromLablePtr( iSkillTableID, "_SkillType" )->GetInteger();
m_eDurationType = (DurationTypeEnum)pSkillTable->GetFieldFromLablePtr( iSkillTableID, "_DurationType" )->GetInteger();
m_eTargetType = (TargetTypeEnum)pSkillTable->GetFieldFromLablePtr( iSkillTableID, "_TargetType" )->GetInteger();
m_iDissolvable = pSkillTable->GetFieldFromLablePtr( iSkillTableID, "_Dissolvable" )->GetInteger();
m_iDuplicateCount = pSkillTable->GetFieldFromLablePtr( iSkillTableID, "_EffectAmassCount" )->GetInteger();
m_iSkillDuplicateMethod = pSkillTable->GetFieldFromLablePtr( iSkillTableID, "_SkillDuplicate" )->GetInteger();
m_iEffectDuplicateMethod = pSkillTable->GetFieldFromLablePtr( iSkillTableID, "_EffectDuplicate" )->GetInteger();
m_eElement = (CDnState::ElementEnum)pSkillTable->GetFieldFromLablePtr( iSkillTableID, "_Element" )->GetInteger();
m_iNeedJobClassID = pSkillTable->GetFieldFromLablePtr( iSkillTableID, "_NeedJob" )->GetInteger();
if( (CDnState::ElementEnum)-1 == m_eElement )
m_eElement = CDnState::ElementEnum_Amount;
// skill level table
m_iSkillLevelID = iSkillLevelTableID;
m_iLevel = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, "_SkillLevel" )->GetInteger();
m_iNowLevelSkillPoint = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, "_NeedSkillPoint" )->GetInteger();
#if defined(PRE_FIX_NEXTSKILLINFO)
SKILL_LEVEL_INFO* pTabelInfo = g_pDataManager->GetSkillLevelTableIDList(iSkillTableID, iSkillLevelDataApplyType);
int nextSkillLevel = m_iLevel + 1;
if( m_iLevel < m_iMaxLevel )
{
int nextLevelTableID = -1;
SKILL_LEVEL_TABLE_IDS::iterator findIter = pTabelInfo->_SkillLevelTableIDs.find(nextSkillLevel);
if (findIter != pTabelInfo->_SkillLevelTableIDs.end())
nextLevelTableID = findIter->second;
m_iNextLevelSkillPoint = pSkillLevelTable->GetFieldFromLablePtr( nextLevelTableID, "_NeedSkillPoint" )->GetInteger();
}
else
m_iNextLevelSkillPoint = 0;
#else
if( m_iLevel < m_iMaxLevel )
m_iNextLevelSkillPoint = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID+1, "_NeedSkillPoint" )->GetInteger();
else
m_iNextLevelSkillPoint = 0;
#endif // PRE_FIX_NEXTSKILLINFO
m_iIncreaseRange[ iSkillLevelDataApplyType ] = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, "_AddRange" )->GetInteger();
m_iAdditionalThreat = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, "_AddThreat" )->GetInteger();
m_iCPScore = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, "_CPScore" )->GetInteger();
m_fStartSuperArmor = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, "_StartSuperArmor" )->GetFloat();
m_bStartCanHit = (pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, "_StartCanHit" )->GetInteger() == 1) ? true : false;
// <20><><EFBFBD><EFBFBD> ȿ<><C8BF> <20><><EFBFBD><EFBFBD> <20>ε<EFBFBD>
StateEffectStruct StateEffect;
for( int i = 0; i < MAX_STATE_EFFECT_COUNT; ++i )
{
sprintf_s( caLable, "_EffectClass%d", i + 1 );
StateEffect.nID = pSkillTable->GetFieldFromLablePtr( iSkillTableID, caLable )->GetInteger();
if( StateEffect.nID < 1 )
continue;
sprintf_s( caLable, "_EffectClass%dApplyType", i + 1 );
int iApplyType = pSkillTable->GetFieldFromLablePtr( iSkillTableID, caLable )->GetInteger();
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. Ÿ<>ٸ<EFBFBD> <20>ٸ<EFBFBD><D9B8><EFBFBD> <20>ؼ<EFBFBD> <20>Ȱ<EFBFBD><C8B0><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> 2<><32><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD><EFBFBD>ش<EFBFBD>.
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȭ <20>нú<D0BD><C3BA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <20><>ų<EFBFBD><C5B3> 2<><32><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʰ<EFBFBD> <20>׳<EFBFBD> <20><><EFBFBD><EFBFBD>. <20>ٸ<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><>ȭ<EFBFBD><C8AD>Ű<EFBFBD><C5B0> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ҹ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD>.
bool bApplyAll = (StateEffectApplyType::ApplyAll == iApplyType) && (SkillTypeEnum::EnchantPassive != m_eSkillType);
if( bApplyAll )
StateEffect.ApplyType = StateEffectApplyType::ApplySelf;
else
StateEffect.ApplyType = (StateEffectApplyType)iApplyType;
sprintf_s( caLable, "_EffectClassValue%d", i + 1 );
StateEffect.szValue = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caLable )->GetString();
sprintf_s( caLable, "_EffectClassValue%dDuration", i + 1 );
StateEffect.nDurationTime = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caLable )->GetInteger();
m_vlStateEffectList[ iSkillLevelDataApplyType ].push_back( StateEffect );
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD> Ÿ<><C5B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٲ㼭 <20>Ȱ<EFBFBD><C8B0><EFBFBD> <20><> <20><> <20><> <20>־<EFBFBD><D6BE><EFBFBD>.
if( bApplyAll )
{
StateEffect.ApplyType = StateEffectApplyType::ApplyTarget;
m_vlStateEffectList[ iSkillLevelDataApplyType ].push_back( StateEffect );
}
}
SkillInfo& MySkillInfo = m_SkillInfo[ iSkillLevelDataApplyType ];
MySkillInfo.iSkillID = m_iSkillID;
MySkillInfo.iSkillLevelID = m_iSkillLevelID;
MySkillInfo.iLevel = m_iLevel;
MySkillInfo.iSkillDuplicateMethod = m_iSkillDuplicateMethod;
MySkillInfo.iDuplicateCount = m_iDuplicateCount;
MySkillInfo.eSkillType = m_eSkillType;
MySkillInfo.eDurationType = m_eDurationType;
MySkillInfo.eTargetType = m_eTargetType;
MySkillInfo.eApplyType = StateEffect.ApplyType;
MySkillInfo.iDissolvable = m_iDissolvable;
MySkillInfo.eSkillElement = m_eElement;
MySkillInfo.hSkillUser = m_hActor; // Note: <20><><EFBFBD>Ͱ<EFBFBD> <20>׻<EFBFBD> <20><>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD> <20>ƴ<EFBFBD>
if( m_hActor )
MySkillInfo.iSkillUserTeam = m_hActor->GetTeam();
if( m_hActor && _tcslen(m_hActor->GetName()) > 0 )
MySkillInfo.strUserName = m_hActor->GetName();
MySkillInfo.szEffectOutputIDs = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, "_StateEffectTableID" )->GetString();
return true;
}
bool CDnSkill::InitializeMonsterSkill( int iSkillTableID, int iLevel )
{
m_iSkillID = iSkillTableID;
// <20><> <20><><EFBFBD><EFBFBD><E5BAB0> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD>. <20><><EFBFBD><EFBFBD> PVP <20><> <20>д´<D0B4>.
// PVE <20><> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD>̱<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E5BAB0> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ƴϸ<C6B4> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ä<><C3A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȴ<EFBFBD>.
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD><D4BC>̹Ƿ<CCB9> PVE <20><> ȣ<><C8A3>.
if( false == _LoadSkillLevelData( iSkillTableID, iLevel, PVP ) )
return false;
if( false == _LoadSkillLevelData( iSkillTableID, iLevel, PVE ) )
return false;
int iNumProcessor = (int)m_vlpProcessors[ PVE ].size();
for( int iProcessor = 0; iProcessor < iNumProcessor; ++iProcessor )
{
IDnSkillProcessor* pProcessor = m_vlpProcessors[ PVE ].at( iProcessor );
// <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ܺο<DCBA><CEBF><EFBFBD> <20><>ȸ<EFBFBD><C8B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ä<><C3A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if( pProcessor->GetType() == IDnSkillProcessor::PLAY_ANI )
m_setUseActionNames.insert( static_cast<CDnPlayAniProcess*>(pProcessor)->GetActionName() );
else
if( pProcessor->GetType() == IDnSkillProcessor::PARTIAL_PLAY_ANI )
{
CDnPartialPlayProcessor* pPartialPlayAni = static_cast<CDnPartialPlayProcessor*>(pProcessor);
m_setUseActionNames.insert( pPartialPlayAni->GetStartActionName() );
m_setUseActionNames.insert( pPartialPlayAni->GetLoopActionName() );
m_setUseActionNames.insert( pPartialPlayAni->GetEndActionName() );
}
}
// <20>ʱ<EFBFBD>ȭ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> pve <20><><EFBFBD><20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>.
m_iSelectedSkillLevelDataApplyType = PVE;
return true;
}
DnSkillHandle CDnSkill::CreateMonsterSkill( DnActorHandle hActor, int iSkillTableID, int iLevel )
{
if( hActor )
{
CDnSkill* pNewSkill = pNewSkill = new CDnSkill( hActor );
if( pNewSkill )
{
bool bResult = pNewSkill->InitializeMonsterSkill( iSkillTableID, iLevel );
if( false == bResult )
{
SAFE_DELETE( pNewSkill );
return CDnSkill::Identity();
}
if( hActor->IsPlayerActor() )
{
CDnPlayerActor* pPlayerActor = static_cast<CDnPlayerActor*>(hActor.GetPointer());
pNewSkill->RegisterObserver( pPlayerActor->GetBubbleSystem() );
}
return pNewSkill->GetMySmartPtr();
}
else
{
SAFE_DELETE( pNewSkill );
return CDnSkill::Identity();
}
}
return CDnSkill::Identity();
}
#endif // #ifdef PRE_FIX_GAMESERVER_OPTIMIZE
void CDnSkill::CreateSkillInfo( int nSkillID, int nSkillLevel, CDnSkill::SkillInfo & sSkillInfo, std::vector<CDnSkill::StateEffectStruct> & vecSkillEffect, bool bUseBattleGround/* = false*/ )
{
if( nSkillID == 0 || nSkillLevel == 0 )
return;
DNTableFileFormat* pSkillTable = NULL;
DNTableFileFormat* pSkillLevelTable = NULL;
if (bUseBattleGround)
{
pSkillTable = GetDNTable( CDnTableDB::TBATTLEGROUNDSKILL );
pSkillLevelTable = GetDNTable( CDnTableDB::TBATTLEGROUNDSKILLLEVEL );
}
else
{
pSkillTable = GetDNTable( CDnTableDB::TSKILL );
pSkillLevelTable = GetDNTable( CDnTableDB::TSKILLLEVEL );
}
if (pSkillLevelTable == NULL || pSkillTable == NULL)
{
_DANGER_POINT();
return;
}
std::vector<int> vlSkillLevelList;
if( pSkillLevelTable->GetItemIDListFromField( "_SkillIndex", nSkillID, vlSkillLevelList ) <= 0 )
return;
int iSkillLevelTableID = -1;
for( int i = 0; i < (int)vlSkillLevelList.size(); ++i )
{
int iNowLevel = pSkillLevelTable->GetFieldFromLablePtr( vlSkillLevelList.at(i), "_SkillLevel" )->GetInteger();
if( iNowLevel == nSkillLevel )
{
iSkillLevelTableID = vlSkillLevelList.at( i );
break;
}
}
if( -1 == iSkillLevelTableID )
return;
sSkillInfo.iSkillID = nSkillID;
sSkillInfo.iSkillLevelID = iSkillLevelTableID;
#ifdef PRE_FIX_SYNC_ENCHANT_SKILL
sSkillInfo.iAppliedEnchantSkillID = 0;
#endif
sSkillInfo.iLevel = nSkillLevel;
sSkillInfo.eDurationType = (CDnSkill::DurationTypeEnum)pSkillTable->GetFieldFromLablePtr( nSkillID, "_DurationType" )->GetInteger();
sSkillInfo.eTargetType = (CDnSkill::TargetTypeEnum)pSkillTable->GetFieldFromLablePtr( nSkillID, "_TargetType" )->GetInteger();
sSkillInfo.iSkillDuplicateMethod = pSkillTable->GetFieldFromLablePtr( nSkillID, "_SkillDuplicate" )->GetInteger();
sSkillInfo.iDuplicateCount = pSkillTable->GetFieldFromLablePtr( nSkillID, "_EffectAmassCount" )->GetInteger();
sSkillInfo.iDissolvable = pSkillTable->GetFieldFromLablePtr( nSkillID, "_Dissolvable" )->GetInteger();
sSkillInfo.szEffectOutputIDToClient = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, "_StateEffectTableID" )->GetString();
sSkillInfo.bFromBuffProp = true;
// <20><><EFBFBD><EFBFBD> ȿ<><C8BF> <20><><EFBFBD><EFBFBD> <20>ε<EFBFBD>
CDnSkill::StateEffectStruct StateEffect;
char caLable[ 64 ];
ZeroMemory( caLable, sizeof(caLable) );
for( int i = 0; i < MAX_STATE_EFFECT_COUNT; ++i )
{
sprintf_s( caLable, "_EffectClass%d", i + 1 );
StateEffect.nID = pSkillTable->GetFieldFromLablePtr( nSkillID, caLable )->GetInteger();
if( StateEffect.nID < 1 )
continue;
sprintf_s( caLable, "_EffectClass%dApplyType", i + 1 );
StateEffect.ApplyType = (CDnSkill::StateEffectApplyType)pSkillTable->GetFieldFromLablePtr( nSkillID, caLable )->GetInteger();
sprintf_s( caLable, "_EffectClassValue%d", i + 1 );
StateEffect.szValue = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caLable )->GetString();
sprintf_s( caLable, "_EffectClassValue%dDuration", i + 1 );
StateEffect.nDurationTime = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caLable )->GetInteger();
vecSkillEffect.push_back( StateEffect );
}
}
void CDnSkill::CreateBattleGroundSkillInfo( int nSkillID, int nSkillLevel, CDnSkill::SkillInfo & sSkillInfo, std::vector<CDnSkill::StateEffectStruct> & vecSkillEffect )
{
CreateSkillInfo(nSkillID, nSkillLevel, sSkillInfo, vecSkillEffect, true);
}
bool CDnSkill::_LoadSkillLevelData( int iSkillTableID, int iLevel, int iSkillLevelDataApplyType )
{
DNTableFileFormat* pSkillTable = GetDNTable( CDnTableDB::TSKILL );
DNTableFileFormat* pSkillLevelTable = GetDNTable( CDnTableDB::TSKILLLEVEL );
vector<int> vlSkillLevelList;
if( pSkillLevelTable->GetItemIDListFromField( "_SkillIndex", iSkillTableID, vlSkillLevelList ) <= 0 )
return false;
if( !pSkillTable->IsExistItem( iSkillTableID) )
return false;
// pve, pvp <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE><EFBFBD>Ͽ<EFBFBD> <20>ɷ<EFBFBD><C9B7><EFBFBD>.
vector<int>::iterator iterLevelList = vlSkillLevelList.begin();
for( iterLevelList; iterLevelList != vlSkillLevelList.end(); )
{
int iSkillLevelTableID = *iterLevelList;
int iApplyType = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, "_ApplyType" )->GetInteger();
if( iApplyType != iSkillLevelDataApplyType )
iterLevelList = vlSkillLevelList.erase( iterLevelList );
else
++iterLevelList;
}
// <20>ش<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20>׳<EFBFBD> <20>ƹ<EFBFBD><C6B9>͵<EFBFBD> <20><><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20>ȴ<EFBFBD>.
if( vlSkillLevelList.empty() )
return true;
int iSkillLevelTableID = -1;
for( int i = 0; i < (int)vlSkillLevelList.size(); ++i )
{
int iNowLevel = pSkillLevelTable->GetFieldFromLablePtr( vlSkillLevelList.at(i), "_SkillLevel" )->GetInteger();
if( iNowLevel == iLevel )
{
iSkillLevelTableID = vlSkillLevelList.at( i );
break;
}
}
if( -1 == iSkillLevelTableID )
return false;
#if defined(PRE_FIX_NEXTSKILLINFO)
//NextLevel<65><6C> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD>.. <20>׷<EFBFBD><D7B7><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ÿ <20><><EFBFBD>̺<EFBFBD> ID<49><44> ã<><C3A3> <20><><EFBFBD>´<EFBFBD>.
int iMinSkillLevelTableID = -1;
int iNextSkillLevelTableID = -1;
SKILL_LEVEL_INFO* pTableInfo = g_pDataManager->GetSkillLevelTableIDList(iSkillLevelTableID, iSkillLevelDataApplyType);
SKILL_LEVEL_TABLE_IDS::iterator findIter = pTableInfo->_SkillLevelTableIDs.find(pTableInfo->_MinLevel);
if (findIter != pTableInfo->_SkillLevelTableIDs.end())
iMinSkillLevelTableID = findIter->second;
findIter = pTableInfo->_SkillLevelTableIDs.find(iLevel + 1);
if (findIter != pTableInfo->_SkillLevelTableIDs.end())
iNextSkillLevelTableID = findIter->second;
#endif // PRE_FIX_NEXTSKILLINFO
char caLabel[ 32 ];
int iCheckerParamOffset = 0;
int iProcessorParamOffset = 0;
for( int i = 0; i < MAX_PROCESSOR_COUNT; ++i )
{
// <20>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD> <20><>ü <20≯<EFBFBD><CCB8><EFBFBD> ã<>´<EFBFBD>. <20>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD> <20>ʵ尡 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD><D4BC><EFBFBD><E9BFA1> NULL <20><><EFBFBD>ϵ<EFBFBD>
sprintf_s( caLabel, "_UsableChecker%d", i + 1 );
int iUsableChecker = pSkillTable->GetFieldFromLablePtr( iSkillTableID, caLabel )->GetInteger();
sprintf_s( caLabel, "_Processor%d", i + 1 );
int iProcessor = pSkillTable->GetFieldFromLablePtr( iSkillTableID, caLabel )->GetInteger();
int iOffsetCheck = iCheckerParamOffset;
IDnSkillUsableChecker* pUsableChecker = IDnSkillUsableChecker::Create( m_hActor, iUsableChecker, iSkillLevelTableID, &iCheckerParamOffset );
if( NULL != pUsableChecker )
{
if( (iCheckerParamOffset - iOffsetCheck) != pUsableChecker->GetNumArgument() )
{
OutputDebug( "[SkillLevelTable Error!] %d <20><> <20>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߸<EFBFBD><DFB8>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD>ϴ<EFBFBD>.\n", iSkillLevelTableID );
_ASSERT( !"<EFBFBD><EFBFBD>ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD> <20>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD> <20>߸<EFBFBD><DFB8><EFBFBD>. OutputDebug <20><><EFBFBD><EFBFBD> Ȯ<><C8AE>!" );
}
this->AddUsableCheckers( pUsableChecker, iSkillLevelDataApplyType );
}
iOffsetCheck = iProcessorParamOffset;
IDnSkillProcessor* pSkillProcessor = IDnSkillProcessor::Create( m_hActor, iProcessor, iSkillLevelTableID, &iProcessorParamOffset, this->GetUseActionNames() );
if( NULL != pSkillProcessor )
{
if( (iProcessorParamOffset - iOffsetCheck) != pSkillProcessor->GetNumArgument() )
{
OutputDebug( "[SkillLevelTable Error!] %d <20><> <20>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߸<EFBFBD><DFB8>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD>ϴ<EFBFBD>.\n", iSkillLevelTableID );
_ASSERT( !"<EFBFBD><EFBFBD>ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD> <20>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD> <20>߸<EFBFBD><DFB8><EFBFBD>. OutputDebug <20><><EFBFBD><EFBFBD> Ȯ<><C8AE>!" );
}
this->AddProcessor( pSkillProcessor, iSkillLevelDataApplyType );
}
}
// skill table
m_strStaticName = pSkillTable->GetFieldFromLablePtr( iSkillTableID, "_StaticName" )->GetString();
char caLable[ 64 ];
ZeroMemory( caLable, sizeof(caLable) );
for( int i = 0; i < 2; ++i )
{
sprintf_s( caLable, "_NeedWeaponType%d", i+1 );
int iEquipType = pSkillTable->GetFieldFromLablePtr( iSkillTableID, caLable )->GetInteger();
if( -1 != iEquipType )
m_aeNeedEquipType[ i ] = (CDnWeapon::EquipTypeEnum)iEquipType;
else
m_aeNeedEquipType[ i ] = CDnWeapon::EquipTypeEnum_Amount;
}
// <20><>ų <20><><EFBFBD>̺<EFBFBD><CCBA><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ŷ<EFBFBD><C5B7><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>. -_-
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ.
if( 0 == m_iMaxLevel )
{
m_iMaxLevel = (int)vlSkillLevelList.size();
}
else
{
_ASSERT( m_iMaxLevel == (int)vlSkillLevelList.size() );
}
m_eSkillType = (SkillTypeEnum)pSkillTable->GetFieldFromLablePtr( iSkillTableID, "_SkillType" )->GetInteger();
m_eDurationType = (DurationTypeEnum)pSkillTable->GetFieldFromLablePtr( iSkillTableID, "_DurationType" )->GetInteger();
m_eTargetType = (TargetTypeEnum)pSkillTable->GetFieldFromLablePtr( iSkillTableID, "_TargetType" )->GetInteger();
m_iDissolvable = pSkillTable->GetFieldFromLablePtr( iSkillTableID, "_Dissolvable" )->GetInteger();
m_iDuplicateCount = pSkillTable->GetFieldFromLablePtr( iSkillTableID, "_EffectAmassCount" )->GetInteger();
m_iSkillDuplicateMethod = pSkillTable->GetFieldFromLablePtr( iSkillTableID, "_SkillDuplicate" )->GetInteger();
m_iEffectDuplicateMethod = pSkillTable->GetFieldFromLablePtr( iSkillTableID, "_EffectDuplicate" )->GetInteger();
m_eElement = (CDnState::ElementEnum)pSkillTable->GetFieldFromLablePtr( iSkillTableID, "_Element" )->GetInteger();
m_iNeedJobClassID = pSkillTable->GetFieldFromLablePtr( iSkillTableID, "_NeedJob" )->GetInteger();
if( (CDnState::ElementEnum)-1 == m_eElement )
m_eElement = CDnState::ElementEnum_Amount;
m_iExclusiveID = pSkillTable->GetFieldFromLablePtr( iSkillTableID, "_DuplicatedSkillType" )->GetInteger();
m_iBaseSkillID = pSkillTable->GetFieldFromLablePtr( iSkillTableID, "_BaseSkillID" )->GetInteger();
m_iGlobalSkillGroupID = pSkillTable->GetFieldFromLablePtr( iSkillTableID, "_GlobalSkillGroup" )->GetInteger();
float fGlobalCoolTime = 0.0f;
if( PVE == iSkillLevelDataApplyType )
fGlobalCoolTime = (float)pSkillTable->GetFieldFromLablePtr( iSkillTableID, "_GlobalCoolTimePvE" )->GetInteger() / 1000.0f;
else
if( PVP == iSkillLevelDataApplyType )
fGlobalCoolTime = (float)pSkillTable->GetFieldFromLablePtr( iSkillTableID, "_GlobalCoolTimePvP" )->GetInteger() / 1000.0f;
m_afGlobalCoolTime[ iSkillLevelDataApplyType ] = fGlobalCoolTime;
// skill level table
m_iSkillLevelID = iSkillLevelTableID;
m_iLevel = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, "_SkillLevel" )->GetInteger();
m_iNowLevelSkillPoint = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, "_NeedSkillPoint" )->GetInteger();
if( m_iLevel < m_iMaxLevel )
#if defined(PRE_FIX_NEXTSKILLINFO)
m_iNextLevelSkillPoint = pSkillLevelTable->GetFieldFromLablePtr( iNextSkillLevelTableID, "_NeedSkillPoint" )->GetInteger();
#else
m_iNextLevelSkillPoint = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID+1, "_NeedSkillPoint" )->GetInteger();
#endif // PRE_FIX_NEXTSKILLINFO
else
m_iNextLevelSkillPoint = 0;
m_iNeedItemID[ iSkillLevelDataApplyType ] = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, "_NeedItem" )->GetInteger();
m_iNeedItemDecreaseCount[ iSkillLevelDataApplyType ] = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, "_NeedItemDecreaseCount" )->GetInteger();
m_iIncreaseRange[ iSkillLevelDataApplyType ] = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, "_AddRange" )->GetInteger();
m_iDecreaseHP[ iSkillLevelDataApplyType ] = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, "_DecreaseHP" )->GetInteger();
m_iDecreaseMP[ iSkillLevelDataApplyType ] = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, "_DecreaseSP" )->GetInteger();
m_iLevelLimit = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, "_LevelLimit" )->GetInteger();
m_fDelayTime[ iSkillLevelDataApplyType ] = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, "_DelayTime" )->GetInteger() / 1000.f;
// <20><><EFBFBD><EFBFBD> <20>۷ι<DBB7> <20><>ų <20>׷<EFBFBD><D7B7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE>ִٸ<D6B4> <20><>ų <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20>۷ι<DBB7> <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ü <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
if( 0 < m_iGlobalSkillGroupID )
m_fDelayTime[ iSkillLevelDataApplyType ] = m_afGlobalCoolTime[ iSkillLevelDataApplyType ];
m_fOriginalDelayTime[ iSkillLevelDataApplyType ] = m_fDelayTime[ iSkillLevelDataApplyType ];
m_iAdditionalThreat = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, "_AddThreat" )->GetInteger();
m_fHPConsumeType[ iSkillLevelDataApplyType ] = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, "_HPConsumeType" )->GetFloat();
m_fMPConsumeType[ iSkillLevelDataApplyType ] = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, "_SPConsumeType" )->GetFloat();
m_iCPScore = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, "_CPScore" )->GetInteger();
m_fStartSuperArmor = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, "_StartSuperArmor" )->GetFloat();
m_bStartCanHit = (pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, "_StartCanHit" )->GetInteger() == 1) ? true : false;
// <20><><EFBFBD><EFBFBD> ȿ<><C8BF> <20><><EFBFBD><EFBFBD> <20>ε<EFBFBD>
StateEffectStruct StateEffect;
for( int i = 0; i < MAX_STATE_EFFECT_COUNT; ++i )
{
sprintf_s( caLable, "_EffectClass%d", i + 1 );
StateEffect.nID = pSkillTable->GetFieldFromLablePtr( iSkillTableID, caLable )->GetInteger();
if( StateEffect.nID < 1 )
continue;
sprintf_s( caLable, "_EffectClass%dApplyType", i + 1 );
int iApplyType = pSkillTable->GetFieldFromLablePtr( iSkillTableID, caLable )->GetInteger();
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. Ÿ<>ٸ<EFBFBD> <20>ٸ<EFBFBD><D9B8><EFBFBD> <20>ؼ<EFBFBD> <20>Ȱ<EFBFBD><C8B0><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> 2<><32><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD><EFBFBD>ش<EFBFBD>.
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȭ <20>нú<D0BD><C3BA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <20><>ų<EFBFBD><C5B3> 2<><32><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʰ<EFBFBD> <20>׳<EFBFBD> <20><><EFBFBD><EFBFBD>. <20>ٸ<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><>ȭ<EFBFBD><C8AD>Ű<EFBFBD><C5B0> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ҹ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD>.
bool bApplyAll = (StateEffectApplyType::ApplyAll == iApplyType) && (SkillTypeEnum::EnchantPassive != m_eSkillType);
if( bApplyAll )
{
StateEffect.ApplyType = StateEffectApplyType::ApplySelf;
StateEffect.bApplyAllPair = true;
}
else
StateEffect.ApplyType = (StateEffectApplyType)iApplyType;
sprintf_s( caLable, "_EffectClassValue%d", i + 1 );
StateEffect.szValue = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caLable )->GetString();
sprintf_s( caLable, "_EffectClassValue%dDuration", i + 1 );
StateEffect.nDurationTime = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caLable )->GetInteger();
m_vlStateEffectList[ iSkillLevelDataApplyType ].push_back( StateEffect );
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD> Ÿ<><C5B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٲ㼭 <20>Ȱ<EFBFBD><C8B0><EFBFBD> <20><> <20><> <20><> <20>־<EFBFBD><D6BE><EFBFBD>.
if( bApplyAll )
{
StateEffect.ApplyType = StateEffectApplyType::ApplyTarget;
m_vlStateEffectList[ iSkillLevelDataApplyType ].push_back( StateEffect );
}
}
SkillInfo& MySkillInfo = m_SkillInfo[ iSkillLevelDataApplyType ];
MySkillInfo.iSkillID = m_iSkillID;
MySkillInfo.iSkillLevelID = m_iSkillLevelID;
MySkillInfo.iLevel = m_iLevel;
MySkillInfo.iSkillDuplicateMethod = m_iSkillDuplicateMethod;
MySkillInfo.iDuplicateCount = m_iDuplicateCount;
MySkillInfo.eSkillType = m_eSkillType;
MySkillInfo.eDurationType = m_eDurationType;
MySkillInfo.eTargetType = m_eTargetType;
MySkillInfo.eApplyType = StateEffect.ApplyType;
MySkillInfo.iDissolvable = m_iDissolvable;
MySkillInfo.eSkillElement = m_eElement;
MySkillInfo.hSkillUser = m_hActor; // Note: <20><><EFBFBD>Ͱ<EFBFBD> <20>׻<EFBFBD> <20><>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD> <20>ƴ<EFBFBD>
if( m_hActor )
MySkillInfo.iSkillUserTeam = m_hActor->GetTeam();
if( m_hActor && _tcslen(m_hActor->GetName()) > 0 )
MySkillInfo.strUserName = m_hActor->GetName();
MySkillInfo.szEffectOutputIDs = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, "_StateEffectTableID" )->GetString();
if( 0.0f == m_fHPConsumeType[ iSkillLevelDataApplyType ] )
{
m_iNeedHP[ iSkillLevelDataApplyType ] = m_iDecreaseHP[ iSkillLevelDataApplyType ];
}
else
{
m_iNeedHP[ iSkillLevelDataApplyType ] = int((float)m_hActor->GetMaxHP() * m_fHPConsumeType[ iSkillLevelDataApplyType ]);
}
#if defined(PRE_ADD_PREFIX_SYSTE_RENEW)
m_nPrefixSkillType = pSkillTable->GetFieldFromLablePtr( iSkillTableID, "_Group" )->GetInteger();
//<2F><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̻<EFBFBD> <20><>ų <20>׷<EFBFBD>ID<49><44> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>´<EFBFBD>..(Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>?...)
SetPrefixSkillType(m_nPrefixSkillType);
#endif // PRE_ADD_PREFIX_SYSTE_RENEW
return true;
}
void CDnSkill::_OnInitialize( void )
{
// 129<32><39> ChangeActionSet <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> DnApplySEWhenActionSetBlowEnabledProcessor <20><><EFBFBD><EFBFBD> Ÿ<><C5B8><EFBFBD><EFBFBD> <20>ִٸ<D6B4> ChangeActionSet <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8> <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD>ְ<EFBFBD> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD>Ŀ<EFBFBD> <20>ٲ<EFBFBD> <20>׼ǿ<D7BC><C7BF><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><>ȿ<EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD> <20><><EFBFBD><EFBFBD>Ÿ<EFBFBD>Կ<EFBFBD><D4BF><EFBFBD> <20><>Ʈ<EFBFBD><C6AE> <20>ϰ<EFBFBD> <20>ȴ<EFBFBD>.
// <20><20>׳<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..
for( int k = PVE; k < NUM_SKILLLEVEL_APPLY_TYPE; ++k )
{
CDnApplySEWhenActionSetBlowEnabledProcessor* pApplySEWhenActionSetBlowEnableProcessor =
static_cast<CDnApplySEWhenActionSetBlowEnabledProcessor*>(GetProcessor( IDnSkillProcessor::APPLY_SE_WHEN_ACTIONSET_ENABLED, k ));
if( pApplySEWhenActionSetBlowEnableProcessor )
{
// <20><> <20><><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20>ִµ<D6B4> ChangeActionSet <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> ChangeActionStr <20><><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>..
bool bValid = false;
for( int i = 0; i < (int)m_vlStateEffectList[ k ].size(); ++i )
{
StateEffectStruct& StateEffect = m_vlStateEffectList[ k ].at( i );
if( STATE_BLOW::BLOW_129 == StateEffect.nID )
{
bValid = true;
break;
}
}
if( bValid )
{
CDnChangeActionStrProcessor* pChangeActionStrProcessor = static_cast<CDnChangeActionStrProcessor*>(GetProcessor( IDnSkillProcessor::CHANGE_ACTIONSTR, k ));
if( pChangeActionStrProcessor )
bValid = true;
else
bValid = false;
}
if( bValid )
{
for( int i = 0; i < (int)m_vlStateEffectList[ k ].size(); ++i )
{
StateEffectStruct& StateEffect = m_vlStateEffectList[ k ].at( i );
if( STATE_BLOW::BLOW_129 != StateEffect.nID )
{
pApplySEWhenActionSetBlowEnableProcessor->AddStateEffect( &StateEffect );
StateEffect.bApplyInProcessor = true;
}
}
}
}
}
}
bool CDnSkill::Initialize( int iSkillTableID, int iLevel )
{
m_iSkillID = iSkillTableID;
// <20><> <20><><EFBFBD><EFBFBD><E5BAB0> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD>. <20><><EFBFBD><EFBFBD> PVP <20><> <20>д´<D0B4>.
// PVE <20><> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD>̱<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E5BAB0> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ƴϸ<C6B4> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ä<><C3A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȴ<EFBFBD>.
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>쿣 pvp <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> <20>Լ<EFBFBD> <20>ȿ<EFBFBD><C8BF><EFBFBD> <20>ƹ<EFBFBD><C6B9>͵<EFBFBD> <20>ȵǰ<C8B5> <20><><EFBFBD>ϵȴ<CFB5>.
// <20><><EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7>̾<EFBFBD><CCBE>ε<EFBFBD> <20>ƹ<EFBFBD><C6B9>͵<EFBFBD> <20><><EFBFBD>ٸ<EFBFBD> <20>߸<EFBFBD><DFB8><EFBFBD> <20><><EFBFBD><EFBFBD>.
if( false == _LoadSkillLevelData( iSkillTableID, iLevel, PVP ) )
return false;
if( false == _LoadSkillLevelData( iSkillTableID, iLevel, PVE ) )
return false;
// <20>ʱ<EFBFBD>ȭ <20><><EFBFBD>Ŀ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ƴ<EFBFBD><C6B3><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
DNTableFileFormat* pSkillTable = GetDNTable( CDnTableDB::TSKILL );
RefreshDecreaseMP();
int iNumProcessor = (int)m_vlpProcessors[ PVE ].size();
for( int iProcessor = 0; iProcessor < iNumProcessor; ++iProcessor )
{
IDnSkillProcessor* pProcessor = m_vlpProcessors[ PVE ].at( iProcessor );
// <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ܺο<DCBA><CEBF><EFBFBD> <20><>ȸ<EFBFBD><C8B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ä<><C3A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if( pProcessor->GetType() == IDnSkillProcessor::PLAY_ANI )
m_setUseActionNames.insert( static_cast<CDnPlayAniProcess*>(pProcessor)->GetActionName() );
else
if( pProcessor->GetType() == IDnSkillProcessor::PARTIAL_PLAY_ANI )
{
CDnPartialPlayProcessor* pPartialPlayAni = static_cast<CDnPartialPlayProcessor*>(pProcessor);
m_setUseActionNames.insert( pPartialPlayAni->GetStartActionName() );
m_setUseActionNames.insert( pPartialPlayAni->GetLoopActionName() );
m_setUseActionNames.insert( pPartialPlayAni->GetEndActionName() );
}
}
// <20>ʱ<EFBFBD>ȭ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> pve <20><><EFBFBD><20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>.
m_iSelectedSkillLevelDataApplyType = PVE;
_OnInitialize();
if (m_eDurationType == SummonOnOff)
OnInitializeSummonMonsterInfo();
return true;
}
bool CDnSkill::AddUsableCheckers( IDnSkillUsableChecker* pUsableChecker, int iSelectedLevelData )
{
bool bResult = false;
if( pUsableChecker )
{
m_vlpUsableCheckers[ iSelectedLevelData ].push_back( pUsableChecker );
bResult = true;
}
return bResult;
}
bool CDnSkill::AddProcessor( IDnSkillProcessor* pProcessor, int iSelectedLevelData )
{
bool bResult = false;
if( pProcessor )
{
m_vlpProcessors[ iSelectedLevelData ].push_back( pProcessor );
bResult = true;
}
return bResult;
}
bool CDnSkill::IsSatisfyWeapon( void )
{
bool bSatisfy = true;
if( (CDnWeapon::EquipTypeEnum_Amount != m_aeNeedEquipType[ 0 ]) ||
(CDnWeapon::EquipTypeEnum_Amount != m_aeNeedEquipType[ 1 ]) )
{
bSatisfy = false;
if( CDnWeapon::EquipTypeEnum_Amount != m_aeNeedEquipType[ 0 ] && CDnWeapon::EquipTypeEnum_Amount != m_aeNeedEquipType[ 1 ] )
{
if( CDnWeapon::IsSubWeapon( m_aeNeedEquipType[ 0 ] ) == CDnWeapon::IsSubWeapon( m_aeNeedEquipType[ 1 ] ) ) // 1. <20>Ѵ<EFBFBD> <20>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD>̰ų<CCB0> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> or
{
int nWeapon = CDnWeapon::IsSubWeapon( m_aeNeedEquipType[ 0 ] ) ? 1 : 0;
#ifdef _GAMESERVER
if( m_hActor->GetWeapon( nWeapon ) && m_aeNeedEquipType[ 0 ] == m_hActor->GetWeapon( nWeapon )->GetEquipType()
|| m_hActor->GetWeapon( nWeapon ) && m_aeNeedEquipType[ 1 ] == m_hActor->GetWeapon( nWeapon )->GetEquipType() )
#else // _GAMESERVER
if( m_hActor->GetWeapon( nWeapon, false ) && m_aeNeedEquipType[ 0 ] == m_hActor->GetWeapon( nWeapon, false )->GetEquipType()
|| m_hActor->GetWeapon( nWeapon, false ) && m_aeNeedEquipType[ 1 ] == m_hActor->GetWeapon( nWeapon, false )->GetEquipType() )
#endif // _GAMESERVER
bSatisfy = true;
}
else // 2. <20>ֹ<EFBFBD><D6B9><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> and
{
if( CDnWeapon::IsSubWeapon( m_aeNeedEquipType[ 0 ] ) )
{
#ifdef _GAMESERVER
if( m_hActor->GetWeapon( 1 ) && m_aeNeedEquipType[ 0 ] == m_hActor->GetWeapon( 1 )->GetEquipType()
&& m_hActor->GetWeapon( 0 ) && m_aeNeedEquipType[ 1 ] == m_hActor->GetWeapon( 0 )->GetEquipType() )
#else // _GAMESERVER
if( m_hActor->GetWeapon( 1, false ) && m_aeNeedEquipType[ 0 ] == m_hActor->GetWeapon( 1, false )->GetEquipType()
&& m_hActor->GetWeapon( 0, false ) && m_aeNeedEquipType[ 1 ] == m_hActor->GetWeapon( 0, false )->GetEquipType() )
#endif // _GAMESERVER
bSatisfy = true;
}
else
{
#ifdef _GAMESERVER
if( m_hActor->GetWeapon( 0 ) && m_aeNeedEquipType[ 0 ] == m_hActor->GetWeapon( 0 )->GetEquipType()
&& m_hActor->GetWeapon( 1 ) && m_aeNeedEquipType[ 1 ] == m_hActor->GetWeapon( 1 )->GetEquipType() )
#else // _GAMESERVER
if( m_hActor->GetWeapon( 0, false ) && m_aeNeedEquipType[ 0 ] == m_hActor->GetWeapon( 0, false )->GetEquipType()
&& m_hActor->GetWeapon( 1, false ) && m_aeNeedEquipType[ 1 ] == m_hActor->GetWeapon( 1, false )->GetEquipType() )
#endif // _GAMESERVER
bSatisfy = true;
}
}
}
else
{
for( int i=0; i<MAX_SKILL_NEED_EQUIP_COUNT; ++i )
{
if( CDnWeapon::EquipTypeEnum_Amount != m_aeNeedEquipType[ i ] )
{
for( int k=0; k<2; ++k )
{
// bActionMatchWeapon <20><> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> true <20><> ȣ<><C8A3><EFBFBD>ϴϱ<CFB4> <20>׼ǿ<D7BC> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20>ٸ<EFBFBD><D9B8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>Ͽ<EFBFBD> <20>׻<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ַ<EFBFBD> üũ<C3BC><C5A9><EFBFBD><EFBFBD>..
#ifdef _GAMESERVER
if( m_hActor->GetWeapon( k ) && m_aeNeedEquipType[ i ] == m_hActor->GetWeapon( k )->GetEquipType() )
#else // _GAMESERVER
if( m_hActor->GetWeapon( k, false ) && m_aeNeedEquipType[ i ] == m_hActor->GetWeapon( k, false )->GetEquipType() )
#endif // _GAMESERVER
{
bSatisfy = true;
break;
}
}
if( bSatisfy )
break;
}
}
}
}
return bSatisfy;
}
CDnSkill::UsingResult CDnSkill::CanExecute( void )
{
UsingResult eResult = UsingResult::Failed;
if( !m_hActor )
return UsingResult::Failed;
if( m_hActor->IsPlayerActor() )
{
CDnPlayerActor* pPlayerActor = static_cast<CDnPlayerActor*>(m_hActor.GetPointer());
if( pPlayerActor && pPlayerActor->IsSwapSingleSkin() )
{
if( pPlayerActor->IsTransformSkill(GetClassID()) == false )
return UsingResult::Failed;
}
}
if (m_hActor->IsAppliedThisStateBlow(STATE_BLOW::BLOW_176))
{
DNVector(DnBlowHandle) vlBlows;
CDnAllowedSkillsBlow* pAllowedSkillBlow = NULL;
m_hActor->GatherAppliedStateBlowByBlowIndex(STATE_BLOW::BLOW_176, vlBlows);
for (int i = 0; i < (int)vlBlows.size(); ++i)
{
pAllowedSkillBlow = static_cast<CDnAllowedSkillsBlow*>(vlBlows[i].GetPointer());
if (!pAllowedSkillBlow) continue;
if (!pAllowedSkillBlow->IsAllowSkill(m_iSkillID))
return UsingResult::Failed;
}
}
// <20>ܿ<EFBFBD> SP üũ, ü<><C3BC> üũ, <20><><EFBFBD><EFBFBD> üũ <20><><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ȱ<><C8B0>ȭ <20><><EFBFBD>̶<EFBFBD><CCB6><EFBFBD> MP <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><> <20>ִ<EFBFBD>.
if( !IsToggleOn() && !IsAuraOn() )
if( m_hActor->GetSP() < m_iNeedMP[ m_iSelectedSkillLevelDataApplyType ] )
return UsingResult::Failed;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EAB0B0> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD>϶<EFBFBD><CFB6><EFBFBD> <20><><EFBFBD><EFBFBD><EBB0A1><EFBFBD>ؾ<EFBFBD> <20>Ѵ<EFBFBD>.
// <20><><EFBFBD>̺<EFBFBD><CCBA><EFBFBD> <20><><EFBFBD>ݺҰ<DDBA> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0>ұ<EFBFBD><D2B1>ϴٰ<CFB4> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EABFA1><EFBFBD><EFBFBD> <20>ǹ<EFBFBD><C7B9>ִ<EFBFBD> <20><><EFBFBD>̹Ƿ<CCB9>
// <20>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̰<EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><> <20><><EFBFBD>Ѻ<EFBFBD><D1BA><EFBFBD> <20>԰<EFBFBD>ȭ <20><>Ű<EFBFBD><C5B0><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
// <20>켱 Dissolve <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20>ִ<EFBFBD> <20><>ų<EFBFBD><C5B3> <20>ൿ <20>Ұ<EFBFBD> üũ<C3BC><C5A9> <20>dzʶڴ<CAB6>.
// <20><>ų<EFBFBD><C5B3> <20>ش<EFBFBD><D8B4>ϴ<EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD> State <20>ñ׳ο<D7B3> <20>ݵ<EFBFBD><DDB5><EFBFBD> IgnorectCantAction <20><> <20><><EFBFBD><EFBFBD> <20>־<EFBFBD><D6BE><EFBFBD> <20><>ų <20>׼<EFBFBD><D7BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
bool bPassCheckCantAction = false;
for( DWORD i = 0; i < GetStateEffectCount(); ++i )
{
//#40480 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¿<EFBFBD><C2BF><EFBFBD> <20><><EFBFBD><EFBFBD><E0BDBD> Ȱ<><C8B0>ȭ<EFBFBD><C8AD> <20><><EFBFBD>ؼ<EFBFBD>..
CDnSkill::StateEffectStruct* pSE = GetStateEffectFromIndex( i );
if( STATE_BLOW::BLOW_069 == pSE->nID )
{
// 76643 ( Dissolvable <20><> 2<><32> <20>׳<EFBFBD> <20><>Ȱ<EFBFBD><C8B0>ȭ <20>ش޶<D8B4><DEB6><EFBFBD> <20>մϴ<D5B4> )
for( int i=0 ; i<m_hActor->GetNumAppliedStateBlow() ; ++i )
{
DnBlowHandle hBlow = m_hActor->GetAppliedStateBlow( i );
if( hBlow )
{
const CDnSkill::SkillInfo* pSkillInfo = hBlow->GetParentSkillInfo();
if( pSkillInfo && pSkillInfo->iDissolvable == 2 )
return UsingResult::Failed;
}
}
bPassCheckCantAction = true;
break;
}
if( STATE_BLOW::BLOW_155 == pSE->nID )
{
bPassCheckCantAction = true;
break;
}
}
// <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD>Ұ<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> mp <20>Ҹ<EFBFBD><D2B8>ϴ<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.
if( 0 < m_hActor->GetCantUseSkillSEReferenceCount() )
if( 0 < m_iNeedMP[ m_iSelectedSkillLevelDataApplyType ] )
return UsingResult::Failed;
// 67<36><37> <20><>ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ƽ<EFBFBD><C6BC> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.
if( m_eSkillType == CDnSkill::Active )
{
int iAppliedStateBlow = m_hActor->GetNumAppliedStateBlow();
for( int iBlow = 0; iBlow < iAppliedStateBlow; ++iBlow )
{
DnBlowHandle hBlow = m_hActor->GetAppliedStateBlow( iBlow );
if( hBlow && hBlow->GetBlowIndex() == STATE_BLOW::BLOW_067 )
return UsingResult::Failed;
}
}
// HP
if( m_hActor->GetHP() < m_iNeedHP[ m_iSelectedSkillLevelDataApplyType ] )
return UsingResult::Failed;
bool isCharacterLevelCheck = true;
//<2F><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ۿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><>ų<EFBFBD><C5B3> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> üũ <20><><EFBFBD><EFBFBD> <20>ʵ<EFBFBD><CAB5><EFBFBD> <20>Ѵ<EFBFBD>.
isCharacterLevelCheck = (GetLevelUpValue() == 0);
if (isCharacterLevelCheck)
{
if( m_hActor->GetLevel() < m_iLevelLimit )
return UsingResult::Failed;
}
// <20>ʿ<EFBFBD> <20><><EFBFBD><20>ִٸ<D6B4> <20><><EFBFBD><EFBFBD><EFBFBD>ߴ<EFBFBD><DFB4><EFBFBD> Ȯ<><C8AE>. <20>ִ<EFBFBD> 2<><32><EFBFBD><EFBFBD>. <20><> <20><> <20>ϳ<EFBFBD><CFB3><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ǵ<EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
if( (CDnWeapon::EquipTypeEnum_Amount != m_aeNeedEquipType[ 0 ]) ||
(CDnWeapon::EquipTypeEnum_Amount != m_aeNeedEquipType[ 1 ]) )
{
bool bSatisfy = false;
for( int i = 0; i < MAX_SKILL_NEED_EQUIP_COUNT; ++i )
{
if( CDnWeapon::EquipTypeEnum_Amount != m_aeNeedEquipType[ i ] )
{
for( int k = 0; k < 2; ++k )
{
// #11120 <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>¿<EFBFBD><C2BF><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD> <20><><EFBFBD>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD><D4BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
if( m_hActor->CDnActor::GetWeapon( k ) && m_aeNeedEquipType[ i ] == m_hActor->CDnActor::GetWeapon( k )->GetEquipType() )
{
bSatisfy = true;
break;
}
}
if( bSatisfy )
break;
}
}
if( false == bSatisfy )
return UsingResult::Failed;
}
// ȭ<><C8AD> <20><><EFBFBD><EFBFBD> <20>Ҹ<EFBFBD><D2B8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ȯ<><C8AE>
bool bCheckNeedItem = true;
if( GetRoom() && bIsExtremitySkill() && static_cast<CDNGameRoom*>(GetRoom())->bIsLadderRoom() ) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ñر<C3B1> <20><>ų
bCheckNeedItem = false;
if( bCheckNeedItem && m_iNeedItemID[ m_iSelectedSkillLevelDataApplyType ] > 0 )
{
int iNumNeedItem = CDnItemTask::GetInstance( m_hActor->GetRoom() ).ScanItemFromID( m_hActor, m_iNeedItemID[ m_iSelectedSkillLevelDataApplyType ], NULL );
if( iNumNeedItem < m_iNeedItemDecreaseCount[ m_iSelectedSkillLevelDataApplyType ] )
return UsingResult::Failed;
}
// <20><><EFBFBD><EFBFBD> üũ
//if( m_hActor->GetClassID() <= CDnActor::Reserved6 )
if( m_hActor->IsPlayerActor() )
{
//CDnPlayerActor* pActor = dynamic_cast<CDnPlayerActor*>(m_hActor.GetPointer());
CDnPlayerActor* pActor = static_cast<CDnPlayerActor*>(m_hActor.GetPointer());
if( NULL == pActor )
return UsingResult::Failed;
if( 0 != m_iNeedJobClassID )
{
if( pActor->IsPassJob( m_iNeedJobClassID ) == false )
return UsingResult::Failed;
}
// <20><>Ʋ <20><><EFBFBD><20>ƴϸ<C6B4> <20><>ų <20>ߵ<EFBFBD> <20>Ұ<EFBFBD>!
if( !pActor->IsBattleMode() )
return UsingResult::Failed;
}
switch( m_eDurationType )
{
case CDnSkill::Instantly:
case CDnSkill::Buff:
case CDnSkill::Debuff:
case CDnSkill::SummonOnOff:
case CDnSkill::StanceChange:
{
// <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʾҴٸ<D2B4> <20><>ų <20>ߵ<EFBFBD> <20>Ұ<EFBFBD>.. <20>켱 Ŭ<>󿡼<EFBFBD> üũ<C3BC>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ֹǷ<D6B9> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E0B0A3> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD>ܵд<DCB5>.
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̰ų<CCB0> <20><><EFBFBD><EFBFBD> <20>нú<D0BD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD>쿣 Į<><C4AE><EFBFBD><EFBFBD> üũ.
if( m_hActor->IsMonsterActor() ||
SkillTypeEnum::AutoPassive == m_eSkillType )
{
if( m_fCoolTime > 0.0f )
return UsingResult::FailedByCooltime;
}
else
{
if( m_fLeftDelayTime > 0.5f )
return UsingResult::FailedByCooltime;
}
}
break;
case CDnSkill::TimeToggle:
break;
case CDnSkill::ActiveToggle:
case CDnSkill::ActiveToggleForSummon:
break;
case CDnSkill::Aura:
break;
}
if( m_vlpUsableCheckers[ m_iSelectedSkillLevelDataApplyType ].empty() )
eResult = UsingResult::Success;
else
{
int iNumChecker = (int)m_vlpUsableCheckers[ m_iSelectedSkillLevelDataApplyType ].size();
for( int iChecker = 0; iChecker < iNumChecker; ++iChecker )
{
IDnSkillUsableChecker* pChecker = m_vlpUsableCheckers[ m_iSelectedSkillLevelDataApplyType ].at( iChecker );
if( false == pChecker->CanUse() )
{
eResult = UsingResult::FailedByUsableChecker;
break;
}
else
eResult = UsingResult::Success;
}
}
return eResult;
}
float CDnSkill::GetDelayTime( void )
{
#if defined(PRE_ADD_TOTAL_LEVEL_SKILL)
float fDelayTime = 0.0f;
if( 0.0f < m_fAnotherGlobalSkillCoolTime )
{
fDelayTime = m_fAnotherGlobalSkillCoolTime;
DnSkillHandle hAnotherSkill;
if (m_hActor)
hAnotherSkill = m_hActor->FindSkill(m_nAnotherGlobakSkillID);
if (hAnotherSkill)
{
if (hAnotherSkill->GetAnotherGlobalSkillID() != GetClassID())
fDelayTime = hAnotherSkill->GetDelayTime();
}
}
else
//<2F><>m_fAnotherGlobalSkillCoolTime<6D><65> <20><><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20>ϵ<EFBFBD><CFB5><EFBFBD>..
{
fDelayTime = m_fDelayTime[ m_iSelectedSkillLevelDataApplyType ];
float fGlobalCoolTimeRate = 0.0f;
if (m_hActor &&
m_hActor->IsAppliedThisStateBlow(STATE_BLOW::BLOW_269) &&
m_iGlobalSkillGroupID > 0)
{
DNVector(DnBlowHandle) vlBlows;
m_hActor->GatherAppliedStateBlowByBlowIndex(STATE_BLOW::BLOW_269, vlBlows);
{
int nCount = (int)vlBlows.size();
for (int i = 0; i < nCount; ++i)
{
DnBlowHandle hBlow = vlBlows[i];
if (hBlow && hBlow->IsEnd() == false)
{
fGlobalCoolTimeRate += hBlow->GetFloatValue();
}
}
}
}
fDelayTime -= fDelayTime * fGlobalCoolTimeRate;
}
return fDelayTime;
#else
if( 0.0f < m_fAnotherGlobalSkillCoolTime )
return m_fAnotherGlobalSkillCoolTime;
return m_fDelayTime[ m_iSelectedSkillLevelDataApplyType ];
#endif // PRE_ADD_TOTAL_LEVEL_SKILL
}
void CDnSkill::OnBeginCoolTime()
{
m_dwLastUseSkillTimeStamp = timeGetTime();
m_fCoolTime = (GetDelayTime() == 0.0f) ? 0.0f : 1.0f;
m_fCoolTimeAdjustBlowValue = 1.0f;
m_fLeftDelayTime = GetDelayTime()*m_fCoolTimeAdjustBlowValue;
m_fLeftDelayTime *= m_fCoolTimeMultipier;
// [2011/03/09 semozz]
// <20><><EFBFBD><EFBFBD><EFBFBD>Ҷ<EFBFBD> LeftDelayTime<6D><65> 0.0<EFBFBD><EFBFBD> <20>Ǹ<EFBFBD> m_fCoolTime<6D><65> 0.0f<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD><D8BE>Ѵ<EFBFBD>.
// <20>׷<EFBFBD><D7B7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> 1.0<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.(Process<73>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD> m_fLeftDelayTime<6D><65> 0<≯<EFBFBD> CoolTime<6D><65><EFBFBD>žȵ<C5BE>.
if (m_fLeftDelayTime == 0.0f)
{
m_fCoolTime = 0.0f;
#if defined(PRE_ADD_TOTAL_LEVEL_SKILL)
m_fDeltaGlobalCoolTime = 0.0f;
#endif // PRE_ADD_TOTAL_LEVEL_SKILL
}
}
void CDnSkill::_OnBeginProcessException( void )
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¿<EFBFBD><C2BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ٷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ǯ<><C7AE><EFBFBD>ش<EFBFBD>. #12438
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20>ɸ<EFBFBD> <20><><EFBFBD>¿<EFBFBD><C2BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> self <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <20><>ų<EFBFBD><C5B3>
// <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ϲ<EFBFBD>ȭ <20><>Ŵ.
if( m_hActor &&
(
m_hActor->IsAppliedThisStateBlow( STATE_BLOW::BLOW_041 ) ||
m_hActor->IsAppliedThisStateBlow( STATE_BLOW::BLOW_146 ) ||
m_hActor->IsAppliedThisStateBlow( STATE_BLOW::BLOW_218 ) //#53900 Escape<70><65>ų <20>߰<EFBFBD>
))
{
int iNumStateBlow = (int)m_vlStateEffectList[ m_iSelectedSkillLevelDataApplyType ].size();
for( int i = 0; i < iNumStateBlow; ++i )
{
const StateEffectStruct& SE = m_vlStateEffectList[ m_iSelectedSkillLevelDataApplyType ].at( i );
if( STATE_BLOW::BLOW_069 == SE.nID &&
StateEffectApplyType::ApplySelf == SE.ApplyType )
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ǯ<><C7AE><EFBFBD>ش<EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ƾ<EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD> <20><><EFBFBD>ư<EFBFBD><C6B0><EFBFBD>
// <20>׼<EFBFBD><D7BC><EFBFBD> <20><><EFBFBD>ư<EFBFBD><C6B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EEB0A3>.
while( 0 < m_hActor->GetFrameStopRefCount() )
m_hActor->RemovedFrameStop();
break;
}
}
}
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD>
ClearStigmaStateEffect();
}
void CDnSkill::ClearStigmaStateEffect()
{
//////////////////////////////////////////////////////////////////////////
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD> Ȯ<><C8AE>...
bool hasStigmaState = false;
int nListCount = (int)m_vlStateEffectList[m_iSelectedSkillLevelDataApplyType].size();
for (int i = 0; i < nListCount; ++i)
{
const StateEffectStruct& SE = m_vlStateEffectList[ m_iSelectedSkillLevelDataApplyType ].at( i );
if (SE.nID == STATE_BLOW::BLOW_246)
{
hasStigmaState = true;
break;
}
}
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ȿ<><C8BF><EFBFBD><EFBFBD> ã<>Ƽ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ش<EFBFBD>...
if (hasStigmaState == true)
{
DNVector(DnActorHandle) hVecList;
m_hActor->ScanActor(m_hActor->GetRoom(), *m_hActor->GetPosition(), FLT_MAX, hVecList);
int nActorCount = (int)hVecList.size();
for (int i = 0; i < nActorCount; ++i)
{
DnActorHandle hActor = hVecList[i];
if (hActor && hActor->IsDie() == false && hActor->IsAppliedThisStateBlow(STATE_BLOW::BLOW_246))
{
DNVector(DnBlowHandle) vlhBlows;
hActor->GetStateBlow()->GetStateBlowFromBlowIndex( STATE_BLOW::BLOW_246, vlhBlows );
int iNumBlow = (int)vlhBlows.size();
for( int j = 0; j < iNumBlow; ++j )
{
DnBlowHandle hBlow = vlhBlows[j];
if (hBlow && hBlow->IsEnd() == false)
{
CDnSkill::SkillInfo* pSkillInfo = const_cast<CDnSkill::SkillInfo*>(hBlow->GetParentSkillInfo());
if (pSkillInfo && pSkillInfo->hSkillUser == m_hActor)
{
int nBlowID = hBlow->GetBlowID();
hActor->SendRemoveStateEffectFromID(nBlowID); //<2F><><EFBFBD><EFBFBD> <20><>Ŷ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
hActor->GetStateBlow()->RemoveImediatlyStateEffectFromID(nBlowID); //<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
}
}
}
}
}
}
//////////////////////////////////////////////////////////////////////////
}
// <20><>ų<EFBFBD><C5B3> <20>޷<EFBFBD><DEB7>ִ<EFBFBD> Processor <20><> <20>߿<EFBFBD> <20><>ó<EFBFBD><C3B3> <20>ؾ<EFBFBD><D8BE>ϴ<EFBFBD> <20>͵<EFBFBD> <20><><EFBFBD><EFBFBD> ó<><C3B3>.
void CDnSkill::CheckProcessorOnBegin( void )
{
CheckChangeActionStrByBubbleProcessor();
CheckStateEffectApplyOnOffByBubbleProcessor();
}
void CDnSkill::CheckChangeActionStrByBubbleProcessor( void )
{
CDnChangeActionStrByBubbleProcessor* pProcessor = static_cast<CDnChangeActionStrByBubbleProcessor*>(GetProcessor( IDnSkillProcessor::CHANGE_ACTIONSTR_BY_BUBBLE ));
if( pProcessor )
{
bool bChanged = false;
const char* pChangedActionName = pProcessor->GetChangeActionNameAndRemoveNeedBubble( &bChanged );
if( bChanged )
{
// <20>׼<EFBFBD><D7BC><EFBFBD> <20>ٲ<EFBFBD><D9B2>ش<EFBFBD>.
CDnPlayAniProcess* pPlayAniProcessor = static_cast<CDnPlayAniProcess*>(GetProcessor( IDnSkillProcessor::PLAY_ANI ));
if (pPlayAniProcessor)
pPlayAniProcessor->ChangeActionNameOnce( pChangedActionName );
}
}
}
void CDnSkill::CheckStateEffectApplyOnOffByBubbleProcessor( void )
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ű<EFBFBD><C5B0> Processor
CDnStateEffectApplyOnOffByBubbleProcessor* pProcessor = static_cast<CDnStateEffectApplyOnOffByBubbleProcessor*>(GetProcessor(IDnSkillProcessor::STATE_EFFECT_APPLY_ONOFF_BY_BUBBLE));
if( pProcessor )
{
pProcessor->SelectAvailableSE( m_vlStateEffectList[ m_iSelectedSkillLevelDataApplyType ] );
}
}
void CDnSkill::OnBegin( LOCAL_TIME LocalTime, float fDelta )
{
ApplyAddtionalStateInfo();
// <20><><EFBFBD>ϵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD> <20>޽<EFBFBD><DEBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
boost::shared_ptr<IDnObserverNotifyEvent> pNotifyEvent( new CDnUseSkillMessage );
boost::shared_ptr<CDnUseSkillMessage> pSkillUseEvent = shared_polymorphic_downcast<CDnUseSkillMessage>( pNotifyEvent );
pSkillUseEvent->SetSkillID( m_iSkillID );
CDnObservable::Notify( pNotifyEvent );
CheckProcessorOnBegin();
// <20><><EFBFBD><EFBFBD> <20>۷ι<DBB7> ID <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>ٸ<EFBFBD> <20>۷ι<DBB7> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD> <20><><EFBFBD>õ<EFBFBD> <20><>Ÿ<EFBFBD><C5B8> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
m_fAnotherGlobalSkillCoolTime = 0.0f;
m_nAnotherGlobakSkillID = 0;
m_SkillStartTime = LocalTime;
//m_LastAuraCheckTime = 0;
#if defined( PRE_ADD_ACADEMIC ) // <20><>ȯ<EFBFBD><C8AF> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ƽ<EFBFBD><C6BC> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD>ʿ䰡 <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.
if(m_eDurationType != DurationTypeEnum::ActiveToggleForSummon)
//OnBeginCoolTime();
{
//--------------------------------------------------
//[debug_skill] server
//<2F><><EFBFBD>ܴ<EFBFBD><DCB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//Ѹ<><D1B8>ն=6001 <20><><EFBFBD>ζ<EFBFBD><CEB6><EFBFBD>=6003 <20><EFBFBD><ECBDB5><EFBFBD><EFBFBD>=6204 <20><><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD>=6208
if ( 6001 == GetClassID() || 6003 == GetClassID() || 6204 == GetClassID() || 6208 == GetClassID() )
{
//int nSkillID = GetClassID();
}
else
{
OnBeginCoolTime();
}
//--------------------------------------------------
}
#else
//--------------------------------------------------
//[debug_skill] server
//<2F><><EFBFBD>ܴ<EFBFBD><DCB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//Ѹ<><D1B8>ն=6001 <20><><EFBFBD>ζ<EFBFBD><CEB6><EFBFBD>=6003 <20><EFBFBD><ECBDB5><EFBFBD><EFBFBD>=6204 <20><><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD>=6208
if ( 6001 == GetClassID() || 6003 == GetClassID() || 6204 == GetClassID() || 6208 == GetClassID() )
{
int nSkillID = GetClassID();
}
else
{
OnBeginCoolTime();
}
//--------------------------------------------------
#endif
m_LastTimeToggleMPDecreaseTime = LocalTime;
m_bFinished = false;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ҹ<EFBFBD><D2B8><EFBFBD> <20><><EFBFBD>õǾ<C3B5><C7BE>ִٸ<D6B4> <20>Ҹ<EFBFBD><D2B8>ϵ<EFBFBD><CFB5><EFBFBD> ó<><C3B3>.
bool bCheckNeedItem = true;
if( GetRoom() && bIsExtremitySkill() && static_cast<CDNGameRoom*>(GetRoom())->bIsLadderRoom() ) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ñر<C3B1> <20><>ų
bCheckNeedItem = false;
if( bCheckNeedItem && m_iNeedItemID[ m_iSelectedSkillLevelDataApplyType ] > 0 )
{
if( m_hActor && m_hActor->IsPlayerActor() )
{
CDNUserItem* pUserItem = static_cast<CDnPlayerActor*>(m_hActor.GetPointer())->GetUserSession()->GetItem();
//int iNeedItemSlotIndex = pUserItem->FindInventorySlot( m_iNeedItemID, m_iNeedItemDecreaseCount );
if (!pUserItem->DeleteInventoryByItemID( m_iNeedItemID[ m_iSelectedSkillLevelDataApplyType ], m_iNeedItemDecreaseCount[ m_iSelectedSkillLevelDataApplyType ], DBDNWorldDef::UseItem::Use )) return;
}
}
if( ActiveToggle != m_eDurationType && TimeToggle != m_eDurationType && ActiveToggleForSummon != m_eDurationType )
{
CheckAndAddSelfStateEffect();
}
int iNumProcessor = (int)m_vlpProcessors[ m_iSelectedSkillLevelDataApplyType ].size();
for( int iProcessor = 0; iProcessor < iNumProcessor; ++iProcessor )
{
IDnSkillProcessor* pProcessor = m_vlpProcessors[ m_iSelectedSkillLevelDataApplyType ].at( iProcessor );
pProcessor->OnBegin( LocalTime, fDelta, GetMySmartPtr() );
}
if( false == m_bItemSkill )
{
m_hActor->SetSkillSuperAmmor( int(m_hActor->GetSuperAmmor() * m_fStartSuperArmor) );
m_hActor->SetHittable( m_bStartCanHit );
}
// <20><>ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ȳ ó<><C3B3>.
_OnBeginProcessException();
if( m_hActor->IsPlayerActor() && 0.0f != m_fResetCooltime )
{
int nRand = _rand(m_hActor->GetRoom())%100;
if( nRand < (int)(m_fResetCooltime * 100) )
{
static_cast<CDnPlayerActor*>(m_hActor.GetPointer())->RequestCooltimeReset( m_iSkillID );
m_fCoolTime = 0.0f;
m_fLeftDelayTime = 0.0f;
#if defined(PRE_ADD_TOTAL_LEVEL_SKILL)
m_fDeltaGlobalCoolTime = 0.0f;
#endif // PRE_ADD_TOTAL_LEVEL_SKILL
}
}
#if defined(PRE_ADD_50903)
//<2F><>ų <20><><EFBFBD>۵ɶ<DBB5> <20><><EFBFBD><EFBFBD> <20><>Ŵ..
SetHitCountForVarianceDamage(0);
#endif // PRE_ADD_50903
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20>ߵ<EFBFBD> <20>Ǿ<EFBFBD><C7BE><EFBFBD> <20>ÿ<EFBFBD> ó<><C3B3>
void CDnSkill::ProcessExecute( LOCAL_TIME LocalTime, float fDelta )
{
switch( m_eDurationType )
{
case DurationTypeEnum::TimeToggle:
break;
case DurationTypeEnum::Aura:
break;
}
// <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD> ó<><C3B3>
int iNumProcessor = (int)m_vlpProcessors[ m_iSelectedSkillLevelDataApplyType ].size();
for( int iProcessor = 0; iProcessor < iNumProcessor; ++iProcessor )
{
IDnSkillProcessor* pProcessor = m_vlpProcessors[ m_iSelectedSkillLevelDataApplyType ].at( iProcessor );
pProcessor->Process( LocalTime, fDelta );
}
// -1 <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ó<><C3B3> <20><><EFBFBD><EFBFBD>Ű<EFBFBD><C5B0> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִµ<D6B4><C2B5><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ߵ<EFBFBD><DFB5>Ǵ<EFBFBD> <20><>ų.
if( -1.0f != m_fPassiveActionSkillLength )
{
m_fPassiveActionSkillLength -= fDelta;
if( m_fPassiveActionSkillLength < 0.0f )
{
m_fPassiveActionSkillLength = 0.0f;
}
}
}
void CDnSkill::OnEnd( LOCAL_TIME LocalTime, float fDelta )
{
CheckAndRemoveInstantApplySelfStateEffect();
//<2F><><EFBFBD>ξ<CEBE><EEBFA1> <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD> ȿ<><C8BF> <20><><EFBFBD><EFBFBD>
RemovePrefixBlow();
int iNumProcessor = (int)m_vlpProcessors[ m_iSelectedSkillLevelDataApplyType ].size();
for( int iProcessor = 0; iProcessor < iNumProcessor; ++iProcessor )
{
IDnSkillProcessor* pProcessor = m_vlpProcessors[ m_iSelectedSkillLevelDataApplyType ].at( iProcessor );
pProcessor->OnEnd( LocalTime, fDelta );
}
m_SkillInfo->bIgnoreImmune = m_isIgnoreImmuneBackup;
CheckProcessorOnEnd();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD><C2B6><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
if( m_bEnchantedFromBubble )
{
ReleaseEnchantSkill();
m_bEnchantedFromBubble = false;
}
RemoveAddtionalStateInfo();
#if defined(PRE_FIX_64312)
if (m_isAppliedSummonMonsterEnchantSkill == true)
{
ReleaseEnchantSkill();
m_isAppliedSummonMonsterEnchantSkill = false;
}
#endif // PRE_FIX_64312
}
void CDnSkill::CheckProcessorOnEnd( void )
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ű<EFBFBD><C5B0> Processor
CDnStateEffectApplyOnOffByBubbleProcessor* pProcessor = static_cast<CDnStateEffectApplyOnOffByBubbleProcessor*>(GetProcessor(IDnSkillProcessor::STATE_EFFECT_APPLY_ONOFF_BY_BUBBLE));
if( pProcessor )
{
pProcessor->RestoreSEList( m_vlStateEffectList[ m_iSelectedSkillLevelDataApplyType ] );
}
}
// <20><> Ÿ<><C5B8> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3>
void CDnSkill::Process( LOCAL_TIME LocalTime, float fDelta )
{
if( TIME_ACCELERATION_SKILL_ID != m_iSkillID && SPRIT_BOOST_SKILL_ID != m_iSkillID )
fDelta *= m_hActor->GetCoolTimeDeltaAdjustValue();
float fTempAdjustValue = m_fCoolTimeAdjustBlowValue;
fTempAdjustValue *= m_fCoolTimeMultipier;
switch( m_eDurationType )
{
case DurationTypeEnum::Instantly:
case DurationTypeEnum::Buff:
case DurationTypeEnum::Debuff:
case DurationTypeEnum::SummonOnOff:
case DurationTypeEnum::StanceChange:
{
if( 0.0f == m_fOnceElapsedDelayTime )
{
if( m_fLeftDelayTime == 0.0f ) return;
m_fLeftDelayTime -= fDelta;
if( m_fLeftDelayTime < 0.f )
{
m_fLeftDelayTime = 0.f;
#if defined(PRE_ADD_TOTAL_LEVEL_SKILL)
m_fDeltaGlobalCoolTime = 0.0f;
#endif // PRE_ADD_TOTAL_LEVEL_SKILL
}
// [2011/03/09 semozz]
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF> <20><>ų<EFBFBD><C5B3> <20><>Ÿ<EFBFBD>ӿ<EFBFBD> <20><><EFBFBD><EFBFBD> fTempAdjustValue<75><65> 0<>̵Ǵ<CCB5> <20><><EFBFBD><20>߻<EFBFBD>..
// <20><><EFBFBD><EFBFBD> ó<><C3B3> <20>߰<EFBFBD>
float fTempDelayTime = (GetDelayTime()*fTempAdjustValue);
if (fTempDelayTime == 0.0f)
m_fCoolTime = 0.0f;
else
m_fCoolTime = ( 1.0f / fTempDelayTime ) * m_fLeftDelayTime;
}
else
{
if( m_fOnceElapsedDelayTime == 0.0f )
{
m_fOnceDelayTime = 0.0f;
return;
}
m_fOnceElapsedDelayTime -= fDelta;
if( m_fOnceElapsedDelayTime < 0.0f )
m_fOnceElapsedDelayTime = 0.0f;
m_fCoolTime = ( 1.0f / (m_fOnceDelayTime*m_fCoolTimeAdjustBlowValue) ) * m_fOnceElapsedDelayTime;
}
}
break;
case DurationTypeEnum::TimeToggle:
break;
case DurationTypeEnum::ActiveToggle:
case DurationTypeEnum::ActiveToggleForSummon:
break;
case DurationTypeEnum::Aura:
break;
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><C2B6><EFBFBD> <20><><EFBFBD>õ<EFBFBD> <20>۷ι<DBB7> <20><>ų <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
if( 0.0f < m_fAnotherGlobalSkillCoolTime && 0.0f == m_fCoolTime )
{
m_fAnotherGlobalSkillCoolTime = 0.0f;
m_nAnotherGlobakSkillID = 0;
}
}
bool CDnSkill::IsFinished( void )
{
bool bResult = false;
// <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD>̶<EFBFBD><CCB6><EFBFBD> <20><> <20>̵<EFBFBD> <20>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
if( Aura == m_eDurationType )
return IsFinishedAuraSkill();
if( m_bFinished )
return m_bFinished;
if( m_bChainingPassiveSkill )
return false;
// MP <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ҹ<EFBFBD><D2B8>ϴ<EFBFBD> <20><>ų<EFBFBD>ϰ<EFBFBD><CFB0><EFBFBD> <20><><EFBFBD>Ǹ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD>ݴϴ<DDB4>.
if( 0.0f < m_fPassiveActionSkillLength || -1.0f == m_fPassiveActionSkillLength )
{
float fDecreaseMPRatio = 0.f;
DNVector( DnBlowHandle ) vlhBlows;
m_hActor->GatherAppliedStateBlowByBlowIndex( STATE_BLOW::BLOW_014, vlhBlows );
for( DWORD i=0; i<vlhBlows.size(); i++ )
{
if( vlhBlows[i] && vlhBlows[i]->GetParentSkillInfo()->iSkillID == GetClassID() )
{
fDecreaseMPRatio = vlhBlows[i]->GetFloatValue();
break;
}
}
if( m_hActor->GetSP() < m_iNeedMP[ m_iSelectedSkillLevelDataApplyType ] && fDecreaseMPRatio < 0.f )
return true;
return false;
}
#ifdef PRE_FIX_76603
if( m_hActor->IsAppliedThisStateBlow( STATE_BLOW::BLOW_232 ) )
{
DNVector(DnBlowHandle) vlBlows;
m_hActor->GatherAppliedStateBlowByBlowIndex(STATE_BLOW::BLOW_232, vlBlows);
for (DWORD i = 0; i < vlBlows.size(); i++)
{
if( vlBlows[i] )
{
CDnTransformBlow *pTransformBlow = static_cast<CDnTransformBlow*>( vlBlows[i].GetPointer() );
if( pTransformBlow && pTransformBlow->GetParentSkillInfo()->iSkillID == GetClassID() )
{
if( pTransformBlow->CheckSkillDefendency() == true )
return false;
}
}
}
}
#endif
if( m_vlpProcessors[ m_iSelectedSkillLevelDataApplyType ].empty() )
bResult = true;
else
{
int iNumProcessor = (int)m_vlpProcessors[ m_iSelectedSkillLevelDataApplyType ].size();
for( int iProcessor = 0; iProcessor < iNumProcessor; ++iProcessor )
{
IDnSkillProcessor* pProcessor = m_vlpProcessors[ m_iSelectedSkillLevelDataApplyType ].at( iProcessor );
if( true == pProcessor->IsFinished() )
bResult = true;
else
{
bResult = false;
break;
}
}
}
// lazy evaluation
m_bFinished = bResult;
return bResult;
}
IDnSkillProcessor* CDnSkill::GetProcessor( int iType )
{
IDnSkillProcessor* pResult = NULL;
int iNumProcessor = (int)m_vlpProcessors[ m_iSelectedSkillLevelDataApplyType ].size();
for( int iProcessor = 0; iProcessor < iNumProcessor; ++iProcessor )
{
IDnSkillProcessor* pSkillProcessor = m_vlpProcessors[ m_iSelectedSkillLevelDataApplyType ].at( iProcessor );
if( iType == pSkillProcessor->GetType() )
{
pResult = pSkillProcessor;
break;
}
}
return pResult;
}
IDnSkillProcessor* CDnSkill::GetProcessor( int iType, int iLevelDataApplyType )
{
IDnSkillProcessor* pResult = NULL;
int iNumProcessor = (int)m_vlpProcessors[ iLevelDataApplyType ].size();
for( int iProcessor = 0; iProcessor < iNumProcessor; ++iProcessor )
{
IDnSkillProcessor* pSkillProcessor = m_vlpProcessors[ iLevelDataApplyType ].at( iProcessor );
if( iType == pSkillProcessor->GetType() )
{
pResult = pSkillProcessor;
break;
}
}
return pResult;
}
void CDnSkill::CheckTargetCount( int iTargetActorCount )
{
// <20>ϴ<EFBFBD><CFB4><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD≯<EFBFBD><CCB8><EFBFBD><EEBFA1><EFBFBD><EFBFBD> <20><><EFBFBD>̰<EFBFBD> <20><> <20><><EFBFBD><EFBFBD>..
IDnSkillProcessor* pProcessor = GetProcessor( IDnSkillProcessor::DIVIDE_STATE_EFFECT_ARG );
if( pProcessor )
{
// <20><EFBFBD><EAB7B9> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD>̺<EFBFBD><CCBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ÿ<><C5B8><EFBFBD><EFBFBD><EFBFBD>θ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0>ϰ<EFBFBD> <20>մϴ<D5B4>.
_ASSERT( "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>κ<EFBFBD><CEBA><EFBFBD> <20><EFBFBD><EAB7B9> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Դϴ<D4B4>..." && m_iSkillID == 3004 );
CDnDivideSEArgumentByTargets* pDivideSEProcessor = static_cast<CDnDivideSEArgumentByTargets*>(pProcessor);
int iSEArgument = pDivideSEProcessor->GetStateEffectArgument();
// <20>ڱ<EFBFBD> <20>ڽű<DABD><C5B1><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20>ϳ<EFBFBD> <20><> <20>߰<EFBFBD>
int iDividedValue = iSEArgument / (iTargetActorCount+1);
int iNumStateEffect = (int)m_vlStateEffectList[ m_iSelectedSkillLevelDataApplyType ].size();
char acBuf[ 256 ];
for( int iStateEffect = 0; iStateEffect < iNumStateEffect; ++iStateEffect )
{
ZeroMemory( acBuf, sizeof(acBuf) );
StateEffectStruct& StateEffect = m_vlStateEffectList[ m_iSelectedSkillLevelDataApplyType ].at( iStateEffect );
itoa( iDividedValue, acBuf, 10 );
StateEffect.szValue.assign( acBuf );
// <20>ڱ<EFBFBD> <20>ڽſ<DABD><C5BF>Ե<EFBFBD> <20>߰<EFBFBD>
int iID = m_hActor->CmdAddStateEffect( /*m_hActor,*/ GetInfo(), (STATE_BLOW::emBLOW_INDEX)StateEffect.nID,
StateEffect.nDurationTime, StateEffect.szValue.c_str() );
}
}
#if defined(PRE_ADD_50903)
SetHitCountForVarianceDamage(iTargetActorCount);
#endif // PRE_ADD_50903
}
void CDnSkill::CheckAndAddSelfStateEffect( void )
{
map<int, bool> mapDuplicateResult; // <20>ڱ<EFBFBD> <20>ڽſ<DABD><C5BF><EFBFBD> <20>Ŵ<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ȯ<><C8AE> <20><>ø ó<><C3B3> <20><><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
CanApply eResult = CDnSkill::CanApplySkillStateEffect( m_hActor, GetMySmartPtr(), mapDuplicateResult );
if( CanApply::Fail != eResult )
{
int nID(-1);
StateEffectStruct *pStruct(NULL);
// Note <20>ѱ<EFBFBD>: 2009.12.21
// <20>ڽſ<DABD><C5BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> ȿ<><C8BF> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD> <20><><EFBFBD><EFBFBD> (#1911)
// <20>ڱ<EFBFBD> <20>ڽſ<DABD><C5BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD> <20>ñ׳<C3B1><D7B3><EFBFBD> ã<>Ƽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
// <20><><EFBFBD><EFBFBD> <20>нú<D0BD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD>쿣 playaniprocessor <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>κп<CEBA><D0BF><EFBFBD> <20>ɷ<EFBFBD><C9B7><EFBFBD><EFBFBD><EFBFBD>.
// <20>ڱ<EFBFBD> <20>ڽſ<DABD><C5BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> Ÿ<>̹<EFBFBD> <20>ñ׳<C3B1><D7B3><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ŀ<EFBFBD> <20>нú<D0BD><C3BA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>׼<EFBFBD> <20><>ų<EFBFBD><20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> Ÿ<>̹<EFBFBD> <20>ñ׳<C3B1><D7B3><EFBFBD> <20>ʿ<EFBFBD><CABF>ϴٸ<CFB4>
// <20>߰<EFBFBD><DFB0><EFBFBD><EFBFBD><EFBFBD> <20>۾<EFBFBD><DBBE><EFBFBD> <20>ʿ<EFBFBD><CABF>ϴ<EFBFBD>.
bool bUseApplySelfStateBlowSignal = false;
CDnPlayAniProcess* pPlayAniProcessor = static_cast<CDnPlayAniProcess*>(GetProcessor( IDnSkillProcessor::PLAY_ANI ));
if( pPlayAniProcessor )
{
const char* pActionName = pPlayAniProcessor->GetActionName();
CEtActionBase::ActionElementStruct* pActionElement = m_hActor->GetElement( pActionName );
_ASSERT( pActionElement );
if( pActionElement )
{
int iApplyStateEffectSignalCount = 0;
int iNumSignal = (int)pActionElement->pVecSignalList.size();
for( int iSignal = 0; iSignal < iNumSignal; ++iSignal )
{
CEtActionSignal* pSignal = pActionElement->pVecSignalList.at( iSignal );
if( STE_ApplyStateEffect == pSignal->GetSignalIndex() )
{
bUseApplySelfStateBlowSignal = true;
++iApplyStateEffectSignalCount;
}
}
}
}
for( DWORD i=0; i<m_vlStateEffectList[ m_iSelectedSkillLevelDataApplyType ].size(); i++ )
{
pStruct = &m_vlStateEffectList[ m_iSelectedSkillLevelDataApplyType ][ i ];
if( !pStruct )
continue;
// <20><><EFBFBD><EFBFBD>Ÿ<EFBFBD>Կ<EFBFBD><D4BF><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20>߰<EFBFBD><DFB0><EFBFBD> <20><>Ʈ<EFBFBD><C6AE> <20>ϴ<EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD>. (<28><><EFBFBD><EFBFBD>ũ<EFBFBD><C5A9><EFBFBD><EFBFBD> <20>ظӸ<D8B8>)
if( pStruct->bApplyInProcessor )
continue;
if( pStruct->ApplyType == ApplySelf )
{
// <20>׼<EFBFBD><D7BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <20>ڱ<EFBFBD> <20>ڽſ<DABD><C5BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF>.
if( 0 == pStruct->nDurationTime || -1 == pStruct->nDurationTime )
{
// <20><><EFBFBD>̺<EFBFBD><CCBA><EFBFBD><EFBFBD><EFBFBD> 0<><30><EFBFBD><EFBFBD> <20>ϳ<EFBFBD> -1<><31> <20>ϳ<EFBFBD> <20><><EFBFBD>α׷<CEB1><D7B7>ʿ<EFBFBD><CABF><EFBFBD> -1<><31> <20><><EFBFBD>ؽ<EFBFBD>Ŵ
pStruct->nDurationTime = -1;
// <20>ѱ<EFBFBD> 2009.7.27
// <20>ڽſ<DABD><C5BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> ȿ<><C8BF> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD> <20><><EFBFBD><EFBFBD> (#1911)
// <20><>ų <20><>ȭ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴϹǷ<CFB9>
// <20>ڱ<EFBFBD> <20>ڽſ<DABD><C5BF><EFBFBD> <20>Ŵ<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> Ÿ<>̹<EFBFBD> <20>ñ׳<C3B1><D7B3><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD>ٷ<EFBFBD> <20>߰<EFBFBD>.
if( bUseApplySelfStateBlowSignal && (0 == pStruct->nGlyphID) )
{
StateEffectStruct InstantSelfStateEffect = *pStruct;
InstantSelfStateEffect.nDurationTime = pStruct->nDurationTime;
m_hActor->AddStateEffectQueue( *GetInfo(), InstantSelfStateEffect );
SetAddStateEffectQueue(true);
}
else
{
// [2010/12/13 semozz]
// <20><><EFBFBD><EFBFBD> <20><>Ŷ <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD> <20>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD> ȿ<><C8BF><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> m_vlApplyNoPacketStateEffectList<73><74> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>µ<EFBFBD>,
// <20><>Ŷ<EFBFBD><C5B6><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD>, m_vlApplyNoPacketStateEffectList<73><74> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>´<EFBFBD>.
// #32160 <20>ٲ<EFBFBD> <20><>ų <20><>ø ó<><C3B3> <20><>ƾ<EFBFBD><C6BE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ǵ<EFBFBD><C7B5><EFBFBD> ó<><C3B3>.
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ӹ<EFBFBD> <20>ƴ϶<C6B4> ApplyStateEffect <20>ñ׳<C3B1> <20><> <20>پ<EFBFBD><D9BE>ִ<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><20>ٷ<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20>߰<EFBFBD> <20>ǹǷ<C7B9> <20><><EFBFBD>ߵ<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
m_hActor->RemoveResetStateBlow();
nID = m_hActor->CmdAddStateEffect( GetInfo(), (STATE_BLOW::emBLOW_INDEX)pStruct->nID, pStruct->nDurationTime, pStruct->szValue.c_str() );
if( -1 == nID )
continue;
// Note <20>ѱ<EFBFBD>: <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ÿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>޾Ƽ<DEBE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD>.. HP <20><><EFBFBD><EFBFBD> Ʋ<><C6B2><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
if( m_bItemSkill )
{
DnBlowHandle hBlow = m_hActor->GetStateBlowFromID( nID );
hBlow->OnBegin( 0, 0.0f );
#ifndef _GAMESERVER
if( hBlow->IsUseTableDefinedGraphicEffect() )
hBlow->AttachGraphicEffectDefaultType();
#endif
m_hActor->OnBeginStateBlow( hBlow );
hBlow->SetState( STATE_BLOW::STATE_DURATION );
}
m_vlApplySelfNoDurationStateEffectList.push_back( nID );
}
}
else
{
// <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20>ִ<EFBFBD> self <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF>
if( bUseApplySelfStateBlowSignal && (0 == pStruct->nGlyphID) )
{
m_hActor->AddStateEffectQueue( *GetInfo(), *pStruct );
SetAddStateEffectQueue(true);
}
else
{
// #32160 <20>ٲ<EFBFBD> <20><>ų <20><>ø ó<><C3B3> <20><>ƾ<EFBFBD><C6BE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ǵ<EFBFBD><C7B5><EFBFBD> ó<><C3B3>.
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ӹ<EFBFBD> <20>ƴ϶<C6B4> ApplyStateEffect <20>ñ׳<C3B1> <20><> <20>پ<EFBFBD><D9BE>ִ<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><20>ٷ<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20>߰<EFBFBD> <20>ǹǷ<C7B9> <20><><EFBFBD>ߵ<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
m_hActor->RemoveResetStateBlow();
nID = m_hActor->CmdAddStateEffect( /*m_hActor,*/ GetInfo(), (STATE_BLOW::emBLOW_INDEX)pStruct->nID,
pStruct->nDurationTime, pStruct->szValue.c_str() );
if( -1 == nID )
continue;
}
}
}
}
}
}
void CDnSkill::CheckAndRemoveInstantApplySelfStateEffect( void )
{
for( DWORD i=0; i<m_vlApplySelfNoDurationStateEffectList.size(); i++ )
{
if( m_hActor )
m_hActor->CmdRemoveStateEffectFromID( m_vlApplySelfNoDurationStateEffectList[i] );
}
if( m_hActor )
{
// #40768 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> MASkillUser::m_hItemSkill <20><> MASkillUser::m_hProcessSkill <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>
// m_hItemSkill <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD><CAB4><EFBFBD><EFBFBD><EFBFBD> m_hProcessSkill <20><> <20><><EFBFBD>۵<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> <20><> <20><><EFBFBD>¿<EFBFBD><C2BF><EFBFBD>
// m_hItemSkill <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD> <20><> <20>Լ<EFBFBD><D4BC><EFBFBD> ȣ<><C8A3><EFBFBD>Ǹ<EFBFBD> m_hProcessSkill <20><> <20><><EFBFBD>ϵ<EFBFBD> BlowQueue <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȴ<EFBFBD>.
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> ó<><C3B3><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD> <20>Ѵ<EFBFBD>.
//#40760
//<2F><>ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̻<EFBFBD> <20><>ų <20>ߵ<EFBFBD><DFB5>ɶ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD> <20><><EFBFBD>ϵ<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD>
//<2F><><EFBFBD>̻<EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ʒ<EFBFBD> <20>Լ<EFBFBD> ȣ<><C8A3><EFBFBD><EFBFBD> <20><><EFBFBD>ؼ<EFBFBD> ť<><C5A5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20>߻<EFBFBD>.
//AddStateEffectQueueȣ<65><C8A3> <20><> SetAddStateEffectQueue(true)<29><> <20>÷<EFBFBD><C3B7><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
//<2F>÷<EFBFBD><C3B7>װ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD> <20>ִ<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> ť<><C5A5> <20>ʱ<EFBFBD>ȭ <20>ϵ<EFBFBD><CFB5><EFBFBD> <20>Ѵ<EFBFBD>..
if ( IsAddStateEffectQueue() )
m_hActor->ClearSelfStateSignalBlowQueue( IsItemSkill() );
}
SAFE_DELETE_VEC( m_vlApplySelfNoDurationStateEffectList );
}
DWORD CDnSkill::GetStateEffectCount( void )
{
return (DWORD)m_vlStateEffectList[ m_iSelectedSkillLevelDataApplyType ].size();
}
CDnSkill::StateEffectStruct* CDnSkill::GetStateEffectFromIndex( DWORD dwIndex )
{
if( dwIndex >= m_vlStateEffectList[ m_iSelectedSkillLevelDataApplyType ].size() ) return NULL;
return &m_vlStateEffectList[ m_iSelectedSkillLevelDataApplyType ][ dwIndex ];
}
bool CDnSkill::IsUseCheckerType( int iCheckerType )
{
bool bResult = false;
int iNumChecker = (int)m_vlpUsableCheckers[ m_iSelectedSkillLevelDataApplyType ].size();
for( int iChecker = 0; iChecker < iNumChecker; ++iChecker )
{
if( m_vlpUsableCheckers[ m_iSelectedSkillLevelDataApplyType ].at( iChecker )->GetType() == iCheckerType )
{
bResult = true;
break;
}
}
return bResult;
}
bool CDnSkill::IsUseProcessorType( int iProcessorType )
{
bool bResult = false;
int iNumProcessor = (int)m_vlpProcessors[ m_iSelectedSkillLevelDataApplyType ].size();
for( int iProcessor = 0; iProcessor < iNumProcessor; ++iProcessor )
{
if( m_vlpProcessors[ m_iSelectedSkillLevelDataApplyType ].at( iProcessor )->GetType() == iProcessorType )
{
bResult = true;
break;
}
}
return bResult;
}
CDnSkill::SkillTypeEnum CDnSkill::GetSkillType( int nSkillID )
{
if (nSkillID <= 0) return SkillTypeEnum::Active;
DNTableFileFormat* pSkillTable = GetDNTable( CDnTableDB::TSKILL );
if( pSkillTable->IsExistItem( nSkillID ) == false ) return SkillTypeEnum::Active;
return (SkillTypeEnum)pSkillTable->GetFieldFromLablePtr( nSkillID, "_SkillType" )->GetInteger();
}
bool CDnSkill::IsUseActionNames( const set<string>& setUseActionNames )
{
list<string> listIntersect;
set_intersection( setUseActionNames.begin(), setUseActionNames.end(),
m_setUseActionNames.begin(), m_setUseActionNames.end(),
back_inserter(listIntersect) );
return !listIntersect.empty();
}
void CDnSkill::_RefreshDecreaseMP( int iSkillLevelDataApplyType )
{
if( 0.0f == m_fMPConsumeType[ iSkillLevelDataApplyType ] )
{
if( !m_hActor || m_hActor->IsMonsterActor() ) {
m_iNeedMP[ iSkillLevelDataApplyType ] = m_iDecreaseMP[ iSkillLevelDataApplyType ];
return;
}
if( m_hActor->IsPlayerActor() )
{
#ifndef _ADD_NEW_MPCONSUME
float fRatio = 1.f;
if( m_hActor->GetLevel() > 0 )
{
int nJobClassID = ((CDnPlayerActor*)m_hActor.GetPointer())->GetJobClassID();
float fDecreaseRatio = CPlayerLevelTable::GetInstance().GetValueFloat( nJobClassID , m_hActor->GetLevel(), CPlayerLevelTable::SPDecreaseRatio );
fRatio = fDecreaseRatio * m_hActor->GetLevelWeightValue();
}
m_iNeedMP[ iSkillLevelDataApplyType ] = (int)( m_iDecreaseMP[ iSkillLevelDataApplyType ] * fRatio );
#else
m_iNeedMP[iSkillLevelDataApplyType] = (int)(m_iDecreaseMP[iSkillLevelDataApplyType]);
#endif
}
}
else
{
m_iNeedMP[ iSkillLevelDataApplyType ] = int((float)m_hActor->GetMaxSP() * m_fMPConsumeType[ iSkillLevelDataApplyType ]);
}
m_iOriginalNeedMP[ iSkillLevelDataApplyType ] = m_iNeedMP[ iSkillLevelDataApplyType ];
}
void CDnSkill::RefreshDecreaseMP( int iSkillLevelDataApplyType /*= NUM_SKILLLEVEL_APPLY_TYPE*/ )
{
if( iSkillLevelDataApplyType == NUM_SKILLLEVEL_APPLY_TYPE )
{
for( int iApplyType = PVE; iApplyType < NUM_SKILLLEVEL_APPLY_TYPE; ++iApplyType )
_RefreshDecreaseMP( iApplyType );
}
else
{
_RefreshDecreaseMP( iSkillLevelDataApplyType );
}
}
void CDnSkill::SetOnceCoolTime( float fDelayTime, float fElapsedDelayTime )
{
_ASSERT( fElapsedDelayTime <= fDelayTime );
m_fOnceDelayTime = fDelayTime;
m_fOnceElapsedDelayTime = fElapsedDelayTime;
}
void CDnSkill::SetPassiveSkillActionName( const char* pActionName )
{
if( pActionName )
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
m_setUseActionNames.insert( string(pActionName) );
}
}
// <20>̽<EFBFBD> #6190 <20><><EFBFBD><EFBFBD>.
CDnSkill::CanApply CDnSkill::CanApplySkillStateEffect( const SkillInfo* pUsingSkillInfo, DnActorHandle hTargetActor, int iSkillID, int iLevel,
int iSkillDuplicateMethod, int iDuplicateCount, map<int, bool>& mapDuplicateResult, bool isHitProcess )
{
// <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20>˻<EFBFBD><CBBB>Ҷ<EFBFBD> <20><><EFBFBD>¸<EFBFBD><C2B8><EFBFBD>Ʈ <20>ʱ<EFBFBD>ȭ [2010/12/09 semozz]
if (hTargetActor)
hTargetActor->InitStateBlowIDToRemove();
CDnSkill::CanApply eResult = CDnSkill::CanApply::Apply;
bool bExistingSameSkill = false;
int iExistingSameSkillCount = 0;
// <20>ߺ<EFBFBD><DFBA>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD>ŵ<EFBFBD> <20>ÿ<EFBFBD> <20><><EFBFBD>Ƶ״ٰ<D7B4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
// <20>ٸ<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20>ɷ<EFBFBD><C9B7>ִ<EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> <20>ݵ<EFBFBD><DDB5><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ο<EFBFBD><CEBF><EFBFBD><EFBFBD><EFBFBD> id <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
vector<int> vlStateBlowIDToRemove;
DNVector( DnBlowHandle ) vlhSameSkillBlows;
int iNumAppliedStateEffect = (int)hTargetActor->GetNumAppliedStateBlow();
for( int iAppliedStateEffect = 0; iAppliedStateEffect < iNumAppliedStateEffect; ++iAppliedStateEffect )
{
DnBlowHandle hExistingBlow = hTargetActor->GetAppliedStateBlow( iAppliedStateEffect );
const CDnSkill::SkillInfo* pExistingParentSkillInfo = NULL;
if( hExistingBlow )
pExistingParentSkillInfo = hExistingBlow->GetParentSkillInfo();
// <20><>ü <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20>ɸ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ƴϹǷ<CFB9> <20><><EFBFBD><20>ٷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴ<EFBFBD>
if( NULL == pExistingParentSkillInfo )
continue;
// <20><>ų <20>ߺ<EFBFBD> ī<><C4AB>Ʈ üũ
// <20><><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD>̵<EFBFBD><CCB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><> <20><>Ÿ<EFBFBD><C5B8><EFBFBD>ٸ<EFBFBD> <20>ߺ<EFBFBD><DFBA><EFBFBD> <20><>ų<EFBFBD><C5B3>.
bool bIsSameSkillID = false;
#if defined(PRE_FIX_58505)
//<2F><><EFBFBD>̻<EFBFBD> <20><>ų Ÿ<><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD>̵<EFBFBD><CCB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD>,
//<2F><><EFBFBD>̻<EFBFBD> <20><>ų Ÿ<><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̻<EFBFBD> <20><>ų Ÿ<><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
if ( pUsingSkillInfo->bItemPrefixSkill == true && pUsingSkillInfo->nPrefixSkillType != CDnPrefixSkill::Prefix_Non )
bIsSameSkillID = pUsingSkillInfo->nPrefixSkillType == pExistingParentSkillInfo->nPrefixSkillType;
else
bIsSameSkillID = iSkillID == pExistingParentSkillInfo->iSkillID;
#else
if( iSkillID == pExistingParentSkillInfo->iSkillID )
bIsSameSkillID = true;
#endif // PRE_FIX_58505
if (bIsSameSkillID == true)
{
// <20><><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD>̵<EFBFBD><CCB5><EFBFBD> ó<><C3B3> <20><><EFBFBD>´ٸ<C2B4> ó<><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų ī<><C4AB>Ʈ <20>ϳ<EFBFBD> <20>÷<EFBFBD><C3B7><EFBFBD>.
// #27335 - <20><>Ŭ<EFBFBD><C5AC> <20><><EFBFBD><EFBFBD> [2011/01/11 semozz]
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ũ<EFBFBD><C5A9><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> CantMove<76><65><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ŭ<EFBFBD><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><> <20>ڽſ<DABD> <20>ɸ<EFBFBD> CantMove<76><65><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><>ųID<49><44> <20><><EFBFBD>Ƽ<EFBFBD>
// <20><><EFBFBD><EFBFBD> <20><>ų <20>ߺ<EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20>ɸ<EFBFBD><C9B8><EFBFBD> <20><>..
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> ApplyType<70><65> Ȯ<><C8AE><EFBFBD>ؼ<EFBFBD>
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><> Actor<6F><72> TargetActor<6F><72> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD>
// <20><>ȿ<EFBFBD><C8BF> Actor<6F><72> <20><><EFBFBD><EFBFBD><EFBFBD>Ѱ<EFBFBD> <20>ƴϸ<C6B4> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20>ƴ<EFBFBD><C6B4><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
DnActorHandle hSkillUserActor = pUsingSkillInfo->hSkillUser;
DnSkillHandle hSkill;
if (hSkillUserActor)
hSkill = hSkillUserActor->FindSkill( iSkillID );
//Prop<6F><70><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD>.
if (hSkill)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><> <20>ϳ<EFBFBD><CFB3><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ÿ<><C5B8>.
StateEffectApplyType eExistingSEApplyType = ApplySelf;
bExistingSameSkill = true;
for( int i = 0; i < (int)hSkill->GetStateEffectCount(); ++i )
{
const StateEffectStruct* pSE = hSkill->GetStateEffectFromIndex( i );
if( pSE->nID == hExistingBlow->GetBlowIndex()
&& pSE->ApplyType == pExistingParentSkillInfo->eApplyType )
{
eExistingSEApplyType = pSE->ApplyType;
break;
}
}
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> applyType<70><65> <20><><EFBFBD><EFBFBD>
switch(eExistingSEApplyType)
{
case StateEffectApplyType::ApplySelf:
if (isHitProcess == false)
bExistingSameSkill = (hTargetActor == hSkillUserActor);
else
bExistingSameSkill = false;
break;
case StateEffectApplyType::ApplyEnemy:
bExistingSameSkill = (hTargetActor->GetTeam() != hSkillUserActor->GetTeam());
break;
case StateEffectApplyType::ApplyTarget:
bExistingSameSkill = (hTargetActor != hSkillUserActor);
break;
case StateEffectApplyType::ApplyFriend:
bExistingSameSkill = (hTargetActor->GetTeam() == hSkillUserActor->GetTeam());
break;
case StateEffectApplyType::ApplyAll:
bExistingSameSkill = true;
break;
}
}
else
bExistingSameSkill = true;
if( bExistingSameSkill )
{
iExistingSameSkillCount += hExistingBlow->GetDuplicateCount();
vlhSameSkillBlows.push_back( hExistingBlow );
}
}
if (pUsingSkillInfo->eTargetType == All //<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ϴ<EFBFBD> <20><>ų<EFBFBD><C5B3> TargetType<70><65> All<6C>̰<EFBFBD>,
&& (0 != iSkillDuplicateMethod && (iSkillDuplicateMethod == pExistingParentSkillInfo->iSkillDuplicateMethod)) //<2F><>ø ó<><C3B3>ID<49><44> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD> <20>ְ<EFBFBD>, <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID<49>϶<EFBFBD>,
&& (hTargetActor == pUsingSkillInfo->hSkillUser) //<2F>ڱ<EFBFBD> <20>ڽ<EFBFBD>
)
continue;
// <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> 0<><30> <20>ƴ϶<C6B4><CFB6><EFBFBD> <20><>ų ȿ<><C8BF> <20>ߺ<EFBFBD> <20><><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD>.
// <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> 0<≯<EFBFBD> <20>׳<EFBFBD> <20><>ø<EFBFBD><C3B8>.
// Ȥ<><C8A4> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD≯鼭 <20>ִ<EFBFBD> <20><>ø ī<><C4AB>Ʈ<EFBFBD><C6AE> 1<><31><EFBFBD><EFBFBD><EFBFBD>ΰ<EFBFBD><CEB0><20><>ų <20><>ü<EFBFBD>ǵ<EFBFBD><C7B5><EFBFBD> ó<><C3B3>.
#if defined(PRE_FIX_58505)
if( 0 != iSkillDuplicateMethod ||
(bIsSameSkillID == true && iDuplicateCount <= 1) )
#else
if( 0 != iSkillDuplicateMethod ||
(iSkillID == pExistingParentSkillInfo->iSkillID && iDuplicateCount <= 1) )
#endif // PRE_FIX_58505
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD> <20>ִ<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD>ΰ<EFBFBD>. <20>׷<EFBFBD><D7B7>ٸ<EFBFBD> <20><>ø<EFBFBD><C3B8> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> üũ<C3BC><C5A9><EFBFBD><EFBFBD><EEB0A3>.
// <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>øó<C3B8><C3B3><EFBFBD><EFBFBD> <20>ϵ<EFBFBD><CFB5><EFBFBD> <20>Ѵ<EFBFBD>.
// <20>ٸ<EFBFBD> <20><><EFBFBD>ε<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. (#19812)
if( (iSkillDuplicateMethod == pExistingParentSkillInfo->iSkillDuplicateMethod) &&
(pUsingSkillInfo->iSkillUserTeam == pExistingParentSkillInfo->iSkillUserTeam) )
{
if( iLevel >= pExistingParentSkillInfo->iLevel )
{
// 242<34><32> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20>ѹ<EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD> <20>Ǹ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ǹ<EFBFBD> <20>ȵȴ<C8B5>.
// Ȯ<><C8AE> üũ<C3BC><C5A9><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵٸ<D1B4> <20><><EFBFBD>½<EFBFBD>ų <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20>־<EFBFBD><D6BE><EFBFBD>.
// <20><><EFBFBD><EFBFBD> Ȯ<><C8AE>üũ<C3BC>ϴ<EFBFBD> <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE><EFBFBD><EFBFBD> üũ<C3BC>ϴ<EFBFBD> <20><><EFBFBD>̱<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20>״<EFBFBD><D7B4><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
if( hExistingBlow->CanBegin() )
{
bool isSelfStateEffect = false;
//#60966 <20>ڽſ<DABD><C5BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20>ٸ<EFBFBD><D9B8>̿<EFBFBD><CCBF><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
//<2F><>ų <20><><EFBFBD>ۿ<EFBFBD><DBBF><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, Hitó<74><C3B3><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD> self<6C><66><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
//<2F>׷<EFBFBD><D7B7><EFBFBD> <20><>Ʈ ó<><C3B3><EFBFBD>Ǵ<EFBFBD> <20>߿<EFBFBD> <20><><EFBFBD>⼭ self<6C><66><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>߰<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F>ٽ<EFBFBD> <20>߰<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
//<2F><>Ʈ ó<><C3B3><EFBFBD>ÿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>°<EFBFBD><C2B0><EFBFBD> Self<6C><66><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><>ŵ..
if (isHitProcess == true)
{
StateEffectApplyType eExistingSEApplyType = ApplySelf;
bool bCheck = false;
DnActorHandle hExistingSkillUserActor = pExistingParentSkillInfo->hSkillUser;
DnSkillHandle hSkill;
if (hExistingSkillUserActor)
hSkill = hExistingSkillUserActor->FindSkill( pExistingParentSkillInfo->iSkillID );
if (hSkill)
{
for( int i = 0; i < (int)hSkill->GetStateEffectCount(); ++i )
{
const StateEffectStruct* pSE = hSkill->GetStateEffectFromIndex( i );
if( pSE->nID == hExistingBlow->GetBlowIndex()
&& pSE->ApplyType == pExistingParentSkillInfo->eApplyType )
{
bCheck = true;
eExistingSEApplyType = pSE->ApplyType;
break;
}
}
//<2F>ڽſ<DABD><C5BF><EFBFBD> <20>Ŵ<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ϵ<EFBFBD><CFB5><EFBFBD>? <20>Ѵ<EFBFBD>..
if ( StateEffectApplyType::ApplySelf == eExistingSEApplyType && bCheck )
{
isSelfStateEffect = true;
}
}
}
if (isSelfStateEffect == false &&
hExistingBlow->GetBlowIndex() != STATE_BLOW::BLOW_242 )
{
vlStateBlowIDToRemove.push_back( hExistingBlow->GetBlowID() );
mapDuplicateResult[ hExistingBlow->GetBlowIndex() ] = true;
// <20><><EFBFBD>µǾ<C2B5><C7BE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>µ<EFBFBD><C2B5><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>´<EFBFBD>. [2010/12/08 semozz]
// <20><><EFBFBD><20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>µ<EFBFBD><C2B5><EFBFBD> OnSignal<61><6C> STE_ApplyStateEffect <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ҷ<EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>¸<EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
hTargetActor->AddStateBlowIDToRemove( hExistingBlow->GetBlowID() );
}
}
else
{
eResult = CDnSkill::CanApply::Fail; // ȿ<><C8BF> <20><><EFBFBD><EFBFBD> <20><> Ȯ<><C8AE> üũ<C3BC><C5A9><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
mapDuplicateResult[ hExistingBlow->GetBlowIndex() ] = false;
}
}
else
if( iLevel < pExistingParentSkillInfo->iLevel )
{
// ȿ<><C8BF> <20><><EFBFBD><EFBFBD> <20>ȵ<EFBFBD>.
eResult = CDnSkill::CanApply::Fail;
// Note <20>ѱ<EFBFBD>: <20><><EFBFBD>Ŀ<EFBFBD> <20>׷<EFBFBD><D7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ǥ<><C7A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵٸ<D1B4> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD>ϸ<EFBFBD> <20><>.
// [2011/01/20 semozz]
// ü<>ζ<EFBFBD><CEB6><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
// A <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><> <20>ڿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> B<><42>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, DuplicationMethod<6F><64> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><20><>ų <20>߰<EFBFBD> <20>ȵ<EFBFBD><C8B5><EFBFBD><EFBFBD><EFBFBD> Self<6C><66><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. Target<65><74> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD>
DnActorHandle hExistingSkillUserActor = pExistingParentSkillInfo->hSkillUser;
DnSkillHandle hSkill;
if (hExistingSkillUserActor)
hSkill = hExistingSkillUserActor->FindSkill( pExistingParentSkillInfo->iSkillID );
if (hSkill)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><> <20>ϳ<EFBFBD><CFB3><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ÿ<><C5B8>.
StateEffectApplyType eExistingSEApplyType = ApplySelf;
for( int i = 0; i < (int)hSkill->GetStateEffectCount(); ++i )
{
const StateEffectStruct* pSE = hSkill->GetStateEffectFromIndex( i );
if( pSE->nID == hExistingBlow->GetBlowIndex()
&& pSE->ApplyType == pExistingParentSkillInfo->eApplyType )
{
eExistingSEApplyType = pSE->ApplyType;
break;
}
}
//<2F>ڽſ<DABD><C5BF><EFBFBD> <20>Ŵ<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ϵ<EFBFBD><CFB5><EFBFBD>? <20>Ѵ<EFBFBD>..
if (StateEffectApplyType::ApplySelf == eExistingSEApplyType)
{
eResult = CDnSkill::CanApply::Apply;
vlStateBlowIDToRemove.push_back( hExistingBlow->GetBlowID() );
mapDuplicateResult[ hExistingBlow->GetBlowIndex() ] = true;
hTargetActor->AddStateBlowIDToRemove( hExistingBlow->GetBlowID() );
}
}
}
}
}
}
if( false == vlStateBlowIDToRemove.empty() )
{
// <20><>ų ȿ<><C8BF> <20><>ü. <20><>ø ī<><C4AB>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> ó<><C3B3><EFBFBD><EFBFBD> <20>ʿ<EFBFBD> <20><><EFBFBD><EFBFBD>.
bExistingSameSkill = false;
eResult = CDnSkill::CanApply::ApplyDuplicateSameSkill;
}
// <20><><EFBFBD><EFBFBD> ȿ<><C8BF><EFBFBD><EFBFBD> <20><>ø<EFBFBD>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD><D8BE>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD>, <20>ִ<EFBFBD> <20><>ø <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵȴ<C8B5>.
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD><CCB6><EFBFBD> <20><>øó<C3B8><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
if( CDnSkill::CanApply::Fail != eResult )
{
if( bExistingSameSkill )
{
if( iDuplicateCount <= iExistingSameSkillCount )
{
// <20>ִ<EFBFBD> <20><>ø <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20>ʱ<EFBFBD>ȭ <20>Ѵ<EFBFBD>.
int iNumSameSkillBlowsToResetDurationTime = (int)vlhSameSkillBlows.size();
for( int iBlow = 0; iBlow < iNumSameSkillBlowsToResetDurationTime; ++iBlow )
{
DnBlowHandle hBlow = vlhSameSkillBlows.at( iBlow );
//////////////////////////////////////////////////////////////////////////
//#53448
//249<34><39> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD> <20><>ø <20><><EFBFBD><EFBFBD> <20>̻<EFBFBD><CCBB><EFBFBD> <20>߰<EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD>.
//<2F>ִ<EFBFBD> <20><>ø <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ʒ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD> <20>ϰ<EFBFBD>, <20>ٽ<EFBFBD> <20>߰<EFBFBD> <20>۾<EFBFBD> <20>ʿ<EFBFBD> <20><><EFBFBD><EFBFBD>.
if (hBlow &&
(hBlow->GetBlowIndex() == STATE_BLOW::BLOW_249 || hBlow->GetBlowIndex() == STATE_BLOW::BLOW_242)
)
continue;
//////////////////////////////////////////////////////////////////////////
// <20>ƿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ߴٰ<DFB4> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ȯ<EFBFBD><C8AE>.
int nDurationTime = int(hBlow->GetDurationTime() * 1000.0f);
hBlow->ResetDurationTime();
CDnSkill::SkillInfo SkillInfo = *(hBlow->GetParentSkillInfo());
STATE_BLOW::emBLOW_INDEX BlowIndex = hBlow->GetBlowIndex();
string strValue( hBlow->GetValue() );
// <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>. [2011/01/18 semozz]
int nBlowID = hBlow->GetBlowID();
// <20><>Ŷ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
hTargetActor->SendRemoveStateEffectFromID(nBlowID);
// <20>ٷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>..
if (hTargetActor->GetStateBlow())
hTargetActor->GetStateBlow()->RemoveImediatlyStateEffectFromID(nBlowID);
// <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> 100% <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD> <20>ϹǷ<CFB9>
// CanBegin <20>Լ<EFBFBD> ȣ<><C8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʵ<EFBFBD><CAB5><EFBFBD> bCheckCanBegin <20>÷<EFBFBD><C3B7>׸<EFBFBD> <20><><EFBFBD><EFBFBD> ȣ<><C8A3>.
hTargetActor->CmdAddStateEffect( &SkillInfo, BlowIndex, nDurationTime, strValue.c_str(), false, false );
}
eResult = CDnSkill::CanApply::Fail;
}
}
}
return eResult;
}
CDnSkill::CanApply CDnSkill::CanApplySkillStateEffect( DnActorHandle hTargetActor, DnSkillHandle hUsingSkill, map<int, bool>& mapDuplicateResult, bool isHitProcess )
{
const SkillInfo* pUsingSkillInfo = hUsingSkill->GetInfo();
int iSkillID = hUsingSkill->GetClassID();
int iLevel = hUsingSkill->GetLevel();
int iSkillDuplicateMethod = hUsingSkill->GetDuplicateMethod();
int iDuplicateCount = hUsingSkill->GetMaxDuplicateCount();
// <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ȿ<><C8BF><EFBFBD><EFBFBD><EFBFBD>߿<EFBFBD> <20><><EFBFBD>ӽð<D3BD><C3B0><EFBFBD> <20>ϳ<EFBFBD><CFB3><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ӽð<D3BD><C3B0><EFBFBD> <20>ִ°ɷ<C2B0> <20>Ǵ<EFBFBD>
// <20>ش<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD>ӽð<D3BD><C3B0><EFBFBD> <20><><EFBFBD>ٸ<EFBFBD> <20>׳<EFBFBD> <20>߰<EFBFBD> <20><> <20><> <20>ֵ<EFBFBD><D6B5><EFBFBD> <20>Ѵ<EFBFBD>. [2010/11/12 semozz]
bool hasDuration = false;
for( DWORD k = 0; k < hUsingSkill->GetStateEffectCount(); k++ )
{
CDnSkill::StateEffectStruct *pLocalStruct = hUsingSkill->GetStateEffectFromIndex(k);
if( pLocalStruct && (IsNeedCheckApplyStateBlow((STATE_BLOW::emBLOW_INDEX)pLocalStruct->nID) || pLocalStruct->nDurationTime > 0) )
{
hasDuration = true;
break;
}
#if defined(PRE_FIX_52267)
//#52267
//<2F><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> ApplyType<70><65> Self<6C><66> <20>ƴϾ <20><><EFBFBD>ӽð<D3BD><C3B0><EFBFBD> 0<><30> <20><><EFBFBD><EFBFBD> CanApplySkillStateEffect<63>Լ<EFBFBD> ȣ<><C8A3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʾƼ<CABE>
//<2F>ǵ<EFBFBD>ġ <20>ʰ<EFBFBD> <20><>ø<EFBFBD><C3B8> <20>Ǵ<EFBFBD> <20><><EFBFBD><20>߻<EFBFBD><DFBB>Ѵ<EFBFBD>.
//ApplyType<70><65> self<6C><66> <20>ƴϰ<C6B4>, durationTime<6D><65> 0<>ΰ<EFBFBD><CEB0>쵵 üũ <20><><EFBFBD><EFBFBD> <20>ϵ<EFBFBD><CFB5><EFBFBD> hasDuration<6F><6E> true<75><65> <20><><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
else if (pLocalStruct->nDurationTime == 0 && pLocalStruct->ApplyType != StateEffectApplyType::ApplySelf)
{
hasDuration = true;
break;
}
#endif // PRE_FIX_52267
}
bool bResist = false;
if( !hTargetActor->IsHittableSkill( iSkillID , bResist ) )
{
if( bResist )
{
hTargetActor->SendAddSEFail( CDnStateBlow::ADD_FAIL_BY_IMMUNE , STATE_BLOW::BLOW_154 );
}
return CDnSkill::CanApply::Fail;
}
if ( false == hasDuration )
{
return CDnSkill::CanApply::Apply;
}
return CanApplySkillStateEffect( pUsingSkillInfo, hTargetActor, iSkillID, iLevel, iSkillDuplicateMethod, iDuplicateCount, mapDuplicateResult, isHitProcess );
}
// <20>׼<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD><EFBFBD><EFBFBD> <20>ݵ<EFBFBD><DDB5><EFBFBD> <20>ִ<EFBFBD> <20><>Ƽ<EFBFBD><C6BC> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>û!
void CDnSkill::OnChainInput( const char* pActionName )
{
if( GetSkillType() == CDnSkill::Active &&
( GetDurationType() == CDnSkill::Instantly ||
GetDurationType() == CDnSkill::Buff ||
GetDurationType() == CDnSkill::Debuff ||
GetDurationType() == CDnSkill::StanceChange ) )
{
IDnSkillProcessor* pProcessor = GetProcessor( IDnSkillProcessor::PLAY_ANI );
_ASSERT( pProcessor );
if( pProcessor )
{
CDnPlayAniProcess* pPlayAniProcessor = static_cast<CDnPlayAniProcess*>( pProcessor );
pPlayAniProcessor->OnChainInput( pActionName );
}
}
else
if( GetSkillType() == CDnSkill::Passive )
{
CEtActionBase::ActionElementStruct* pStruct = m_hActor->GetElement( pActionName );
if( pStruct )
{
m_fPassiveActionSkillLength += (float)pStruct->dwLength / s_fDefaultFps;
m_bChainingPassiveSkill = true;
}
}
}
bool CDnSkill::IsChainInputAction( const char* pActionName )
{
IDnSkillProcessor* pProcessor = GetProcessor( IDnSkillProcessor::PLAY_ANI );
if( pProcessor )
{
CDnPlayAniProcess* pPlayAniProcessor = static_cast<CDnPlayAniProcess*>( pProcessor );
if( strcmp( pActionName , pPlayAniProcessor->GetChainActionName() ) == 0 )
{
return true;
}
}
return false;
}
bool CDnSkill::CheckChainingPassiveSkill( void )
{
bool bResult = m_bChainingPassiveSkill;
m_bChainingPassiveSkill = false;
return bResult;
}
void CDnSkill::AddGlyphStateEffect( int nGlyphID )
{
DNTableFileFormat* pGlyphTable = GetDNTable( CDnTableDB::TGLYPHSKILL );
if( !pGlyphTable ) return;
#if defined(PRE_ADD_65808)
int monsterID = -1;
if (IsSummonMonsterRecall(monsterID) == true)
{
m_hActor->AddSummonMonsterGlyphInfo(monsterID, nGlyphID);
return;
}
#endif // PRE_ADD_65808
char caLable[64];
// <20><>ų <20><>ȭ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> pvp/pve <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
for( int iSkillLevelApplyType = PVE; iSkillLevelApplyType < NUM_SKILLLEVEL_APPLY_TYPE; ++iSkillLevelApplyType )
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>
int iNumOriginalStateEffect = (int)m_vlStateEffectList[ iSkillLevelApplyType ].size();
// <20><><EFBFBD><EFBFBD> ȿ<><C8BF> <20>߰<EFBFBD>
StateEffectStruct StateEffect;
StateEffect.nGlyphID = nGlyphID;
for( int i = 0; i < MAX_GLYPH_STATE_EFFECT_COUNT; ++i )
{
sprintf_s( caLable, "_EffectClass%d", i + 1 );
StateEffect.nID = pGlyphTable->GetFieldFromLablePtr( nGlyphID, caLable )->GetInteger();
if( StateEffect.nID < 1 )
continue;
sprintf_s( caLable, "_EffectClass%dApplyType", i + 1 );
int iApplyType = pGlyphTable->GetFieldFromLablePtr( nGlyphID, caLable )->GetInteger();
bool bApplyAll = (StateEffectApplyType::ApplyAll == iApplyType); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. Ÿ<>ٸ<EFBFBD> <20>ٸ<EFBFBD><D9B8><EFBFBD> <20>ؼ<EFBFBD> <20>Ȱ<EFBFBD><C8B0><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> 2<><32><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD><EFBFBD>ش<EFBFBD>.
if( bApplyAll )
{
StateEffect.ApplyType = StateEffectApplyType::ApplySelf;
StateEffect.bApplyAllPair = true;
}
else
StateEffect.ApplyType = (StateEffectApplyType)iApplyType;
sprintf_s( caLable, "_EffectClassValue%d", i + 1 );
StateEffect.szValue = pGlyphTable->GetFieldFromLablePtr( nGlyphID, caLable )->GetString();
// <20><><EFBFBD>ӽð<D3BD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>״<EFBFBD><D7B4><EFBFBD> <20><>ü<EFBFBD>Ѵ<EFBFBD>.
bool bFound = false;
for( int k = 0; k < iNumOriginalStateEffect; ++k )
{
const StateEffectStruct& OriginalSE = m_vlStateEffectList[ iSkillLevelApplyType ].at( k );
if( OriginalSE.nID == StateEffect.nID )
{
StateEffect.nDurationTime = OriginalSE.nDurationTime;
bFound = true;
}
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD>ٸ<EFBFBD> <20><><EFBFBD>ӽð<D3BD><C3B0><EFBFBD> <20>׳<EFBFBD> 0 <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ش<EFBFBD>.
// <20>׷<EFBFBD> <20>׼ǰ<D7BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ݸ<EFBFBD>ŭ <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD>ӵ<EFBFBD>.
if( false == bFound )
StateEffect.nDurationTime = 0;
m_vlStateEffectList[ iSkillLevelApplyType ].push_back( StateEffect );
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD> Ÿ<><C5B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٲ㼭 <20>Ȱ<EFBFBD><C8B0><EFBFBD> <20><> <20><> <20><> <20>־<EFBFBD><D6BE><EFBFBD>.
if( bApplyAll )
{
StateEffect.ApplyType = StateEffectApplyType::ApplyTarget;
m_vlStateEffectList[ iSkillLevelApplyType ].push_back( StateEffect );
}
}
}
// <20><>ų <20>Ӽ<EFBFBD> <20>߰<EFBFBD>
GlyphEffectStruct GlyphEffect;
GlyphEffect.eEffectIndex = pGlyphTable->GetFieldFromLablePtr( nGlyphID, "_GlyphSkillEffect" )->GetInteger();
GlyphEffect.fEffectValue = pGlyphTable->GetFieldFromLablePtr( nGlyphID, "_GlyphSkillEffectValue" )->GetFloat();
GlyphEffect.nGlyphID = nGlyphID;
switch( GlyphEffect.eEffectIndex )
{
case SKILLMP_PRO :
{
for( int iSkillLevelApplyType = PVE; iSkillLevelApplyType < NUM_SKILLLEVEL_APPLY_TYPE; ++iSkillLevelApplyType )
m_iNeedMP[ iSkillLevelApplyType ] += (int)( (float)m_iOriginalNeedMP[ iSkillLevelApplyType ] * GlyphEffect.fEffectValue );
break;
}
case SKILLDELAY_PRO :
{
for( int iSkillLevelApplyType = PVE; iSkillLevelApplyType < NUM_SKILLLEVEL_APPLY_TYPE; ++iSkillLevelApplyType )
m_fDelayTime[ iSkillLevelApplyType ] += m_fOriginalDelayTime[ iSkillLevelApplyType ] * GlyphEffect.fEffectValue;
break;
}
case SKILLDELAY_RESET_PRO :
{
m_fResetCooltime += GlyphEffect.fEffectValue;
break;
}
case SKILLDURATION_PRO :
{
// pair<int, int> <<3C><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF>, <20>Ⱓ>
for( int iSkillLevelApplyType = PVE; iSkillLevelApplyType < NUM_SKILLLEVEL_APPLY_TYPE; ++iSkillLevelApplyType )
{
bool bEmpty = m_vlStateDurationList[iSkillLevelApplyType].empty();
for( int itr = 0; itr < (int)m_vlStateEffectList[ iSkillLevelApplyType ].size(); ++itr ) {
if( bEmpty )
m_vlStateDurationList[iSkillLevelApplyType].push_back( make_pair(m_vlStateEffectList[ iSkillLevelApplyType ][itr].nID, m_vlStateEffectList[ iSkillLevelApplyType ][itr].nDurationTime) );
else m_vlStateEffectList[ iSkillLevelApplyType ][itr].nDurationTime = m_vlStateDurationList[iSkillLevelApplyType][itr].second;
}
}
float fRatio = GlyphEffect.fEffectValue;
for( int itr = 0; itr < (int)m_vGlyphEffectList.size(); ++itr )
{
if( SKILLDURATION_PRO == m_vGlyphEffectList[itr].eEffectIndex )
fRatio += m_vGlyphEffectList[itr].fEffectValue;
}
for( int iSkillLevelApplyType = PVE; iSkillLevelApplyType < NUM_SKILLLEVEL_APPLY_TYPE; ++iSkillLevelApplyType )
{
for( int itr = 0; itr < (int)m_vlStateEffectList[ iSkillLevelApplyType ].size(); ++itr )
m_vlStateEffectList[ iSkillLevelApplyType ][itr].nDurationTime += (int)(m_vlStateEffectList[ iSkillLevelApplyType ][itr].nDurationTime * fRatio);
}
break;
}
case SKILLATTACKHEAL_ABSOLUTE:
{
float fValue = GlyphEffect.fEffectValue;
for( int iSkillLevelApplyType = PVE; iSkillLevelApplyType < NUM_SKILLLEVEL_APPLY_TYPE; ++iSkillLevelApplyType )
{
for( int itr = 0; itr < (int)m_vlStateEffectList[ iSkillLevelApplyType ].size(); ++itr )
{
if( m_vlStateEffectList[ iSkillLevelApplyType ][itr].nID == STATE_BLOW::BLOW_248 )
{
m_vlStateEffectList[ iSkillLevelApplyType ][itr].szValue = FormatA( "%f", fValue + atof(m_vlStateEffectList[ iSkillLevelApplyType ][itr].szValue.c_str()) ).c_str();
}
}
}
}
break;
}
m_vGlyphEffectList.push_back( GlyphEffect );
}
void CDnSkill::DelGlyphStateEffect( int nGlyphID )
{
#if defined(PRE_ADD_65808)
int monsterID = -1;
if (IsSummonMonsterRecall(monsterID) == true)
{
m_hActor->RemoveSummonMonsterGlyphInfo(monsterID, nGlyphID);
return;
}
#endif // PRE_ADD_65808
// <20><>ų <20><>ȭ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> pvp/pve <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
for( int iSkillLevelApplyType = PVE; iSkillLevelApplyType < NUM_SKILLLEVEL_APPLY_TYPE; ++iSkillLevelApplyType )
{
for( DNVector(StateEffectStruct)::iterator Itor = m_vlStateEffectList[ iSkillLevelApplyType ].begin();
Itor < m_vlStateEffectList[ iSkillLevelApplyType ].end(); )
{
if( nGlyphID == Itor->nGlyphID )
Itor = m_vlStateEffectList[ iSkillLevelApplyType ].erase(Itor);
else
++Itor;
}
}
for( std::vector<GlyphEffectStruct>::iterator Itor = m_vGlyphEffectList.begin();
Itor < m_vGlyphEffectList.end(); )
{
if( nGlyphID == Itor->nGlyphID )
{
switch( Itor->eEffectIndex )
{
case SKILLMP_PRO :
{
for( int iSkillLevelApplyType = PVE; iSkillLevelApplyType < NUM_SKILLLEVEL_APPLY_TYPE; ++iSkillLevelApplyType )
m_iNeedMP[ iSkillLevelApplyType ] -= (int)( (float)m_iOriginalNeedMP[ iSkillLevelApplyType ] * Itor->fEffectValue );
break;
}
case SKILLDELAY_PRO :
{
for( int iSkillLevelApplyType = PVE; iSkillLevelApplyType < NUM_SKILLLEVEL_APPLY_TYPE; ++iSkillLevelApplyType )
m_fDelayTime[ iSkillLevelApplyType ] -= m_fOriginalDelayTime[ iSkillLevelApplyType ] * Itor->fEffectValue;
break;
}
case SKILLDELAY_RESET_PRO :
{
m_fResetCooltime -= Itor->fEffectValue;
break;
}
case SKILLDURATION_PRO :
{
// pair<int, int> <<3C><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF>, <20>Ⱓ>
bool bExist = false, bOnce = true;
float fRatio = 0.0f;
for( int itr = 0; itr < (int)m_vGlyphEffectList.size(); ++itr )
{
if( Itor->nGlyphID == m_vGlyphEffectList[itr].nGlyphID && bOnce)
{
bOnce = false;
continue;
}
if( SKILLDURATION_PRO == m_vGlyphEffectList[itr].eEffectIndex )
{
bExist = true;
fRatio += m_vGlyphEffectList[itr].fEffectValue;
}
}
if( !bExist )
{
for( int iSkillLevelApplyType = PVE; iSkillLevelApplyType < NUM_SKILLLEVEL_APPLY_TYPE; ++iSkillLevelApplyType )
{
for( int itr = 0; itr < (int)m_vlStateEffectList[ iSkillLevelApplyType ].size(); ++itr )
m_vlStateEffectList[ iSkillLevelApplyType ][itr].nDurationTime = m_vlStateDurationList[iSkillLevelApplyType][itr].second;
m_vlStateDurationList[iSkillLevelApplyType].clear();
}
}
else
{
for( int iSkillLevelApplyType = PVE; iSkillLevelApplyType < NUM_SKILLLEVEL_APPLY_TYPE; ++iSkillLevelApplyType )
{
for( int itr = 0; itr < (int)m_vlStateEffectList[ iSkillLevelApplyType ].size(); ++itr )
m_vlStateEffectList[ iSkillLevelApplyType ][itr].nDurationTime = m_vlStateDurationList[iSkillLevelApplyType][itr].second + (int)(m_vlStateDurationList[iSkillLevelApplyType][itr].second * fRatio);
}
}
break;
}
case SKILLATTACKHEAL_ABSOLUTE:
{
float fValue = Itor->fEffectValue;
for( int iSkillLevelApplyType = PVE; iSkillLevelApplyType < NUM_SKILLLEVEL_APPLY_TYPE; ++iSkillLevelApplyType )
{
for( int itr = 0; itr < (int)m_vlStateEffectList[ iSkillLevelApplyType ].size(); ++itr )
{
if( m_vlStateEffectList[ iSkillLevelApplyType ][itr].nID == STATE_BLOW::BLOW_248 )
m_vlStateEffectList[ iSkillLevelApplyType ][itr].szValue = FormatA( "%f", atof(m_vlStateEffectList[ iSkillLevelApplyType ][itr].szValue.c_str()) - fValue).c_str();
}
}
}
break;
}
Itor = m_vGlyphEffectList.erase( Itor );
}
else
++Itor;
}
}
void CDnSkill::UpdateSkillCoolTimeExactly( void )
{
// 96, 171<37><31> <20><>Ÿ<EFBFBD><C5B8> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20>ɷ<EFBFBD><C9B7>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> üũ<C3BC><C5A9><EFBFBD><EFBFBD> <20>ʵ<EFBFBD><CAB5><EFBFBD> ó<><C3B3>.
// <20>׼<EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ÿ<EFBFBD><C5B8> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 10<31><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>پ<EFBFBD><D9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> <20><><EFBFBD>۰<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̷<EFBFBD><CCB7><EFBFBD> Ǯ<><C7AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. 2011.07.25
DWORD dwNowTime = timeGetTime();
if( DWORD(GetDelayTime()*1000.0f) < dwNowTime - m_dwLastUseSkillTimeStamp )
{
ResetCoolTime();
}
}
bool CDnSkill::SelectLevelDataType( int iSkillLevelDataType, bool bPlayerSummonedMonster/* = false*/ )
{
_ASSERT( (m_hActor->IsPlayerActor() || bPlayerSummonedMonster) && (PVE <= iSkillLevelDataType) && (iSkillLevelDataType < NUM_SKILLLEVEL_APPLY_TYPE) );
if( (m_hActor->IsPlayerActor() || bPlayerSummonedMonster) &&
(PVE <= iSkillLevelDataType) &&
(iSkillLevelDataType < NUM_SKILLLEVEL_APPLY_TYPE) )
{
m_iSelectedSkillLevelDataApplyType = iSkillLevelDataType;
return true;
}
return false;
};
bool CDnSkill::IsNeedCheckApplyStateBlow( STATE_BLOW::emBLOW_INDEX emBlowIndex )
{
bool bResult = false;
if( STATE_BLOW::BLOW_030 == emBlowIndex )
bResult = true;
return bResult;
}
int CDnSkill::GetBaseSkillID( void )
{
int iResult = 0;
if( EnchantPassive == m_eSkillType )
{
iResult = m_iBaseSkillID;
}
return iResult;
}
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD>ȭ <20><><EFBFBD>߾<EFBFBD><DFBE>ּ<EFBFBD><D6BC><EFBFBD> CheckAndDivideStateEffectArgument <20><> <20>Լ<EFBFBD><D4BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ּ<EFBFBD><D6BC><EFBFBD>
bool CDnSkill::CheckAndUnifyStateEffectArgument( int iSkillLevelApplyType, StateEffectStruct* pEnchantSkillSE )
{
bool bResult = false;
if( CDnCreateBlow::IsBasicBlow( (STATE_BLOW::emBLOW_INDEX)pEnchantSkillSE->nID ) )
{
for( int i = 0; i < (int)m_vlStateEffectList[ iSkillLevelApplyType ].size(); ++i )
{
StateEffectStruct* pDestSkillSE = &(m_vlStateEffectList[ iSkillLevelApplyType ].at( i ));
if( pDestSkillSE->nID == pEnchantSkillSE->nID )
{
CDnBasicBlow::AddStateEffectValue( pDestSkillSE->szValue.c_str(), pEnchantSkillSE->szValue.c_str(), pDestSkillSE->szValue );
pDestSkillSE->strEnchantSkillSEParam = pEnchantSkillSE->szValue;
bResult = true;
}
}
}
else if( STATE_BLOW::BLOW_016 == (STATE_BLOW::emBLOW_INDEX)pEnchantSkillSE->nID )
{
for( int i = 0; i < (int)m_vlStateEffectList[ iSkillLevelApplyType ].size(); ++i )
{
StateEffectStruct* pDestSkillSE = &(m_vlStateEffectList[ iSkillLevelApplyType ].at( i ));
if( pDestSkillSE->nID == pEnchantSkillSE->nID )
{
CDnHPIncBlow::AddStateEffectValue( pDestSkillSE->szValue.c_str(), pEnchantSkillSE->szValue.c_str(), pDestSkillSE->szValue );
pDestSkillSE->strEnchantSkillSEParam = pEnchantSkillSE->szValue;
bResult = true;
}
}
}
else if( STATE_BLOW::BLOW_208 == (STATE_BLOW::emBLOW_INDEX)pEnchantSkillSE->nID )
{
for( int i = 0; i < (int)m_vlStateEffectList[ iSkillLevelApplyType ].size(); ++i )
{
StateEffectStruct* pDestSkillSE = &(m_vlStateEffectList[ iSkillLevelApplyType ].at( i ));
if( pDestSkillSE->nID == pEnchantSkillSE->nID )
{
CDnPingpongBlow::AddStateEffectValue( pDestSkillSE->szValue.c_str(), pEnchantSkillSE->szValue.c_str(), pDestSkillSE->szValue );
pDestSkillSE->strEnchantSkillSEParam = pEnchantSkillSE->szValue;
bResult = true;
}
}
}
else if( STATE_BLOW::BLOW_140 == (STATE_BLOW::emBLOW_INDEX)pEnchantSkillSE->nID )
{
for( int i = 0; i < (int)m_vlStateEffectList[ iSkillLevelApplyType ].size(); ++i )
{
StateEffectStruct* pDestSkillSE = &(m_vlStateEffectList[ iSkillLevelApplyType ].at( i ));
if( pDestSkillSE->nID == pEnchantSkillSE->nID )
{
CDnHealingBlow::AddStateEffectValue( pDestSkillSE->szValue.c_str(), pEnchantSkillSE->szValue.c_str(), pDestSkillSE->szValue );
pDestSkillSE->strEnchantSkillSEParam = pEnchantSkillSE->szValue;
bResult = true;
}
}
}
else if( STATE_BLOW::BLOW_227 == (STATE_BLOW::emBLOW_INDEX)pEnchantSkillSE->nID )
{
for( int i = 0; i < (int)m_vlStateEffectList[ iSkillLevelApplyType ].size(); ++i )
{
StateEffectStruct* pDestSkillSE = &(m_vlStateEffectList[ iSkillLevelApplyType ].at( i ));
if( pDestSkillSE->nID == pEnchantSkillSE->nID )
{
CDnBloodSuckingBlow::AddStateEffectValue( pDestSkillSE->szValue.c_str(), pEnchantSkillSE->szValue.c_str(), pDestSkillSE->szValue );
pDestSkillSE->strEnchantSkillSEParam = pEnchantSkillSE->szValue;
bResult = true;
}
}
}
else if( STATE_BLOW::BLOW_215 == (STATE_BLOW::emBLOW_INDEX)pEnchantSkillSE->nID )
{
for( int i = 0; i < (int)m_vlStateEffectList[ iSkillLevelApplyType ].size(); ++i )
{
StateEffectStruct* pDestSkillSE = &(m_vlStateEffectList[ iSkillLevelApplyType ].at( i ));
if( pDestSkillSE->nID == pEnchantSkillSE->nID )
{
CDnOrderMySummonedMonsterBlow::AddStateEffectValue( pDestSkillSE->szValue.c_str(), pEnchantSkillSE->szValue.c_str(), pDestSkillSE->szValue );
pDestSkillSE->strEnchantSkillSEParam = pEnchantSkillSE->szValue;
bResult = true;
}
}
}
else if( STATE_BLOW::BLOW_179 == (STATE_BLOW::emBLOW_INDEX)pEnchantSkillSE->nID
|| STATE_BLOW::BLOW_121 == (STATE_BLOW::emBLOW_INDEX)pEnchantSkillSE->nID
|| STATE_BLOW::BLOW_129 == (STATE_BLOW::emBLOW_INDEX)pEnchantSkillSE->nID
|| STATE_BLOW::BLOW_062 == (STATE_BLOW::emBLOW_INDEX)pEnchantSkillSE->nID
|| STATE_BLOW::BLOW_242 == (STATE_BLOW::emBLOW_INDEX)pEnchantSkillSE->nID )
{
for( int i = 0; i < (int)m_vlStateEffectList[ iSkillLevelApplyType ].size(); ++i )
{
StateEffectStruct* pDestSkillSE = &(m_vlStateEffectList[ iSkillLevelApplyType ].at( i ));
if( pDestSkillSE->nID == pEnchantSkillSE->nID )
{
pDestSkillSE->strEnchantSkillSEParam = pDestSkillSE->szValue;
pDestSkillSE->szValue = pEnchantSkillSE->szValue;
bResult = true;
break;
}
}
}
return bResult;
}
bool CDnSkill::ApplyEnchantSkill( DnSkillHandle hEnchantPassiveSkill )
{
bool bSuccess = false;
if( 0 < m_iAppliedEnchantPassiveSkillID )
return false;
_ASSERT( m_iSkillID == hEnchantPassiveSkill->GetBaseSkillID() );
_ASSERT( EnchantPassive != m_eSkillType );
if( EnchantPassive != m_eSkillType )
{
int iNowLevelDataType = m_iSelectedSkillLevelDataApplyType;
for( int iSkillLevelApplyType = PVE; iSkillLevelApplyType < NUM_SKILLLEVEL_APPLY_TYPE; ++iSkillLevelApplyType )
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD>ڰ<EFBFBD><DAB0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ְ<EFBFBD> <20><><EFBFBD>ο<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>߰<EFBFBD>.
// <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20><>ȭ <20>нú<D0BD> <20><>ų<EFBFBD><C5B3> <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EEBEBA><EFBFBD>ش<EFBFBD>.
SelectLevelDataType( iSkillLevelApplyType );
hEnchantPassiveSkill->SelectLevelDataType( iSkillLevelApplyType );
int iNumStateEffect = (int)hEnchantPassiveSkill->GetStateEffectCount();
for( int i = 0; i < iNumStateEffect; ++i )
{
StateEffectStruct* pEnchantPassiveSE = hEnchantPassiveSkill->GetStateEffectFromIndex( i );
// #40643 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>EX ó<><C3B3> Ư<><C6AF><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD>ڸ<EFBFBD> <20>ǵ帮<C7B5><E5B8AE> <20><><EFBFBD><EFBFBD>..
// <20><>¿ <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> m_vlStateEffectList <20><> <20>߰<EFBFBD><DFB0>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ƴ<EFBFBD>.
if( false == CheckAndUnifyStateEffectArgument( iSkillLevelApplyType, pEnchantPassiveSE ) )
{
// <20><><EFBFBD>ݷ<EFBFBD> <20><>ȭ <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20>ƴϰ<C6B4> <20>߰<EFBFBD><DFB0><EFBFBD><EFBFBD>ָ<EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD> <20>ɷ<EFBFBD>ġ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȴ<EFBFBD>.
m_vlStateEffectList[ iSkillLevelApplyType ].push_back( *pEnchantPassiveSE );
m_vlStateEffectList[ iSkillLevelApplyType ].back().nFromEnchantPassiveSkillID = hEnchantPassiveSkill->GetClassID();
}
}
// <20>׼<EFBFBD> <20><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD><EFBFBD><EFBFBD> <20><>ȭ <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
IDnSkillProcessor* pMyPlayAniProcessor = GetProcessor( IDnSkillProcessor::PLAY_ANI );
if( pMyPlayAniProcessor )
{
IDnSkillProcessor* pEnchantPassiveSkillPlayAniProcessor = hEnchantPassiveSkill->GetProcessor( IDnSkillProcessor::PLAY_ANI );
if( pEnchantPassiveSkillPlayAniProcessor )
{
// <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.
IDnSkillProcessor* pBackup = new CDnPlayAniProcess;
pBackup->CopyFrom( pMyPlayAniProcessor );
m_vlpProcessorBackup[ iSkillLevelApplyType ].push_back( pBackup );
// <20><>ȭ <20>нú<D0BD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
pMyPlayAniProcessor->CopyFrom( pEnchantPassiveSkillPlayAniProcessor );
}
}
IDnSkillProcessor* pMyPartialPlayAniProcessor = GetProcessor( IDnSkillProcessor::PARTIAL_PLAY_ANI );
if( pMyPartialPlayAniProcessor )
{
IDnSkillProcessor* pEnchantPassivePartialSkillPlayAniProcessor = hEnchantPassiveSkill->GetProcessor( IDnSkillProcessor::PARTIAL_PLAY_ANI );
if( pEnchantPassivePartialSkillPlayAniProcessor )
{
// <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.
IDnSkillProcessor* pBackup = new CDnPartialPlayProcessor;
pBackup->CopyFrom( pMyPartialPlayAniProcessor );
m_vlpProcessorBackup[ iSkillLevelApplyType ].push_back( pBackup );
pMyPartialPlayAniProcessor->CopyFrom( pEnchantPassivePartialSkillPlayAniProcessor );
}
}
IDnSkillProcessor* pMyChangeActionStrProcessor = GetProcessor( IDnSkillProcessor::CHANGE_ACTIONSTR );
if( pMyChangeActionStrProcessor )
{
IDnSkillProcessor* pEnchantPassiveChangeActionStrProcessor = hEnchantPassiveSkill->GetProcessor( IDnSkillProcessor::CHANGE_ACTIONSTR );
if( pEnchantPassiveChangeActionStrProcessor )
{
// <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.
IDnSkillProcessor* pBackup = new CDnChangeActionStrProcessor;
pBackup->CopyFrom( pMyChangeActionStrProcessor );
m_vlpProcessorBackup[ iSkillLevelApplyType ].push_back( pBackup );
pMyChangeActionStrProcessor->CopyFrom( pEnchantPassiveChangeActionStrProcessor );
}
}
#ifdef PRE_ADD_ENCHANTSKILL_BUBBLE_ACTION
IDnSkillProcessor* pMyChangeActionStrByBubbleProcessor = GetProcessor( IDnSkillProcessor::CHANGE_ACTIONSTR_BY_BUBBLE );
if( pMyChangeActionStrByBubbleProcessor )
{
IDnSkillProcessor* pEnchantPassiveChangeActionStrProcessor = hEnchantPassiveSkill->GetProcessor( IDnSkillProcessor::CHANGE_ACTIONSTR_BY_BUBBLE );
if( pEnchantPassiveChangeActionStrProcessor )
{
IDnSkillProcessor* pBackup = new CDnChangeActionStrByBubbleProcessor( );
pBackup->CopyFrom( pMyChangeActionStrByBubbleProcessor );
m_vlpProcessorBackup[ iSkillLevelApplyType ].push_back( pBackup );
pMyChangeActionStrByBubbleProcessor->CopyFrom( pEnchantPassiveChangeActionStrProcessor );
}
}
#endif
m_eElement = hEnchantPassiveSkill->GetElement();
m_SkillInfo[iSkillLevelApplyType].eSkillElement = hEnchantPassiveSkill->GetElement();
#ifdef PRE_FIX_SYNC_ENCHANT_SKILL
bool bSummonMonsterToggleSkill = ( m_isAppliedSummonMonsterEnchantSkill && hEnchantPassiveSkill->GetDurationType() == CDnSkill::ActiveToggleForSummon );
if( bSummonMonsterToggleSkill == false )
{
m_eDurationType = hEnchantPassiveSkill->GetDurationType();
m_SkillInfo[iSkillLevelApplyType].eDurationType = hEnchantPassiveSkill->GetDurationType();
}
#endif
#if defined(PRE_FIX_66175)
//#66175
//UsableChecker<65><72> <20><><EFBFBD>̽<EFBFBD> <20><>ų<EFBFBD><C5B3> EX<45><58>ų <20><>ü<EFBFBD>Ѵ<EFBFBD>...
vector<IDnSkillUsableChecker*>& enchangeSkillUsableChecker = hEnchantPassiveSkill->GetUsableChecker(iSkillLevelApplyType);
//EX<45><58>ų<EFBFBD><C5B3> UsableChecker<65><72> <20><><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><20><>ü <20>ϵ<EFBFBD><CFB5><EFBFBD> <20>Ѵ<EFBFBD>...
if (enchangeSkillUsableChecker.size() > 0)
{
vector<IDnSkillUsableChecker*>& baseSkillUsableChecker = GetUsableChecker(iSkillLevelApplyType);
{
//<2F>ڽ<EFBFBD><DABD><EFBFBD> Checker<65><72><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>´<EFBFBD>.
vector<IDnSkillUsableChecker*>::iterator iter = baseSkillUsableChecker.begin();
vector<IDnSkillUsableChecker*>::iterator endIter = baseSkillUsableChecker.begin();
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20>س<EFBFBD><D8B3><EFBFBD>...
m_vlUsableCheckersBackup[iSkillLevelApplyType].clear();
for (; iter != endIter; ++iter)
{
m_vlUsableCheckersBackup[iSkillLevelApplyType].push_back((*iter));
}
}
//EX<45><58>ų<EFBFBD><C5B3> usableChecker<65><72> <20><><EFBFBD>̽<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
baseSkillUsableChecker.clear();
vector<IDnSkillUsableChecker*>::iterator iter = enchangeSkillUsableChecker.begin();
vector<IDnSkillUsableChecker*>::iterator endIter = enchangeSkillUsableChecker.end();
for (; iter != endIter; ++iter)
{
IDnSkillUsableChecker* pChecker = (*iter);
baseSkillUsableChecker.push_back(pChecker->Clone());
}
}
#endif // PRE_FIX_66175
//EffectIDs<44><73> <20><><EFBFBD><EFBFBD>..
string enchantEffectIDs = hEnchantPassiveSkill->GetEffectOutputIDs(iSkillLevelApplyType);
string enchantEffectIDToClient = hEnchantPassiveSkill->GetEffectOutputIDToClient(iSkillLevelApplyType);
m_BackupEffectOutputIDs[iSkillLevelApplyType] = m_SkillInfo[iSkillLevelApplyType].szEffectOutputIDs;
m_BackupEffectOutputIDToClient[iSkillLevelApplyType] = m_SkillInfo[iSkillLevelApplyType].szEffectOutputIDToClient;
//SC_CMDADDSTATEEFFECT <20><>Ŷ<EFBFBD><C5B6> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, szEffectOutputIDToClient<6E><74><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD>̺<EFBFBD> <20><><EFBFBD><EFBFBD> <20>о<20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
//EX<45><58>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20><> <20><>ų ID<49><44> <20><><EFBFBD>̽<EFBFBD> <20><>ų ID<49><44> <20><><EFBFBD><EFBFBD> <20>DZ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, EX<45><58>ų<EFBFBD><C5B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ϰ<EFBFBD> <20><>.
//eX<65><58>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> szEffectOutputIDToClient<6E><74><EFBFBD><EFBFBD> EX<45><58>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>س<EFBFBD><D8B3>´<EFBFBD>.
m_SkillInfo[iSkillLevelApplyType].szEffectOutputIDs = enchantEffectIDs;
m_SkillInfo[iSkillLevelApplyType].szEffectOutputIDToClient = enchantEffectIDs;
#ifdef PRE_FIX_SYNC_ENCHANT_SKILL
m_SkillInfo[iSkillLevelApplyType].iAppliedEnchantSkillID = hEnchantPassiveSkill->GetClassID();
#endif
}
SelectLevelDataType( iNowLevelDataType );
m_iAppliedEnchantPassiveSkillID = hEnchantPassiveSkill->GetClassID();
bSuccess = true;
}
return bSuccess;
}
void CDnSkill::ApplyEnchantSkillOnceFromBubble( DnSkillHandle hEnchantPassiveSkill )
{
m_bEnchantedFromBubble = true;
ApplyEnchantSkill( hEnchantPassiveSkill );
}
bool CDnSkill::CheckAndDivideStateEffectArgument( StateEffectStruct* pDestSkillSE )
{
if( pDestSkillSE->strEnchantSkillSEParam.empty() == true )
return false;
bool bResult = false;
if( CDnCreateBlow::IsBasicBlow( (STATE_BLOW::emBLOW_INDEX)pDestSkillSE->nID ) )
{
CDnBasicBlow::RemoveStateEffectValue( pDestSkillSE->szValue.c_str(), pDestSkillSE->strEnchantSkillSEParam.c_str(), pDestSkillSE->szValue );
pDestSkillSE->strEnchantSkillSEParam.clear();
bResult = true;
}
else if( STATE_BLOW::BLOW_016 == (STATE_BLOW::emBLOW_INDEX)pDestSkillSE->nID )
{
CDnHPIncBlow::RemoveStateEffectValue( pDestSkillSE->szValue.c_str(), pDestSkillSE->strEnchantSkillSEParam.c_str(), pDestSkillSE->szValue );
pDestSkillSE->strEnchantSkillSEParam.clear();
bResult = true;
}
else if( STATE_BLOW::BLOW_208 == (STATE_BLOW::emBLOW_INDEX)pDestSkillSE->nID )
{
CDnPingpongBlow::RemoveStateEffectValue( pDestSkillSE->szValue.c_str(), pDestSkillSE->strEnchantSkillSEParam.c_str(), pDestSkillSE->szValue );
pDestSkillSE->strEnchantSkillSEParam.clear();
bResult = true;
}
else if( STATE_BLOW::BLOW_140 == (STATE_BLOW::emBLOW_INDEX)pDestSkillSE->nID )
{
CDnHealingBlow::RemoveStateEffectValue( pDestSkillSE->szValue.c_str(), pDestSkillSE->strEnchantSkillSEParam.c_str(), pDestSkillSE->szValue );
pDestSkillSE->strEnchantSkillSEParam.clear();
bResult = true;
}
else if( STATE_BLOW::BLOW_227 == (STATE_BLOW::emBLOW_INDEX)pDestSkillSE->nID )
{
CDnBloodSuckingBlow::RemoveStateEffectValue( pDestSkillSE->szValue.c_str(), pDestSkillSE->strEnchantSkillSEParam.c_str(), pDestSkillSE->szValue );
pDestSkillSE->strEnchantSkillSEParam.clear();
bResult = true;
}
else if( STATE_BLOW::BLOW_215 == (STATE_BLOW::emBLOW_INDEX)pDestSkillSE->nID )
{
CDnOrderMySummonedMonsterBlow::RemoveStateEffectValue( pDestSkillSE->szValue.c_str(), pDestSkillSE->strEnchantSkillSEParam.c_str(), pDestSkillSE->szValue );
pDestSkillSE->strEnchantSkillSEParam.clear();
bResult = true;
}
else if( STATE_BLOW::BLOW_179 == (STATE_BLOW::emBLOW_INDEX)pDestSkillSE->nID
|| STATE_BLOW::BLOW_121 == (STATE_BLOW::emBLOW_INDEX)pDestSkillSE->nID
|| STATE_BLOW::BLOW_129 == (STATE_BLOW::emBLOW_INDEX)pDestSkillSE->nID
|| STATE_BLOW::BLOW_062 == (STATE_BLOW::emBLOW_INDEX)pDestSkillSE->nID
|| STATE_BLOW::BLOW_242 == (STATE_BLOW::emBLOW_INDEX)pDestSkillSE->nID )
{
pDestSkillSE->szValue = pDestSkillSE->strEnchantSkillSEParam;
pDestSkillSE->strEnchantSkillSEParam.clear();
bResult = true;
}
return bResult;
}
void CDnSkill::ReleaseEnchantSkill( void )
{
if( 0 == m_iAppliedEnchantPassiveSkillID )
return;
_ASSERT( EnchantPassive != m_eSkillType );
if( EnchantPassive != m_eSkillType )
{
int iNowLevelDataType = m_iSelectedSkillLevelDataApplyType;
for( int iSkillLevelApplyType = PVE; iSkillLevelApplyType < NUM_SKILLLEVEL_APPLY_TYPE; ++iSkillLevelApplyType )
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD>ڰ<EFBFBD><DAB0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ְ<EFBFBD> <20><><EFBFBD>ο<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>߰<EFBFBD>.
// <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20><>ȭ <20>нú<D0BD> <20><>ų<EFBFBD><C5B3> <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EEBEBA><EFBFBD>ش<EFBFBD>.
SelectLevelDataType( iSkillLevelApplyType );
DNVector( StateEffectStruct )::iterator iter = m_vlStateEffectList[ iSkillLevelApplyType ].begin();
for( iter; iter != m_vlStateEffectList[ iSkillLevelApplyType ].end(); )
{
if( false == CheckAndDivideStateEffectArgument( &(*iter) ) )
{
if( 0 < iter->nFromEnchantPassiveSkillID )
{
iter = m_vlStateEffectList[ iSkillLevelApplyType ].erase( iter );
continue;
}
}
++iter;
}
for( int i = 0; i < (int)m_vlpProcessorBackup[ iSkillLevelApplyType ].size(); ++i )
{
IDnSkillProcessor* pProcessor = m_vlpProcessorBackup[ iSkillLevelApplyType ].at( i );
switch( pProcessor->GetType() )
{
case IDnSkillProcessor::PLAY_ANI:
{
IDnSkillProcessor* pMyPlayAniProcessor = GetProcessor( IDnSkillProcessor::PLAY_ANI );
if( pMyPlayAniProcessor )
pMyPlayAniProcessor->CopyFrom( pProcessor );
}
break;
case IDnSkillProcessor::PARTIAL_PLAY_ANI:
{
IDnSkillProcessor* pMyPartialPlayAniProcessor = GetProcessor( IDnSkillProcessor::PARTIAL_PLAY_ANI );
if( pMyPartialPlayAniProcessor )
pMyPartialPlayAniProcessor->CopyFrom( pProcessor );
}
break;
case IDnSkillProcessor::CHANGE_ACTIONSTR:
{
IDnSkillProcessor* pMyChangeActionStrProcessor = GetProcessor( IDnSkillProcessor::CHANGE_ACTIONSTR );
if( pMyChangeActionStrProcessor )
pMyChangeActionStrProcessor->CopyFrom( pProcessor );
}
break;
#ifdef PRE_ADD_ENCHANTSKILL_BUBBLE_ACTION
case IDnSkillProcessor::CHANGE_ACTIONSTR_BY_BUBBLE:
{
IDnSkillProcessor* pMyChangeActionStrByBubbleProcessor = GetProcessor( IDnSkillProcessor::CHANGE_ACTIONSTR_BY_BUBBLE );
if( pMyChangeActionStrByBubbleProcessor )
pMyChangeActionStrByBubbleProcessor->CopyFrom( pProcessor );
}
break;
#endif
}
}
SAFE_DELETE_PVEC( m_vlpProcessorBackup[ iSkillLevelApplyType ] );
#if defined(PRE_FIX_66175)
if (m_vlUsableCheckersBackup[iSkillLevelApplyType].size() > 0)
{
std::swap(m_vlpUsableCheckers[iSkillLevelApplyType], m_vlUsableCheckersBackup[iSkillLevelApplyType]);
}
#endif // PRE_FIX_66175
//EffectIDs<44><73> <20><><EFBFBD><EFBFBD>..
m_SkillInfo[iSkillLevelApplyType].szEffectOutputIDs = m_BackupEffectOutputIDs[iSkillLevelApplyType];
m_SkillInfo[iSkillLevelApplyType].szEffectOutputIDToClient = m_BackupEffectOutputIDToClient[iSkillLevelApplyType];
m_BackupEffectOutputIDs[iSkillLevelApplyType].clear();
m_BackupEffectOutputIDToClient[iSkillLevelApplyType].clear();
}
SelectLevelDataType( iNowLevelDataType );
m_iAppliedEnchantPassiveSkillID = 0;
}
}
IDnSkillUsableChecker* CDnSkill::GetChecker( int iType )
{
IDnSkillUsableChecker* pResult = NULL;
int iNumChecker = (int)m_vlpUsableCheckers[ m_iSelectedSkillLevelDataApplyType ].size();
for( int iChecker = 0; iChecker < iNumChecker; ++iChecker )
{
IDnSkillUsableChecker* pSkillChecker = m_vlpUsableCheckers[ m_iSelectedSkillLevelDataApplyType ].at( iChecker );
if( iType == pSkillChecker->GetType() )
{
pResult = pSkillChecker;
break;
}
}
return pResult;
}
bool CDnSkill::IsExistUsableChecker( int iType ) // <20><><EFBFBD>ǵ<EFBFBD> UsableChecker<65><72> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD>?
{
int iNumChecker = (int)m_vlpUsableCheckers[ m_iSelectedSkillLevelDataApplyType ].size();
for( int iChecker = 0; iChecker < iNumChecker; ++iChecker )
{
IDnSkillUsableChecker* pSkillChecker = m_vlpUsableCheckers[ m_iSelectedSkillLevelDataApplyType ].at( iChecker );
if( iType == pSkillChecker->GetType() )
return true;
}
return false;
}
bool CDnSkill::IsFinishedAuraSkill()
{
//<2F><><EFBFBD><EFBFBD> <20><>ų<EFBFBD>϶<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><>ȭ<EFBFBD><C8AD><EFBFBD><EFBFBD> <20>ջ<EFBFBD><D5BB>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD>
//<2F><>ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>θ<EFBFBD> <20>Ǵ<EFBFBD><C7B4>Ѵ<EFBFBD>.
if (m_hActor)
{
float fIncManaDelta = 0.0f;
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>
DNVector( DnBlowHandle ) vlManaAbIncBlows;
m_hActor->GatherAppliedStateBlowByBlowIndex( STATE_BLOW::BLOW_013, vlManaAbIncBlows );
if (!vlManaAbIncBlows.empty())
{
for( int i = 0; i < (int)vlManaAbIncBlows.size(); ++i )
{
DnBlowHandle hBlow = vlManaAbIncBlows.at( i );
fIncManaDelta += hBlow->GetFloatValue();
}
}
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>
float fMaxMP = static_cast<float>(m_hActor->GetMaxSP());
DNVector( DnBlowHandle ) vlManaRateIncBlows;
m_hActor->GatherAppliedStateBlowByBlowIndex( STATE_BLOW::BLOW_014, vlManaRateIncBlows );
if (!vlManaRateIncBlows.empty())
{
for( int i = 0; i < (int)vlManaRateIncBlows.size(); ++i )
{
DnBlowHandle hBlow = vlManaRateIncBlows.at( i );
fIncManaDelta += fMaxMP * hBlow->GetFloatValue();
}
}
#if defined(PRE_FIX_46381)
//231<33><31> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD>.
DNVector(DnBlowHandle) vlContinueBaseMPIncBlows;
m_hActor->GatherAppliedStateBlowByBlowIndex( STATE_BLOW::BLOW_231, vlContinueBaseMPIncBlows);
if (!vlContinueBaseMPIncBlows.empty())
{
for (int i = 0; i < (int)vlContinueBaseMPIncBlows.size(); ++i)
{
DnBlowHandle hBlow = vlContinueBaseMPIncBlows.at(i);
fIncManaDelta += static_cast<CDnContinueBaseMPIncBlow*>(hBlow.GetPointer())->GetMPIncValue();
}
}
#endif // PRE_FIX_46381
//<2F><><EFBFBD><EFBFBD> -<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ڸ<EFBFBD>..
if (m_hActor->GetSP() < -(int)fIncManaDelta)
return true;
}
return false;
}
void CDnSkill::AddPrefixBlow(DnActorHandle hActor, int nBlowID)
{
PREFIX_SKILL_BLOWLIST::iterator findIter = m_PrefixBlowList.find(hActor);
if (findIter != m_PrefixBlowList.end())
{
findIter->second.push_back(nBlowID);
}
else
{
BLOWLIST blowList;
blowList.push_back(nBlowID);
m_PrefixBlowList.insert(PREFIX_SKILL_BLOWLIST::value_type(hActor, blowList));
}
}
void CDnSkill::RemovePrefixBlow()
{
PREFIX_SKILL_BLOWLIST::iterator iter = m_PrefixBlowList.begin();
PREFIX_SKILL_BLOWLIST::iterator endIter = m_PrefixBlowList.end();
for (; iter != endIter; ++iter)
{
DnActorHandle hActor = iter->first;
if (!hActor)
continue;
BLOWLIST& blowList = iter->second;
for (int i = 0; i < (int)blowList.size(); ++i)
{
// [2010/12/13 semozz]
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><>Ŷ<EFBFBD><C5B6><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ǹǷ<C7B9>, <20><>Ŷ<EFBFBD><C5B6><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
hActor->CmdRemoveStateEffectFromID( blowList[i] );
}
blowList.clear();
}
m_PrefixBlowList.clear();
}
void CDnSkill::OnInitializeSummonMonsterInfo()
{
if (!m_hActor)
return;
set<string>::iterator iter = m_setUseActionNames.begin();
set<string>::iterator endIter = m_setUseActionNames.end();
string actionName;
CEtActionBase::ActionElementStruct *pActionElement = NULL;
bool bFindMonsterID = false;
for (; iter != endIter; ++iter)
{
actionName = *iter;
pActionElement = m_hActor->GetElement(actionName.c_str());
if (pActionElement)
{
CEtActionSignal *pSignal = NULL;
for( DWORD i=0; i<pActionElement->pVecSignalList.size(); i++ )
{
pSignal = pActionElement->pVecSignalList[i];
if (pSignal->GetSignalIndex() == STE_SummonMonster)
{
SummonMonsterStruct* pStruct = (SummonMonsterStruct *)pSignal->GetData();
m_SummonMonsterID = pStruct ? pStruct->MonsterID : -1;
if (m_SummonMonsterID != -1)
{
bFindMonsterID = true;
break;
}
}
}
}
if (bFindMonsterID)
break;
}
}
DnActorHandle CDnSkill::FindSummonMonster(int nMonsterID)
{
DnActorHandle hSummonMonster;
if (m_hActor && m_hActor->IsPlayerActor())
{
const list<DnMonsterActorHandle>& listSummonMonster = m_hActor->GetSummonedMonsterList();
if( false == listSummonMonster.empty() )
{
list<DnMonsterActorHandle>::const_iterator iter = listSummonMonster.begin();
for( iter; iter != listSummonMonster.end(); ++iter )
{
DnMonsterActorHandle hMonster = (*iter);
if( hMonster && hMonster->GetMonsterClassID() == nMonsterID )
{
hSummonMonster = hMonster;
break;
}
}
}
}
return hSummonMonster;
}
bool CDnSkill::SummonMonsterOff()
{
DnActorHandle hSummonMonster;
if (m_SummonMonsterID != -1)
hSummonMonster = FindSummonMonster(m_SummonMonsterID);
if (hSummonMonster)
{
hSummonMonster->CmdSuicide(false, false);
return true;
}
else
return false;
}
bool CDnSkill::IsSkipStateBlow(const char* szSkipStateBlows, STATE_BLOW::emBLOW_INDEX blowIndex)
{
if (szSkipStateBlows == NULL)
return false;
std::string stringValue = szSkipStateBlows;
std::vector<std::string> tokens;
std::string delimiters = ";";
TokenizeA(stringValue, tokens, delimiters);
for (UINT i = 0; i < tokens.size(); ++i)
{
STATE_BLOW::emBLOW_INDEX skipStateBlowIndex = (STATE_BLOW::emBLOW_INDEX)(atoi(tokens[i].c_str()));
if (skipStateBlowIndex == blowIndex)
return true;
}
return false;
}
void CDnSkill::AddProjectile(CDnProjectile* pProjectile)
{
if (pProjectile)
{
LOCAL_TIME startTime = pProjectile->GetSkillStartTime();
SKILL_PROJECTILE_LIST::iterator findIter = m_ProjectileList.find(startTime);
if (findIter == m_ProjectileList.end())
{
PROJECTILE_LIST projectileList;
projectileList.push_back(pProjectile);
m_ProjectileList.insert(std::make_pair(startTime, projectileList));
}
else
{
findIter->second.push_back(pProjectile);
}
}
}
void CDnSkill::RemoveProjectile(CDnProjectile* pProjectile)
{
if (pProjectile == NULL)
return;
LOCAL_TIME startTime = pProjectile->GetSkillStartTime();
SKILL_PROJECTILE_LIST::iterator findIter = m_ProjectileList.find(startTime);
if (findIter != m_ProjectileList.end())
{
PROJECTILE_LIST::iterator iter = findIter->second.begin();
for ( ; iter != findIter->second.end(); ++iter)
{
CDnProjectile* pTemp = *iter;
if (pTemp == pProjectile)
{
iter = findIter->second.erase(iter);
//<2F><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
if (findIter->second.empty() == true)
m_ProjectileList.erase(findIter);
break;
}
}
}
}
int CDnSkill::GetProjectileCount(LOCAL_TIME startTime)
{
int nListCount = 0;
SKILL_PROJECTILE_LIST::iterator findIter = m_ProjectileList.find(startTime);
if (findIter != m_ProjectileList.end())
nListCount = (int)findIter->second.size();
return nListCount;
}
void CDnSkill::ApplyAddtionalStateInfo()
{
if( !m_hActor ) return;
//#52905 [Į<><C4AE>]"<22><>ø <20>߰<EFBFBD> ȿ<><C8BF>"
//<2F><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ǿ<EFBFBD> <20>´<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20>߰<EFBFBD> <20>Ѵ<EFBFBD>..
if( m_hActor->IsAppliedThisStateBlow(STATE_BLOW::BLOW_253) )
{
DNVector(DnBlowHandle) vlBlows;
m_hActor->GatherAppliedStateBlowByBlowIndex(STATE_BLOW::BLOW_253, vlBlows);
int nListCount = (int)vlBlows.size();
for (int iIndex = 0; iIndex < nListCount; ++iIndex)
{
DnBlowHandle hBlow = vlBlows[iIndex];
if (hBlow && hBlow->IsEnd() == false)
{
CDnAdditionalStateInfoBlow* pAddtionalStateInfoBlow = static_cast<CDnAdditionalStateInfoBlow*>(hBlow.GetPointer());
if (pAddtionalStateInfoBlow)
{
STATE_BLOW::emBLOW_INDEX DestBlowIndex = pAddtionalStateInfoBlow->GetDestStateIndex();
CDnSkill::StateEffectStruct addStateInfo = pAddtionalStateInfoBlow->GetTargetStateInfo();
int iNumStateBlow = (int)m_vlStateEffectList[ m_iSelectedSkillLevelDataApplyType ].size();
for( int i = 0; i < iNumStateBlow; ++i )
{
const StateEffectStruct& SE = m_vlStateEffectList[ m_iSelectedSkillLevelDataApplyType ].at( i );
if( DestBlowIndex == SE.nID)
{
addStateInfo.nDurationTime = SE.nDurationTime; //<2F><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20>ð<EFBFBD><C3B0><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
//<2F>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
m_AddtionalStateInfoList.push_back(addStateInfo);
OutputDebug("<EFBFBD>߰<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.... %d, %s\n", addStateInfo.nID, addStateInfo.szValue.c_str());
}
}
}
}
}
//<2F>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD>Ʈ <20><>ȸ <20>ϸ鼭 <20><><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>߰<EFBFBD> <20>Ѵ<EFBFBD>.
int nAddStateCount = (int)m_AddtionalStateInfoList.size();
for (int i = 0; i < nAddStateCount; ++i)
{
CDnSkill::StateEffectStruct addStateEffect = m_AddtionalStateInfoList[i];
m_vlStateEffectList[m_iSelectedSkillLevelDataApplyType].push_back(addStateEffect);
}
}
if( m_hActor->IsAppliedThisStateBlow(STATE_BLOW::BLOW_276) )
{
DNVector(DnBlowHandle) vlBlows;
m_hActor->GatherAppliedStateBlowByBlowIndex(STATE_BLOW::BLOW_276, vlBlows);
for( DWORD i=0; i<vlBlows.size(); i++ )
{
if( vlBlows[i] )
{
CDnAddStateBySkillGroupBlow* pAddStateBySkillGroupBlow = static_cast<CDnAddStateBySkillGroupBlow*>(vlBlows[i].GetPointer());
if( pAddStateBySkillGroupBlow ) pAddStateBySkillGroupBlow->ApplyAddtionalStateBlowFromSkill( GetClassID() );
}
}
}
}
void CDnSkill::RemoveAddtionalStateInfo()
{
//<2F><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20>߰<EFBFBD><DFB0><EFBFBD> <20>͵<EFBFBD> <20><><EFBFBD><EFBFBD>...
int nListCount = (int)m_AddtionalStateInfoList.size();
for (int iIndex = 0; iIndex < nListCount; ++iIndex)
{
StateEffectStruct addStateInfo = m_AddtionalStateInfoList[iIndex];
std::vector<StateEffectStruct>::iterator iter = m_vlStateEffectList[ m_iSelectedSkillLevelDataApplyType ].begin();
for( ; iter != m_vlStateEffectList[m_iSelectedSkillLevelDataApplyType].end(); ++iter)
{
StateEffectStruct SE = (*iter);
if (SE.nID == addStateInfo.nID &&
SE.ApplyType == addStateInfo.ApplyType &&
/*SE.nDurationTime == addStateInfo.nDurationTime &&*/ //<2F><><EFBFBD>ӽð<D3BD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD>...
SE.bAddtionalStateInfo == addStateInfo.bAddtionalStateInfo)
{
iter = m_vlStateEffectList[m_iSelectedSkillLevelDataApplyType].erase(iter);
break;
}
}
}
m_AddtionalStateInfoList.clear();
if( m_hActor->IsAppliedThisStateBlow(STATE_BLOW::BLOW_276) )
{
DNVector(DnBlowHandle) vlBlows;
m_hActor->GatherAppliedStateBlowByBlowIndex(STATE_BLOW::BLOW_276, vlBlows);
for( DWORD i=0; i<vlBlows.size(); i++ )
{
if( vlBlows[i] )
{
CDnAddStateBySkillGroupBlow* pAddStateBySkillGroupBlow = static_cast<CDnAddStateBySkillGroupBlow*>(vlBlows[i].GetPointer());
if( pAddStateBySkillGroupBlow ) pAddStateBySkillGroupBlow->RemoveAdditionalStateBlow();
}
}
}
}
#if defined(PRE_FIX_64312)
bool CDnSkill::IsSummonMonsterSkill()
{
m_bIsSummonMonsterSkill = false;
//<2F><>ų Checker<65>߿<EFBFBD> <20><>ȯ<EFBFBD><C8AF><EFBFBD><EFBFBD><EFBFBD><EFBFBD> üũ<C3BC><C5A9> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD><C8AF><EFBFBD><EFBFBD><EFBFBD>Ϳ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ϴ<EFBFBD> <20><>ų???(<28><>ȹ<EFBFBD>ǰ<EFBFBD>..)
int iNumChecker = (int)m_vlpUsableCheckers[ m_iSelectedSkillLevelDataApplyType ].size();
for( int iChecker = 0; iChecker < iNumChecker; ++iChecker )
{
IDnSkillUsableChecker* pChecker = m_vlpUsableCheckers[ m_iSelectedSkillLevelDataApplyType ].at( iChecker );
if( pChecker && pChecker->GetType() == IDnSkillUsableChecker::SUMMON_CHECKER )
{
m_bIsSummonMonsterSkill = true;
break;
}
}
return m_bIsSummonMonsterSkill;
}
void CDnSkill::AddSummonMonsterEnchantSkill(DnSkillHandle hSkill)
{
m_SummonMonsterEnchantSkill = hSkill;
}
void CDnSkill::RemoveSummonMonsterEnchantSkill()
{
m_SummonMonsterEnchantSkill.Identity();
}
bool CDnSkill::ApplySummonMonsterEnchantSkill(DnSkillHandle hSkill)
{
m_isAppliedSummonMonsterEnchantSkill = true;
return ApplyEnchantSkill(hSkill);
}
#endif // PRE_FIX_64312
#if defined(PRE_ADD_TOTAL_LEVEL_SKILL)
float CDnSkill::GetOrigDelayTime()
{
float fDelayTime = 0.0f;
if( 0.0f < m_fAnotherGlobalSkillCoolTime )
fDelayTime = m_fAnotherGlobalSkillCoolTime;
else
fDelayTime = m_fDelayTime[ m_iSelectedSkillLevelDataApplyType ];
return fDelayTime;
}
void CDnSkill::UpdateGlobalCoolTime(float fRate)
{
//<2F>۷ι<DBB7> <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD> <20>ְ<EFBFBD>, <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD><C7BE><EFBFBD> <20><><EFBFBD><EFBFBD>
if (m_iGlobalSkillGroupID > 0)
{
if (m_fLeftDelayTime > 0)
{
m_fDeltaGlobalCoolTime += fRate;
float fOrigDelayTime = GetOrigDelayTime();
m_fLeftDelayTime -= fOrigDelayTime * fRate;
}
}
}
void CDnSkill::ResetGlobalCoolTime(float fRate)
{
//<2F>۷ι<DBB7> <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD> <20>ְ<EFBFBD>, <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD><C7BE><EFBFBD> <20><><EFBFBD><EFBFBD>
if (m_iGlobalSkillGroupID > 0 )
{
//<2F>۷ι<DBB7> <20><>Ÿ<EFBFBD><C5B8> <20><><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
if (m_fDeltaGlobalCoolTime > 0.0)
{
float fOrigDelayTime = GetOrigDelayTime();
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ϸ<EFBFBD><CFB7><EFBFBD> <20><>ġ<EFBFBD><C4A1><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if (m_fDeltaGlobalCoolTime < fRate)
fRate = m_fDeltaGlobalCoolTime;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>..
m_fDeltaGlobalCoolTime -= fRate;
if (m_fDeltaGlobalCoolTime < 0.0f)
m_fDeltaGlobalCoolTime = 0.0f;
//<2F><><EFBFBD><EFBFBD> <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>
if (m_fLeftDelayTime > 0)
m_fLeftDelayTime += fOrigDelayTime * fRate;
}
}
}
#endif // PRE_ADD_TOTAL_LEVEL_SKILL
#if defined(PRE_ADD_65808)
bool CDnSkill::IsSummonMonsterRecall(int& monsterID)
{
//PlayAniProcess<73><73> <20>̿<EFBFBD><CCBF>ϰ<EFBFBD>, <20>ش<EFBFBD> <20><><EFBFBD>ۿ<EFBFBD> SummonMonster<65>ñ׳<C3B1><D7B3><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ϸ<EFBFBD> true<75><65> <20><><EFBFBD><EFBFBD>..
CDnPlayAniProcess* pAniProcess = static_cast<CDnPlayAniProcess*>(GetProcessor( IDnSkillProcessor::PLAY_ANI ));
if (pAniProcess && m_hActor)
{
const char* szActionName = pAniProcess->GetActionName();
if (szActionName == NULL)
return false;
CEtActionBase::ActionElementStruct *pStruct = m_hActor->GetElement(szActionName);
if (pStruct)
{
int selectedMonsterID = -1;
CEtActionSignal *pSignal = NULL;
for (int i = 0; i < (int)pStruct->pVecSignalList.size(); ++i)
{
pSignal = pStruct->pVecSignalList[i];
if (pSignal == NULL)
continue;
int signalIndex = pSignal->GetSignalIndex();
switch(signalIndex)
{
case STE_SummonMonster:
{
SummonMonsterStruct* pSummonMonsterInfo = (SummonMonsterStruct *)pSignal->GetData();
if (pSummonMonsterInfo)
selectedMonsterID = pSummonMonsterInfo->MonsterID;
}
break;
case STE_SummonMonsterInfo:
{
SummonMonsterInfoStruct* pInfo = (SummonMonsterInfoStruct*)pSignal->GetData();
if (pInfo)
selectedMonsterID = pInfo->MonsterID;
}
break;
}
if (selectedMonsterID != -1)
break;
}
if (selectedMonsterID != -1)
{
monsterID = selectedMonsterID;
return true;
}
}
}
return false;
}
#endif // PRE_ADD_65808
#if defined(_GAMESERVER)
bool CoolTimeInfo::Process(LOCAL_TIME localTime, float fDelta)
{
switch( m_eDurationType )
{
case CDnSkill::DurationTypeEnum::Instantly:
case CDnSkill::DurationTypeEnum::Buff:
case CDnSkill::DurationTypeEnum::Debuff:
case CDnSkill::DurationTypeEnum::SummonOnOff:
case CDnSkill::DurationTypeEnum::StanceChange:
{
if( m_fLeftDelayTime == 0.0f ) return false;
m_fLeftDelayTime -= fDelta;
if( m_fLeftDelayTime < 0.f )
m_fLeftDelayTime = 0.f;
m_fCoolTime = ( 1.0f / (m_fDelayTime*m_fCoolTimeAdjustBlowValue) ) * m_fLeftDelayTime;
}
break;
case CDnSkill::DurationTypeEnum::TimeToggle:
break;
case CDnSkill::DurationTypeEnum::ActiveToggle:
case CDnSkill::DurationTypeEnum::ActiveToggleForSummon:
break;
case CDnSkill::DurationTypeEnum::Aura:
break;
}
return (m_fCoolTime != 0.0f && m_fLeftDelayTime > 0.0f);
}
void CoolTimeInfo::OnBeginCoolTime()
{
m_fCoolTime = (m_fDelayTime == 0.f) ? 0.0f : 1.0f;
m_fCoolTimeAdjustBlowValue = 1.0f;
m_fLeftDelayTime = m_fDelayTime * m_fCoolTimeAdjustBlowValue;
}
void CoolTimeInfo::SetInfo(DnSkillHandle &hSkill)
{
m_nSkillID = hSkill->GetClassID();
m_hActor = hSkill->GetActor();
m_eDurationType = hSkill->GetDurationType();
m_fCoolTimeAdjustBlowValue = 1.0f;
m_fDelayTime = hSkill->GetDelayTime();
}
#if defined(PRE_ADD_PREFIX_SYSTE_RENEW)
void CoolTimeInfo::SetInfo(CDnPrefixSkill* pPrefixSkill)
{
m_nSkillID = pPrefixSkill->GetSkillType();
DnSkillHandle hSkill = pPrefixSkill->GetSkillHandle();
if (hSkill)
{
m_hActor = hSkill->GetActor();
m_eDurationType = hSkill->GetDurationType();
m_fCoolTimeAdjustBlowValue = 1.0f;
m_fDelayTime = hSkill->GetDelayTime();
}
}
#endif // PRE_ADD_PREFIX_SYSTE_RENEW
bool CoolTimeManager::IsCoolTime(int nSkillID)
{
COOLTIME_LIST::iterator findIter = m_CoolTimeList.find(nSkillID);
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD>ϵǾ<CFB5> <20>ִٸ<D6B4> <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʾҴ<CABE>??
return (findIter != m_CoolTimeList.end());
}
void CoolTimeManager::AddCoolTime(DnSkillHandle hSkill)
{
if (!hSkill)
return;
int nSkillID = hSkill->GetClassID();
COOLTIME_LIST::iterator findIter = m_CoolTimeList.find(nSkillID);
//<2F><><EFBFBD><EFBFBD> <20><>ų ID<49><44> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
if (findIter == m_CoolTimeList.end())
{
CoolTimeInfo *pCoolTimeInfo = new CoolTimeInfo();
pCoolTimeInfo->SetInfo(hSkill);
pCoolTimeInfo->OnBeginCoolTime();
m_CoolTimeList.insert(COOLTIME_LIST::value_type(nSkillID, pCoolTimeInfo));
}
}
#if defined(PRE_ADD_PREFIX_SYSTE_RENEW)
void CoolTimeManager::AddCoolTime(CDnPrefixSkill* pPrefixSkill)
{
if (!pPrefixSkill)
return;
int nSkillType = pPrefixSkill->GetSkillType();
COOLTIME_LIST::iterator findIter = m_CoolTimeList.find(nSkillType);
//<2F><><EFBFBD><EFBFBD> <20><>ų ID<49><44> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
if (findIter == m_CoolTimeList.end())
{
CoolTimeInfo *pCoolTimeInfo = new CoolTimeInfo();
pCoolTimeInfo->SetInfo(pPrefixSkill);
pCoolTimeInfo->OnBeginCoolTime();
m_CoolTimeList.insert(COOLTIME_LIST::value_type(nSkillType, pCoolTimeInfo));
}
}
#endif // PRE_ADD_PREFIX_SYSTE_RENEW
void CoolTimeManager::RemoveCoolTime(int nSkillID)
{
COOLTIME_LIST::iterator findIter = m_CoolTimeList.find(nSkillID);
if (findIter != m_CoolTimeList.end())
{
CoolTimeInfo* pCoolTimeInfo = findIter->second;
if (pCoolTimeInfo)
delete pCoolTimeInfo;
m_CoolTimeList.erase(findIter);
}
}
void CoolTimeManager::Process(LOCAL_TIME localTime, float fDelta)
{
COOLTIME_LIST::iterator iter = m_CoolTimeList.begin();
COOLTIME_LIST::iterator endIter = m_CoolTimeList.end();
std::list<int> removeCoolTimeList;
for (; iter != endIter; ++iter)
{
if (!iter->second->Process(localTime, fDelta))
removeCoolTimeList.push_back(iter->first);
}
if (!removeCoolTimeList.empty())
{
std::list<int>::iterator iter = removeCoolTimeList.begin();
std::list<int>::iterator endIter = removeCoolTimeList.end();
for (; iter != endIter; ++iter)
{
RemoveCoolTime((*iter));
}
removeCoolTimeList.clear();
}
}
void CoolTimeManager::InitList()
{
COOLTIME_LIST::iterator iter = m_CoolTimeList.begin();
COOLTIME_LIST::iterator endIter = m_CoolTimeList.end();
for (; iter != endIter; ++iter)
{
CoolTimeInfo* pCoolTimeInfo = iter->second;
if (pCoolTimeInfo)
delete pCoolTimeInfo;
}
m_CoolTimeList.clear();
}
#endif // _GAMESERVER
#if defined(PRE_ADD_PREFIX_SYSTE_RENEW)
CDnPrefixSkill::CDnPrefixSkill(int nPrefixType)
{
m_nPrefixType = nPrefixType;
m_fProbability = 0.0f;
}
CDnPrefixSkill::~CDnPrefixSkill()
{
}
void CDnPrefixSkill::SetSkillHandle(DnSkillHandle hSkill)
{
m_hSkill = hSkill;
}
void CDnPrefixSkill::UpdateCandidateSkill()
{
std::list<DnSkillHandle>::iterator iter = m_SkillList.begin();
std::list<DnSkillHandle>::iterator endIter = m_SkillList.end();
float fDelayTime = FLT_MAX;
DnSkillHandle hSelectedSkill;
for (; iter != endIter; ++iter)
{
DnSkillHandle hSkill = *iter;
if (!hSkill)
continue;
float fSkillDelayTime = hSkill->GetDelayTime();
if (fSkillDelayTime < fDelayTime)
{
hSelectedSkill = hSkill;
fDelayTime = fSkillDelayTime;
}
}
if (hSelectedSkill)
SetSkillHandle(hSelectedSkill);
}
void CDnPrefixSkill::AddSkill(DnSkillHandle hSkill)
{
if (!hSkill) return;
m_SkillList.push_back(hSkill);
//<2F>ش<EFBFBD> <20><>ų<EFBFBD><C5B3> Ȯ<><C8AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>.
CDnProbabilityChecker* pProbabilityChecker = static_cast<CDnProbabilityChecker*>(hSkill->GetChecker(IDnSkillUsableChecker::PROB_CHECKER));
m_fProbability += pProbabilityChecker ? pProbabilityChecker->GetProbability() : 0.0f;
UpdateCandidateSkill();
AddStateEffectInfo(hSkill);
}
void CDnPrefixSkill::RemoveSkill(DnSkillHandle hSkill)
{
std::list<DnSkillHandle>::iterator iter = m_SkillList.begin();
std::list<DnSkillHandle>::iterator endIter = m_SkillList.end();
for (; iter != endIter; ++iter)
{
if ((*iter) == hSkill)
{
//<2F>ش<EFBFBD> <20><>ų<EFBFBD><C5B3> Ȯ<><C8AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>.
CDnProbabilityChecker* pProbabilityChecker = static_cast<CDnProbabilityChecker*>(hSkill->GetChecker(IDnSkillUsableChecker::PROB_CHECKER));
m_fProbability -= pProbabilityChecker ? pProbabilityChecker->GetProbability() : 0.0f;
m_SkillList.erase(iter);
break;
}
}
UpdateCandidateSkill();
//<2F><>ų <20><><EFBFBD><EFBFBD> <20>ɶ<EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD>..
UpdateStateEffects();
}
void CDnPrefixSkill::UpdateStateEffects()
{
//1.<2E><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>..
m_vlStateEffectList.clear();
//<2F><>ų <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><> <20><><EFBFBD><EFBFBD>.
std::list<DnSkillHandle>::iterator iter = m_SkillList.begin();
std::list<DnSkillHandle>::iterator endIter = m_SkillList.end();
for (; iter != endIter; ++iter)
{
DnSkillHandle hSkill = (*iter);
if (hSkill)
{
AddStateEffectInfo(hSkill);
}
}
}
void CDnPrefixSkill::AddStateEffectInfo(DnSkillHandle hSkill)
{
if (m_vlStateEffectList.empty())
{
//hSkill<6C><6C> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>״<EFBFBD><D7B4><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>߰<EFBFBD> <20>Ѵ<EFBFBD>.
int nStateEffectCount = hSkill->GetStateEffectCount();
for (int i = 0; i < nStateEffectCount; ++i)
{
CDnSkill::StateEffectStruct* pAddStateEffect = hSkill->GetStateEffectFromIndex(i);
if (pAddStateEffect)
m_vlStateEffectList.push_back(*pAddStateEffect);
}
}
else
{
//<2F><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD> <20><><EFBFBD><EFBFBD>..
if (m_vlStateEffectList.size() != hSkill->GetStateEffectCount())
return;
switch(m_nPrefixType)
{
case Prefix_000: //<2F>ı<EFBFBD><C4B1><EFBFBD>
AddStateEffectInfo_Prefix_000(hSkill);
break;
case Prefix_001: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
AddStateEffectInfo_Prefix_001(hSkill);
break;
case Prefix_002: //<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
AddStateEffectInfo_Prefix_002(hSkill);
break;
case Prefix_003: //<2F>ٶ<EFBFBD><D9B6><EFBFBD> <20><><EFBFBD><EFBFBD>
AddStateEffectInfo_Prefix_003(hSkill);
break;
case Prefix_004: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
AddStateEffectInfo_Prefix_004(hSkill);
break;
case Prefix_005: //<2F><>Ȥ<EFBFBD><C8A4>
AddStateEffectInfo_Prefix_005(hSkill);
break;
case Prefix_006: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
AddStateEffectInfo_Prefix_006(hSkill);
break;
case Prefix_007: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
AddStateEffectInfo_Prefix_007(hSkill);
break;
case Prefix_008: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
AddStateEffectInfo_Prefix_008(hSkill);
break;
case Prefix_009: //Ȱ<><C8B0><EFBFBD><EFBFBD>
AddStateEffectInfo_Prefix_009(hSkill);
break;
case Prefix_010: //ġ<><C4A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
AddStateEffectInfo_Prefix_010(hSkill);
break;
case Prefix_011: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
AddStateEffectInfo_Prefix_011(hSkill);
break;
case Prefix_012: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
AddStateEffectInfo_Prefix_012(hSkill);
break;
case Prefix_013: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
AddStateEffectInfo_Prefix_013(hSkill);
break;
case Prefix_014: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
AddStateEffectInfo_Prefix_014(hSkill);
break;
case Prefix_015: //ö<><C3B6><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
AddStateEffectInfo_Prefix_015(hSkill);
break;
case Prefix_016: //<2F><EFBFBD><E5B8B7> <20><><EFBFBD><EFBFBD>
AddStateEffectInfo_Prefix_016(hSkill);
break;
case Prefix_017: //<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
AddStateEffectInfo_Prefix_017(hSkill);
break;
case Prefix_018: //<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
AddStateEffectInfo_Prefix_018(hSkill);
break;
case Prefix_019: //<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
AddStateEffectInfo_Prefix_019(hSkill);
break;
case Prefix_020: //ö<><C3B6><EFBFBD><EFBFBD> <20><><EFBFBD>
AddStateEffectInfo_Prefix_020(hSkill);
break;
case Prefix_021: //<2F><EFBFBD><E5B8B7> <20><><EFBFBD>
AddStateEffectInfo_Prefix_021(hSkill);
break;
case Prefix_022: //<2F><><EFBFBD><EFBFBD> <20><><EFBFBD>
AddStateEffectInfo_Prefix_022(hSkill);
break;
case Prefix_023: //<2F>ٶ<EFBFBD><D9B6><EFBFBD> <20><><EFBFBD>
AddStateEffectInfo_Prefix_023(hSkill);
break;
case Prefix_024: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
AddStateEffectInfo_Prefix_024(hSkill);
break;
case Prefix_025: //<2F>ǰ<EFBFBD><C7B0><EFBFBD>
AddStateEffectInfo_Prefix_025(hSkill);
break;
case Prefix_026: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
AddStateEffectInfo_Prefix_026(hSkill);
break;
case Prefix_027: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
AddStateEffectInfo_Prefix_027(hSkill);
break;
case Prefix_028: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
AddStateEffectInfo_Prefix_028(hSkill);
break;
// case Prefix_029: //<2F>߰<EFBFBD><DFB0><EFBFBD>
// AddStateEffectInfo_Prefix_029(hSkill);
// break;
case Prefix_030: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
AddStateEffectInfo_Prefix_030(hSkill);
break;
case Prefix_031: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
AddStateEffectInfo_Prefix_031(hSkill);
break;
// case Prefix_032: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// AddStateEffectInfo_Prefix_032(hSkill);
// break;
// case Prefix_033: //<2F>ұ<EFBFBD><D2B1><EFBFBD>
// AddStateEffectInfo_Prefix_033(hSkill);
// break;
case Prefix_034: //<2F><><EFBFBD><EFBFBD> <20><><EFBFBD>
AddStateEffectInfo_Prefix_034(hSkill);
break;
case Prefix_035: //<2F><><EFBFBD><EFBFBD> <20><><EFBFBD>
AddStateEffectInfo_Prefix_035(hSkill);
break;
case Prefix_036: //<2F><><EFBFBD><EFBFBD> <20><><EFBFBD>
AddStateEffectInfo_Prefix_036(hSkill);
break;
case Prefix_037: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
AddStateEffectInfo_Prefix_037(hSkill);
break;
default:
break;
}
}
}
void CDnPrefixSkill::AddStateEffectInfo( STATE_BLOW::emBLOW_INDEX blowList[], int nCount, DnSkillHandle hSkill )
{
if (!hSkill)
return;
int nAddStateEffectCount = hSkill->GetStateEffectCount();
//<2F><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 4<><34>
if (nAddStateEffectCount != nCount)
{
OutputDebug("<EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD> <20><>ų Type[%d]<5D><> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٸ<EFBFBD>...!!\n", m_nPrefixType);
return;
}
for (int i = 0; i < nCount; ++i)
{
CDnSkill::StateEffectStruct* pAddStateEffect = hSkill->GetStateEffectFromIndex(i);
CDnSkill::StateEffectStruct* pOrigStateEffect = &m_vlStateEffectList[i];
//<2F><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> Index<65><78> BLOW_213<31><33> <20>ƴϸ<C6B4> <20>߸<EFBFBD><DFB8>ȰŴ<C8B0>..
if ((STATE_BLOW::emBLOW_INDEX)pOrigStateEffect->nID != blowList[i])
{
OutputDebug("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȿ<EFBFBD><EFBFBD> Index<65><78> <20>ٸ<EFBFBD>..%d<>̾<EFBFBD><CCBE><EFBFBD> <20>ϴµ<CFB4> %d<>̳<EFBFBD>...!!!\n", blowList[i], pOrigStateEffect->nID);
continue;
}
//<2F>ΰ<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> Index<65><78> <20>ٸ<EFBFBD><D9B8><EFBFBD>..
if (pAddStateEffect->nID != pOrigStateEffect->nID)
{
OutputDebug("<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> Index<65><78> <20>ٸ<EFBFBD>..Orig[%d], Add[%d]..!!!\n", pOrigStateEffect->nID, pAddStateEffect->nID);
continue;
}
std::string szNewValue = "";
CDnCreateBlow::AddStateEffectValue((STATE_BLOW::emBLOW_INDEX)pOrigStateEffect->nID, pOrigStateEffect->szValue.c_str(), pAddStateEffect->szValue.c_str(), szNewValue);
OutputDebug("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(%s), <20>߰<EFBFBD> <20>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(%s), <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>(%s)\n", pOrigStateEffect->szValue.c_str(), pAddStateEffect->szValue.c_str(), szNewValue.c_str());
pOrigStateEffect->szValue = szNewValue;
//<2F><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> ū <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
pOrigStateEffect->nDurationTime = max(pOrigStateEffect->nDurationTime, pAddStateEffect->nDurationTime);
}
}
void CDnPrefixSkill::AddStateEffectInfo_Prefix_000(DnSkillHandle hSkill) //<2F>ı<EFBFBD><C4B1><EFBFBD>
{
STATE_BLOW::emBLOW_INDEX blowList[] =
{
STATE_BLOW::BLOW_213,
};
int nCount = sizeof(blowList) / sizeof(STATE_BLOW::emBLOW_INDEX);
AddStateEffectInfo(blowList, nCount, hSkill);
}
void CDnPrefixSkill::AddStateEffectInfo_Prefix_001(DnSkillHandle hSkill) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
STATE_BLOW::emBLOW_INDEX blowList[] =
{
STATE_BLOW::BLOW_214,
};
int nCount = sizeof(blowList) / sizeof(STATE_BLOW::emBLOW_INDEX);
AddStateEffectInfo(blowList, nCount, hSkill);
}
void CDnPrefixSkill::AddStateEffectInfo_Prefix_002(DnSkillHandle hSkill) //<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
{
STATE_BLOW::emBLOW_INDEX blowList[] =
{
STATE_BLOW::BLOW_221,
STATE_BLOW::BLOW_124,
STATE_BLOW::BLOW_128,
};
int nCount = sizeof(blowList) / sizeof(STATE_BLOW::emBLOW_INDEX);
AddStateEffectInfo(blowList, nCount, hSkill);
}
void CDnPrefixSkill::AddStateEffectInfo_Prefix_003(DnSkillHandle hSkill) //<2F>ٶ<EFBFBD><D9B6><EFBFBD> <20><><EFBFBD><EFBFBD>
{
STATE_BLOW::emBLOW_INDEX blowList[] =
{
STATE_BLOW::BLOW_221,
STATE_BLOW::BLOW_126,
};
int nCount = sizeof(blowList) / sizeof(STATE_BLOW::emBLOW_INDEX);
AddStateEffectInfo(blowList, nCount, hSkill);
}
void CDnPrefixSkill::AddStateEffectInfo_Prefix_004(DnSkillHandle hSkill) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
{
STATE_BLOW::emBLOW_INDEX blowList[] =
{
STATE_BLOW::BLOW_214,
STATE_BLOW::BLOW_036,
STATE_BLOW::BLOW_037,
STATE_BLOW::BLOW_038,
STATE_BLOW::BLOW_039,
};
int nCount = sizeof(blowList) / sizeof(STATE_BLOW::emBLOW_INDEX);
AddStateEffectInfo(blowList, nCount, hSkill);
}
void CDnPrefixSkill::AddStateEffectInfo_Prefix_005(DnSkillHandle hSkill) //<2F><>Ȥ<EFBFBD><C8A4>
{
STATE_BLOW::emBLOW_INDEX blowList[] =
{
STATE_BLOW::BLOW_157,
};
int nCount = sizeof(blowList) / sizeof(STATE_BLOW::emBLOW_INDEX);
AddStateEffectInfo(blowList, nCount, hSkill);
}
void CDnPrefixSkill::AddStateEffectInfo_Prefix_006(DnSkillHandle hSkill) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
{
STATE_BLOW::emBLOW_INDEX blowList[] =
{
STATE_BLOW::BLOW_035,
STATE_BLOW::BLOW_182,
};
int nCount = sizeof(blowList) / sizeof(STATE_BLOW::emBLOW_INDEX);
AddStateEffectInfo(blowList, nCount, hSkill);
}
void CDnPrefixSkill::AddStateEffectInfo_Prefix_007(DnSkillHandle hSkill) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
{
STATE_BLOW::emBLOW_INDEX blowList[] =
{
STATE_BLOW::BLOW_016,
};
int nCount = sizeof(blowList) / sizeof(STATE_BLOW::emBLOW_INDEX);
AddStateEffectInfo(blowList, nCount, hSkill);
}
void CDnPrefixSkill::AddStateEffectInfo_Prefix_008(DnSkillHandle hSkill) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
{
STATE_BLOW::emBLOW_INDEX blowList[] =
{
STATE_BLOW::BLOW_018,
};
int nCount = sizeof(blowList) / sizeof(STATE_BLOW::emBLOW_INDEX);
AddStateEffectInfo(blowList, nCount, hSkill);
}
void CDnPrefixSkill::AddStateEffectInfo_Prefix_009(DnSkillHandle hSkill) //Ȱ<><C8B0><EFBFBD><EFBFBD>
{
STATE_BLOW::emBLOW_INDEX blowList[] =
{
STATE_BLOW::BLOW_014,
};
int nCount = sizeof(blowList) / sizeof(STATE_BLOW::emBLOW_INDEX);
AddStateEffectInfo(blowList, nCount, hSkill);
}
void CDnPrefixSkill::AddStateEffectInfo_Prefix_010(DnSkillHandle hSkill) //ġ<><C4A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
STATE_BLOW::emBLOW_INDEX blowList[] =
{
STATE_BLOW::BLOW_158,
};
int nCount = sizeof(blowList) / sizeof(STATE_BLOW::emBLOW_INDEX);
AddStateEffectInfo(blowList, nCount, hSkill);
}
void CDnPrefixSkill::AddStateEffectInfo_Prefix_011(DnSkillHandle hSkill) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
STATE_BLOW::emBLOW_INDEX blowList[] =
{
STATE_BLOW::BLOW_070,
};
int nCount = sizeof(blowList) / sizeof(STATE_BLOW::emBLOW_INDEX);
AddStateEffectInfo(blowList, nCount, hSkill);
}
void CDnPrefixSkill::AddStateEffectInfo_Prefix_012(DnSkillHandle hSkill) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
STATE_BLOW::emBLOW_INDEX blowList[] =
{
STATE_BLOW::BLOW_221,
STATE_BLOW::BLOW_175,
};
int nCount = sizeof(blowList) / sizeof(STATE_BLOW::emBLOW_INDEX);
AddStateEffectInfo(blowList, nCount, hSkill);
}
void CDnPrefixSkill::AddStateEffectInfo_Prefix_013(DnSkillHandle hSkill) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
STATE_BLOW::emBLOW_INDEX blowList[] =
{
STATE_BLOW::BLOW_079,
};
int nCount = sizeof(blowList) / sizeof(STATE_BLOW::emBLOW_INDEX);
AddStateEffectInfo(blowList, nCount, hSkill);
}
void CDnPrefixSkill::AddStateEffectInfo_Prefix_014(DnSkillHandle hSkill) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
STATE_BLOW::emBLOW_INDEX blowList[] =
{
STATE_BLOW::BLOW_076,
};
int nCount = sizeof(blowList) / sizeof(STATE_BLOW::emBLOW_INDEX);
AddStateEffectInfo(blowList, nCount, hSkill);
}
void CDnPrefixSkill::AddStateEffectInfo_Prefix_015(DnSkillHandle hSkill) //ö<><C3B6><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
{
STATE_BLOW::emBLOW_INDEX blowList[] =
{
STATE_BLOW::BLOW_004,
};
int nCount = sizeof(blowList) / sizeof(STATE_BLOW::emBLOW_INDEX);
AddStateEffectInfo(blowList, nCount, hSkill);
}
void CDnPrefixSkill::AddStateEffectInfo_Prefix_016(DnSkillHandle hSkill) //<2F><EFBFBD><E5B8B7> <20><><EFBFBD><EFBFBD>
{
STATE_BLOW::emBLOW_INDEX blowList[] =
{
STATE_BLOW::BLOW_094,
};
int nCount = sizeof(blowList) / sizeof(STATE_BLOW::emBLOW_INDEX);
AddStateEffectInfo(blowList, nCount, hSkill);
}
void CDnPrefixSkill::AddStateEffectInfo_Prefix_017(DnSkillHandle hSkill) //<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
{
STATE_BLOW::emBLOW_INDEX blowList[] =
{
STATE_BLOW::BLOW_032,
STATE_BLOW::BLOW_182,
};
int nCount = sizeof(blowList) / sizeof(STATE_BLOW::emBLOW_INDEX);
AddStateEffectInfo(blowList, nCount, hSkill);
}
void CDnPrefixSkill::AddStateEffectInfo_Prefix_018(DnSkillHandle hSkill) //<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
{
STATE_BLOW::emBLOW_INDEX blowList[] =
{
STATE_BLOW::BLOW_033,
STATE_BLOW::BLOW_182,
};
int nCount = sizeof(blowList) / sizeof(STATE_BLOW::emBLOW_INDEX);
AddStateEffectInfo(blowList, nCount, hSkill);
}
void CDnPrefixSkill::AddStateEffectInfo_Prefix_019(DnSkillHandle hSkill) //<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
{
STATE_BLOW::emBLOW_INDEX blowList[] =
{
STATE_BLOW::BLOW_034,
STATE_BLOW::BLOW_182,
};
int nCount = sizeof(blowList) / sizeof(STATE_BLOW::emBLOW_INDEX);
AddStateEffectInfo(blowList, nCount, hSkill);
}
void CDnPrefixSkill::AddStateEffectInfo_Prefix_020(DnSkillHandle hSkill) //ö<><C3B6><EFBFBD><EFBFBD> <20><><EFBFBD>
{
STATE_BLOW::emBLOW_INDEX blowList[] =
{
STATE_BLOW::BLOW_134,
};
int nCount = sizeof(blowList) / sizeof(STATE_BLOW::emBLOW_INDEX);
AddStateEffectInfo(blowList, nCount, hSkill);;
}
void CDnPrefixSkill::AddStateEffectInfo_Prefix_021(DnSkillHandle hSkill) //<2F><EFBFBD><E5B8B7> <20><><EFBFBD>
{
STATE_BLOW::emBLOW_INDEX blowList[] =
{
STATE_BLOW::BLOW_135,
};
int nCount = sizeof(blowList) / sizeof(STATE_BLOW::emBLOW_INDEX);
AddStateEffectInfo(blowList, nCount, hSkill);
}
void CDnPrefixSkill::AddStateEffectInfo_Prefix_022(DnSkillHandle hSkill) //<2F><><EFBFBD><EFBFBD> <20><><EFBFBD>
{
STATE_BLOW::emBLOW_INDEX blowList[] =
{
STATE_BLOW::BLOW_124,
};
int nCount = sizeof(blowList) / sizeof(STATE_BLOW::emBLOW_INDEX);
AddStateEffectInfo(blowList, nCount, hSkill);
}
void CDnPrefixSkill::AddStateEffectInfo_Prefix_023(DnSkillHandle hSkill) //<2F>ٶ<EFBFBD><D9B6><EFBFBD> <20><><EFBFBD>
{
STATE_BLOW::emBLOW_INDEX blowList[] =
{
STATE_BLOW::BLOW_126,
};
int nCount = sizeof(blowList) / sizeof(STATE_BLOW::emBLOW_INDEX);
AddStateEffectInfo(blowList, nCount, hSkill);
}
void CDnPrefixSkill::AddStateEffectInfo_Prefix_024(DnSkillHandle hSkill) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
{
STATE_BLOW::emBLOW_INDEX blowList[] =
{
STATE_BLOW::BLOW_036,
STATE_BLOW::BLOW_037,
STATE_BLOW::BLOW_038,
STATE_BLOW::BLOW_039,
};
int nCount = sizeof(blowList) / sizeof(STATE_BLOW::emBLOW_INDEX);
AddStateEffectInfo(blowList, nCount, hSkill);
}
void CDnPrefixSkill::AddStateEffectInfo_Prefix_025(DnSkillHandle hSkill) //<2F>ǰ<EFBFBD><C7B0><EFBFBD>
{
STATE_BLOW::emBLOW_INDEX blowList[] =
{
STATE_BLOW::BLOW_124,
};
int nCount = sizeof(blowList) / sizeof(STATE_BLOW::emBLOW_INDEX);
AddStateEffectInfo(blowList, nCount, hSkill);
}
void CDnPrefixSkill::AddStateEffectInfo_Prefix_026(DnSkillHandle hSkill) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
STATE_BLOW::emBLOW_INDEX blowList[] =
{
STATE_BLOW::BLOW_111,
STATE_BLOW::BLOW_112,
STATE_BLOW::BLOW_113,
STATE_BLOW::BLOW_114,
};
int nCount = sizeof(blowList) / sizeof(STATE_BLOW::emBLOW_INDEX);
AddStateEffectInfo(blowList, nCount, hSkill);
}
void CDnPrefixSkill::AddStateEffectInfo_Prefix_027(DnSkillHandle hSkill) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
{
STATE_BLOW::emBLOW_INDEX blowList[] =
{
STATE_BLOW::BLOW_016,
};
int nCount = sizeof(blowList) / sizeof(STATE_BLOW::emBLOW_INDEX);
AddStateEffectInfo(blowList, nCount, hSkill);
}
void CDnPrefixSkill::AddStateEffectInfo_Prefix_028(DnSkillHandle hSkill) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
{
STATE_BLOW::emBLOW_INDEX blowList[] =
{
STATE_BLOW::BLOW_018,
};
int nCount = sizeof(blowList) / sizeof(STATE_BLOW::emBLOW_INDEX);
AddStateEffectInfo(blowList, nCount, hSkill);
}
void CDnPrefixSkill::AddStateEffectInfo_Prefix_029(DnSkillHandle hSkill) //<2F>߰<EFBFBD><DFB0><EFBFBD>
{
// STATE_BLOW::emBLOW_INDEX blowList[] =
// {
// };
//
// int nCount = sizeof(blowList) / sizeof(STATE_BLOW::emBLOW_INDEX);
//
// AddStateEffectInfo(blowList, nCount, hSkill);
}
void CDnPrefixSkill::AddStateEffectInfo_Prefix_030(DnSkillHandle hSkill) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
STATE_BLOW::emBLOW_INDEX blowList[] =
{
STATE_BLOW::BLOW_076,
};
int nCount = sizeof(blowList) / sizeof(STATE_BLOW::emBLOW_INDEX);
AddStateEffectInfo(blowList, nCount, hSkill);
}
void CDnPrefixSkill::AddStateEffectInfo_Prefix_031(DnSkillHandle hSkill) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
STATE_BLOW::emBLOW_INDEX blowList[] =
{
STATE_BLOW::BLOW_156,
};
int nCount = sizeof(blowList) / sizeof(STATE_BLOW::emBLOW_INDEX);
AddStateEffectInfo(blowList, nCount, hSkill);
}
void CDnPrefixSkill::AddStateEffectInfo_Prefix_032(DnSkillHandle hSkill) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
// STATE_BLOW::emBLOW_INDEX blowList[] =
// {
// };
//
// int nCount = sizeof(blowList) / sizeof(STATE_BLOW::emBLOW_INDEX);
//
// AddStateEffectInfo(blowList, nCount, hSkill);
}
void CDnPrefixSkill::AddStateEffectInfo_Prefix_033(DnSkillHandle hSkill) //<2F>ұ<EFBFBD><D2B1><EFBFBD>
{
// STATE_BLOW::emBLOW_INDEX blowList[] =
// {
// };
//
// int nCount = sizeof(blowList) / sizeof(STATE_BLOW::emBLOW_INDEX);
//
// AddStateEffectInfo(blowList, nCount, hSkill);
}
void CDnPrefixSkill::AddStateEffectInfo_Prefix_034(DnSkillHandle hSkill) //<2F><><EFBFBD><EFBFBD> <20><><EFBFBD>
{
STATE_BLOW::emBLOW_INDEX blowList[] =
{
STATE_BLOW::BLOW_036,
};
int nCount = sizeof(blowList) / sizeof(STATE_BLOW::emBLOW_INDEX);
AddStateEffectInfo(blowList, nCount, hSkill);
}
void CDnPrefixSkill::AddStateEffectInfo_Prefix_035(DnSkillHandle hSkill) //<2F><><EFBFBD><EFBFBD> <20><><EFBFBD>
{
STATE_BLOW::emBLOW_INDEX blowList[] =
{
STATE_BLOW::BLOW_037,
};
int nCount = sizeof(blowList) / sizeof(STATE_BLOW::emBLOW_INDEX);
AddStateEffectInfo(blowList, nCount, hSkill);
}
void CDnPrefixSkill::AddStateEffectInfo_Prefix_036(DnSkillHandle hSkill) //<2F><><EFBFBD><EFBFBD> <20><><EFBFBD>
{
STATE_BLOW::emBLOW_INDEX blowList[] =
{
STATE_BLOW::BLOW_038,
};
int nCount = sizeof(blowList) / sizeof(STATE_BLOW::emBLOW_INDEX);
AddStateEffectInfo(blowList, nCount, hSkill);
}
void CDnPrefixSkill::AddStateEffectInfo_Prefix_037(DnSkillHandle hSkill) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
{
STATE_BLOW::emBLOW_INDEX blowList[] =
{
STATE_BLOW::BLOW_039,
};
int nCount = sizeof(blowList) / sizeof(STATE_BLOW::emBLOW_INDEX);
AddStateEffectInfo(blowList, nCount, hSkill);
}
#endif // PRE_ADD_PREFIX_SYSTE_RENEW
void CDnSkill::OnAnotherGlobalSkillBeginCoolTime( DnSkillHandle hSkill )
{
if( hSkill )
{
m_fAnotherGlobalSkillCoolTime = hSkill->GetDelayTime();
m_nAnotherGlobakSkillID = hSkill->GetClassID();
}
}