DragonNest/Server/DNVillageServer/DNUserSkill.cpp

1564 lines
48 KiB
C++
Raw Normal View History

2024-12-19 09:48:26 +08:00
#include "StdAfx.h"
#include "DNUserSkill.h"
#include "DNUserSession.h"
#include "DNGameDataManager.h"
#include "DNLogConnection.h"
#include "DNMissionSystem.h"
#include "DNDBConnectionManager.h"
#include "DNDBConnection.h"
extern TVillageConfig g_Config;
CDNUserSkill::CDNUserSkill(CDNUserSession *pUserObj)
: m_pUserSession(pUserObj)
{
m_pSkillData = m_pUserSession->GetSkillData( true );
for(DWORD i=0; i<DualSkill::Type::MAX; i++ )
m_SkillList[i].clear();
}
CDNUserSkill::~CDNUserSkill(void)
{
for(DWORD i=0; i<DualSkill::Type::MAX; i++ )
m_SkillList[i].clear();
}
void CDNUserSkill::LoadUserData()
{
int nUseSkillPoint = 0;
int nOpendSkillPageCount = m_pUserSession->GetItem()->GetSkillPageCount();
for(int nSkillCount =0 ; nSkillCount < nOpendSkillPageCount; nSkillCount++)
{
for (int i = 0; i < SKILLMAX; i++){
if (m_pSkillData[nSkillCount].SkillList[i].nSkillID <= 0) continue;
// <20><><EFBFBD><EFBFBD><EFBFBD>Ϳ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų ID<49><44> DB <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE>ִٸ<D6B4> <20>о<EFBFBD><D0BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
const TSkillData* pSkillData = g_pDataManager->GetSkillData( m_pSkillData[nSkillCount].SkillList[i].nSkillID );
if( NULL == pSkillData )
continue;
m_SkillList[nSkillCount][m_pSkillData[nSkillCount].SkillList[i].nSkillID] = m_pSkillData[nSkillCount].SkillList[i];
CDnSkillTreeSystem::S_POSSESSED_SKILL_INFO SkillInfo;
SkillInfo.iSkillID = m_pSkillData[nSkillCount].SkillList[i].nSkillID;
SkillInfo.iSkillLevel = m_pSkillData[nSkillCount].SkillList[i].cSkillLevel;
SkillInfo.bCurrentLock = m_pSkillData[nSkillCount].SkillList[i].bLock;
m_vlPossessedSkill[nSkillCount].push_back( SkillInfo );
if (m_pSkillData[nSkillCount].SkillList[i].nSkillID > 0){
for (int j = 0; j < m_pSkillData[nSkillCount].SkillList[i].cSkillLevel; j++){
nUseSkillPoint += g_pDataManager->GetNeedSkillPoint(m_pSkillData[nSkillCount].SkillList[i].nSkillID, j + 1);
}
}
}
// <20><><EFBFBD>彺ų üũ
const TItem *pItem = m_pUserSession->GetItem()->GetGlyph( GLYPH_SPECIALSKILL );
if( pItem && pItem->nItemID ) {
if( pItem->nItemID > 0 ) {
TItemData *pItemData = g_pDataManager->GetItemData( pItem->nItemID );
if( pItemData && (pItemData->nSkillID > 0) ) {
TSkillData *pSkillData = g_pDataManager->GetSkillData( pItemData->nSkillID );
TSkill Skill;
Skill.nSkillID = pSkillData->nSkillID;
Skill.cSkillLevel = 1;
Skill.nCoolTime = 0;
Skill.bLock = false;
m_SkillList[nSkillCount][pItemData->nSkillID] = Skill;
CDnSkillTreeSystem::S_POSSESSED_SKILL_INFO SkillInfo;
SkillInfo.iSkillID = pItemData->nSkillID;
SkillInfo.iSkillLevel = Skill.cSkillLevel;
SkillInfo.bCurrentLock = Skill.bLock;
m_vlPossessedSkill[nSkillCount].push_back( SkillInfo );
}
}
}
}
#ifdef PRE_ADD_SP_REVISION
#ifdef _FINAL_BUILD
// <20><><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>. Ʋ<><C6B2><EFBFBD><EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> Ŭ<>󿡰<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20>Ⱥ<EFBFBD><C8BA><EFBFBD><EFBFBD><EFBFBD>.
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..
CheckAndRevisionSkillPoint( false );
#endif // #ifdef _FINAL_BUILD
#endif // #ifdef PRE_ADD_SP_REVISION
}
void CDNUserSkill::SaveUserData(TUserData *pUserData)
{
if (m_SkillList[GetCurrentSkillPage()].empty()) return;
memset(&(pUserData->Skill[DualSkill::Type::Primary].SkillList), 0, sizeof(TSkill) * SKILLMAX);
TMapSkillList::iterator iter;
int nCount = 0;
for (iter = m_SkillList[GetCurrentSkillPage()].begin(); iter != m_SkillList[GetCurrentSkillPage()].end(); ++iter){
pUserData->Skill[DualSkill::Type::Primary].SkillList[nCount] = iter->second;
pUserData->Skill[DualSkill::Type::Primary].SkillList[nCount].nCoolTime = 0;
nCount++;
}
}
// <20><>ų Ʈ<><C6AE><EFBFBD><EFBFBD> <20>ٲ<EFBFBD><D9B2>鼭 addskill ġƮ<C4A1><C6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̴<EFBFBD> <20>Լ<EFBFBD><D4BC>Դϴ<D4B4>..
void CDNUserSkill::AddSkill( int nSkillID, int iLevel/* = 0*/ )
{
// 20080901 <20>α׼<CEB1><D7BC><EFBFBD> <20><>ų<EFBFBD>߰<EFBFBD><><C8B9>]
if ( nSkillID <= 0 )
{
m_pUserSession->SendAddSkill(nSkillID, ERROR_SKILL_ACQUIREFAIL);
return;
}
// ȹ<><C8B9><EFBFBD><EFBFBD> <20><>ų <20><> ȹ<><C8B9><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.
if( FindSkill( nSkillID ) )
{
m_pUserSession->SendAddSkill(nSkillID, ERROR_SKILL_ACQUIREFAIL);
return;
}
TSkill Skill;
memset(&Skill, 0, sizeof(TSkill));
Skill.nSkillID = nSkillID;
Skill.cSkillLevel = iLevel;
//Skill.bLock = true; // <20><><EFBFBD>ʿ<EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. (<28><><EFBFBD><EFBFBD> 0 <20><><EFBFBD><EFBFBD>)
Skill.bLock = false;
m_SkillList[GetCurrentSkillPage()][nSkillID] = Skill;
CDnSkillTreeSystem::S_POSSESSED_SKILL_INFO SkillInfo;
SkillInfo.iSkillID = nSkillID;
SkillInfo.iSkillLevel = Skill.cSkillLevel;
SkillInfo.bCurrentLock = Skill.bLock;
m_vlPossessedSkill[GetCurrentSkillPage()].push_back( SkillInfo );
if( m_pUserSession )
{
m_pUserSession->GetDBConnection()->QueryAddSkill(m_pUserSession, nSkillID, Skill.cSkillLevel, 0, 0, DBDNWorldDef::SkillChangeCode::GainByAdmin);
m_pUserSession->SendAddSkill(nSkillID, ERROR_NONE);
m_pUserSession->GetEventSystem()->OnEvent( EventSystem::OnSkillAdd, 1, EventSystem::SkillID, nSkillID );
}
}
void CDNUserSkill::DelSkill(int nSkillID)
{
if (nSkillID <= 0){
m_pUserSession->SendDelSkill(nSkillID, ERROR_SKILL_DELETEFAIL);
return;
}
if (m_SkillList[GetCurrentSkillPage()].empty()){
m_pUserSession->SendDelSkill(nSkillID, ERROR_SKILL_ISNOT_YOURS);
return;
}
TMapSkillList::iterator iter = m_SkillList[GetCurrentSkillPage()].find(nSkillID);
if (iter != m_SkillList[GetCurrentSkillPage()].end()){
m_SkillList[GetCurrentSkillPage()].erase(iter);
vector<CDnSkillTreeSystem::S_POSSESSED_SKILL_INFO>::iterator iter = m_vlPossessedSkill[GetCurrentSkillPage()].begin();
for( iter; m_vlPossessedSkill[GetCurrentSkillPage()].end() != iter; ++iter )
{
if( iter->iSkillID == nSkillID )
{
m_vlPossessedSkill[GetCurrentSkillPage()].erase( iter );
break;
}
}
m_pUserSession->SendDelSkill(nSkillID, ERROR_NONE);
return;
}
if( m_pUserSession )
{
m_pUserSession->GetDBConnection()->QueryDelSkill(m_pUserSession, nSkillID, DBDNWorldDef::SkillChangeCode::DelByAdmin, false, GetCurrentSkillPage() );
m_pUserSession->SendDelSkill(nSkillID, ERROR_SKILL_ISNOT_YOURS);
}
}
#if defined(PRE_ADD_SKILL_LEVELUP_RESERVATION)
int CDNUserSkill::SkillLevelUp( int nSkillID, int nUsePoint )
#else
void CDNUserSkill::SkillLevelUp( int nSkillID, int nUsePoint )
#endif
{
#ifdef PRE_ADD_SP_REVISION
// #29463 <20>̽<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><>ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>ٸ<EFBFBD> <20><><EFBFBD><20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
#ifdef _FINAL_BUILD
CheckAndRevisionSkillPoint();
#endif // #ifdef _FINAL_BUILD
#endif // #ifdef PRE_ADD_SP_REVISION
bool bReqSuccess = false;
int nError = ERROR_NONE;
bool bFinded = false;
if (nSkillID <= 0)
#if defined(PRE_ADD_SKILL_LEVELUP_RESERVATION)
return ERROR_GENERIC_UNKNOWNERROR;;
#else
return;
#endif//#if defined(PRE_ADD_SKILL_LEVELUP_RESERVATION)
if (m_SkillList[GetCurrentSkillPage()].empty())
#if defined(PRE_ADD_SKILL_LEVELUP_RESERVATION)
return ERROR_GENERIC_UNKNOWNERROR;;
#else
return;
#endif//#if defined(PRE_ADD_SKILL_LEVELUP_RESERVATION)
TMapSkillList::iterator iter = m_SkillList[GetCurrentSkillPage()].find(nSkillID);
if (iter != m_SkillList[GetCurrentSkillPage()].end())
bFinded = true;
else
{
_ASSERT( "<EFBFBD><EFBFBD>ų <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> ã<><C3A3> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>." );
#if defined(PRE_ADD_SKILL_LEVELUP_RESERVATION)
return ERROR_GENERIC_UNKNOWNERROR;;
#else
return;
#endif //#if defined(PRE_ADD_SKILL_LEVELUP_RESERVATION)
}
TSkill& SkillInfo = iter->second;
DNTableFileFormat* pSkillLevelTable = GetDNTable( CDnTableDB::TSKILLLEVEL );
vector<int> vlSkillLevelList;
if( pSkillLevelTable->GetItemIDListFromField( "_SkillIndex", nSkillID, vlSkillLevelList ) == 0 )
{
_ASSERT( "<EFBFBD><EFBFBD>ų <20><><EFBFBD>̺<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>" );
#if defined(PRE_ADD_SKILL_LEVELUP_RESERVATION)
return ERROR_GENERIC_UNKNOWNERROR;;
#else
return;
#endif//#if defined(PRE_ADD_SKILL_LEVELUP_RESERVATION)
}
#if defined(PRE_FIX_NEXTSKILLINFO)
int nLevelUpCount = 1; // <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1<><31> <20>ø<EFBFBD><C3B8><EFBFBD> <20>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD>.
SKILL_LEVEL_TABLE_IDS::iterator findIter;
SKILL_LEVEL_INFO* pTableInfo = g_pDataManager->GetSkillLevelTableIDList(nSkillID, 0);
int nNeedSkillPoint = 0;
bool bValidPacket = false;
if( NULL != pTableInfo )
{
int nSkillLevel = SkillInfo.cSkillLevel + nLevelUpCount;
findIter = pTableInfo->_SkillLevelTableIDs.find(nSkillLevel);
int SkillLevelTableID = -1;
if (findIter != pTableInfo->_SkillLevelTableIDs.end())
SkillLevelTableID = findIter->second;
if( -1 != SkillLevelTableID )
{
nNeedSkillPoint = pSkillLevelTable->GetFieldFromLablePtr( SkillLevelTableID, "_NeedSkillPoint" )->GetInteger();
#if defined(PRE_ADD_SKILL_LEVELUP_RESERVATION)
if( nNeedSkillPoint > 0 )
#else
if( nNeedSkillPoint == nUsePoint )
#endif
bValidPacket = true;
}
}
if( false == bValidPacket )
{
// <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٸ<EFBFBD><D9B8>Ƿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
nError = ERROR_SKILL_LEVELUPFAIL_INVALID_SKILLPOINT;
bFinded = false;
}
#else
int iSkillLevelTableID = -1;
for( int i = 0; i < (int)vlSkillLevelList.size(); ++i )
{
int iNowLevel = pSkillLevelTable->GetFieldFromLablePtr( vlSkillLevelList.at(i), "_SkillLevel" )->GetInteger();
if( iNowLevel == SkillInfo.cSkillLevel )
{
iSkillLevelTableID = vlSkillLevelList.at( i );
break;
}
}
if( -1 == iSkillLevelTableID )
{
_ASSERT( "<EFBFBD><EFBFBD>ų <20><><EFBFBD>̺<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>" );
return;
}
int nNeedSkillPoint = 0;
int nLevelUpCount = 0;
while( nUsePoint != nNeedSkillPoint )
{
++nLevelUpCount;
nNeedSkillPoint += pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID+nLevelUpCount, "_NeedSkillPoint" )->GetInteger();
if( nUsePoint < nNeedSkillPoint )
{
nError = ERROR_SKILL_LEVELUPFAIL_INVALID_SKILLPOINT;
bFinded = false;
break;
}
}
#endif // PRE_FIX_NEXTSKILLINFO
// <20>ش<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD> üũ
// <20><>ų <20><> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><20>ʱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˾Ƴ<CBBE><C6B3><EFBFBD>.
//bool bFinded = FindSkill( nSkillID );
if( bFinded )
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>ϰڴٰ<DAB4> <20><><EFBFBD>ƿ<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
int iAvailSPByJob = GetAvailSkillPointByJob( nSkillID );
#if defined(PRE_ADD_SKILL_LEVELUP_RESERVATION)
if( nNeedSkillPoint <= iAvailSPByJob )
#else
if( nNeedSkillPoint <= iAvailSPByJob && nUsePoint == nNeedSkillPoint )
#endif
{
int iLevelFrom = GetSkillLevel( nSkillID );
// <20><>ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> üũ
TSkillData *pSkillData = g_pDataManager->GetSkillData(nSkillID);
if (!pSkillData){
#if defined(PRE_ADD_SKILL_LEVELUP_RESERVATION)
return ERROR_SKILL_LEVELUPFAIL_ISNOT_YOURS;;
#else
m_pUserSession->SendSkillLevelUp( nSkillID, 0, ERROR_SKILL_LEVELUPFAIL_ISNOT_YOURS );
return;
#endif//#if defined(PRE_ADD_SKILL_LEVELUP_RESERVATION)
}
int iNewLevel = iLevelFrom + nLevelUpCount;
if( iNewLevel <= pSkillData->nMaxLevel )
{
TSkillLevelData *pSkillLevel = g_pDataManager->GetSkillLevelData(nSkillID, iNewLevel);
if (!pSkillLevel){
#if defined(PRE_ADD_SKILL_LEVELUP_RESERVATION)
return ERROR_SKILL_LEVELUPFAIL_ISNOT_YOURS;
#else
m_pUserSession->SendSkillLevelUp( nSkillID, 0, ERROR_SKILL_LEVELUPFAIL_ISNOT_YOURS );
return;
#endif
}
if( pSkillLevel->cLevelLimit <= (int)m_pUserSession->GetLevel() )
{
if( 0 < m_pUserSession->GetSkillPoint() )
{
#if defined(PRE_ADD_SKILL_LEVELUP_RESERVATION)
SetSkillLevel( nSkillID, iNewLevel, DBDNWorldDef::SkillChangeCode::Use, false ); // <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD>Ʈ <20>ȿ<EFBFBD><C8BF><EFBFBD> <20><><EFBFBD><EFBFBD>
#else
SetSkillLevel( nSkillID, iNewLevel, DBDNWorldDef::SkillChangeCode::Use ); // <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD>Ʈ <20>ȿ<EFBFBD><C8BF><EFBFBD> <20><><EFBFBD><EFBFBD>
#endif //#if defined(PRE_ADD_SKILL_LEVELUP_RESERVATION)
bReqSuccess = true;
}
else
{
// <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. ERROR_SKILL_LEVELUPFAIL_INSUFFICIENCY_SKILLPOINT Ŭ<><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
nError = ERROR_SKILL_LEVELUPFAIL_INSUFFICIENCY_SKILLPOINT;
}
}
else
{
//TODO: ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>۽<EFBFBD><DBBD>ϴ<EFBFBD>..
nError = ERROR_SKILL_LEVELUPFAIL_INSUFFICIENCY_CHARACTERLEVEL;
}
}
else
{
//TODO: <20>ִ<EFBFBD><D6B4><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD> <20>̻<EFBFBD><CCBB><EFBFBD> <20>ø<EFBFBD><C3B8><EFBFBD><EFBFBD><EFBFBD> <20><>..
nError = ERROR_SKILL_LEVELUPFAIL_ALREADY_MAX;
}
}
else
{
// TODO: <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD>ų<EFBFBD> <20><><EFBFBD>̺<EFBFBD><CCBA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ϳ<EFBFBD> <20>ٸ<EFBFBD>.
nError = ERROR_SKILL_LEVELUPFAIL_INVALID_SKILLPOINT;
}
}
else
{
// <20>ش<EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. ERROR_SKILL_LEVELUPFAIL_ISNOT_YOURS Ŭ<><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
nError = ERROR_SKILL_LEVELUPFAIL_ISNOT_YOURS;
}
#if defined(PRE_ADD_SKILL_LEVELUP_RESERVATION)
return nError;
#else
if (!bReqSuccess)
m_pUserSession->SendSkillLevelUp( nSkillID, 0, nError );
#endif
}
bool CDNUserSkill::FindSkill(int nSkillID)
{
if (nSkillID <= 0) return false;
if (m_SkillList[GetCurrentSkillPage()].empty()) return false;
TMapSkillList::iterator iter = m_SkillList[GetCurrentSkillPage()].find(nSkillID);
if (iter != m_SkillList[GetCurrentSkillPage()].end()){
return true;
}
return false;
}
int CDNUserSkill::GetSkillLevel( int nSkillID )
{
TMapSkillList::iterator iter = m_SkillList[GetCurrentSkillPage()].find( nSkillID );
if( iter != m_SkillList[GetCurrentSkillPage()].end() ) {
return iter->second.cSkillLevel;
}
return -1;
}
void CDNUserSkill::SetSkillLevel( int nSkillID, int nLevel, int nLogCode, bool bSendSkillLevelUp /*= true*/ )
{
TMapSkillList::iterator iter = m_SkillList[GetCurrentSkillPage()].find( nSkillID );
if( iter != m_SkillList[GetCurrentSkillPage()].end() ) {
int nGap = nLevel - iter->second.cSkillLevel;
iter->second.cSkillLevel = nLevel;
//////////////////////////////////////////////////////////////////////////
// <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѳ<EFBFBD><D1B2><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD>.
// <20><><EFBFBD><EFBFBD> 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ø<EFBFBD><C3B8><EFBFBD> <20>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
int nNeedSkillPoint = 0;
for( int i = 0; i < nGap; ++i )
nNeedSkillPoint += g_pDataManager->GetNeedSkillPoint(nSkillID, nLevel-i);
//////////////////////////////////////////////////////////////////////////
if (nNeedSkillPoint > 0) m_pUserSession->ChangeSkillPoint(-nNeedSkillPoint, nSkillID, false, 0, GetCurrentSkillPage() );
m_pUserSession->GetDBConnection()->QueryModSkillLevel( m_pUserSession, nSkillID, nLevel, iter->second.nCoolTime, -nNeedSkillPoint, nLogCode); // db<64><62><EFBFBD><EFBFBD>: <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
if( bSendSkillLevelUp )
m_pUserSession->SendSkillLevelUp( nSkillID, nLevel, ERROR_NONE );
vector<CDnSkillTreeSystem::S_POSSESSED_SKILL_INFO>::iterator iter = m_vlPossessedSkill[GetCurrentSkillPage()].begin();
for( iter; m_vlPossessedSkill[GetCurrentSkillPage()].end() != iter; ++iter )
{
if( iter->iSkillID == nSkillID )
{
iter->iSkillLevel = nLevel;
break;
}
}
m_pUserSession->GetEventSystem()->OnEvent( EventSystem::OnSkillLevelUp, 2, EventSystem::SkillID, nSkillID, EventSystem::SkillLevel, nLevel );
}
}
// <20><>ų <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD> 0<><30> <20><><EFBFBD>·<EFBFBD> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20>߰<EFBFBD>.
void CDNUserSkill::UnLockSkill( int nSkillID )
{
TSkill Skill;
memset(&Skill, 0, sizeof(TSkill));
Skill.nSkillID = nSkillID;
Skill.cSkillLevel = 0;
Skill.bLock = false; // <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;;
m_SkillList[GetCurrentSkillPage()][nSkillID] = Skill;
// <20><><EFBFBD><EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ƴ<EFBFBD><C6B3><EFBFBD> <20><><EFBFBD>Ϳ<EFBFBD> <20>߰<EFBFBD>.
CDnSkillTreeSystem::S_POSSESSED_SKILL_INFO SkillInfo;
SkillInfo.iSkillID = nSkillID;
SkillInfo.iSkillLevel = 0;
SkillInfo.bCurrentLock = false;
m_vlPossessedSkill[GetCurrentSkillPage()].push_back( SkillInfo );
m_pUserSession->SendUnlockSkill( nSkillID, ERROR_NONE );
m_pUserSession->GetDBConnection()->QueryAddSkill(m_pUserSession, nSkillID, SkillInfo.iSkillLevel, 0, DBDNWorldDef::SkillChangeCode::GainByBook, 0);
// TODO: <20><>ų ȹ<><C8B9> <20><><EFBFBD><EFBFBD> <20>̼<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3>.
//m_pUserSession->GetEventSystem()->OnEvent( EventSystem::OnSkillAdd, 1, EventSystem::SkillID, nSkillID );
return;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų Ʈ<><C6AE><EFBFBD>̳<EFBFBD> NPC <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD> ȹ<><C8B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3>.
#if defined(PRE_ADD_SKILL_LEVELUP_RESERVATION)
int CDNUserSkill::UnLockSkillByMoney( int nSkillID )
#else
void CDNUserSkill::UnLockSkillByMoney( int nSkillID )
#endif
{
#ifdef PRE_ADD_SP_REVISION
// #29463 <20>̽<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><>ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>ٸ<EFBFBD> <20><><EFBFBD><20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
#ifdef _FINAL_BUILD
CheckAndRevisionSkillPoint();
#endif // #ifdef _FINAL_BUILD
#endif // #ifdef PRE_ADD_SP_REVISION
if (nSkillID <= 0){
#if defined(PRE_ADD_SKILL_LEVELUP_RESERVATION)
return ERROR_SKILL_ACQUIREFAIL;
#else
m_pUserSession->SendAcquireSkill( nSkillID, ERROR_SKILL_ACQUIREFAIL );
return;
#endif //#if defined(PRE_ADD_SKILL_LEVELUP_RESERVATION)
}
// <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǵ<EFBFBD><C7B4><EFBFBD> Ȯ<><C8AE>.
TSkillData* pSkillData = g_pDataManager->GetSkillData( nSkillID );
if (!pSkillData){
#if defined(PRE_ADD_SKILL_LEVELUP_RESERVATION)
return ERROR_SKILL_ACQUIREFAIL;
#else
m_pUserSession->SendAcquireSkill( nSkillID, ERROR_SKILL_ACQUIREFAIL );
return;
#endif
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.
if( IsExclusiveSkill( nSkillID, pSkillData->nExclusiveID ) )
{
#if defined(PRE_ADD_SKILL_LEVELUP_RESERVATION)
return ERROR_SKILL_ACQUIRE_FAIL_EXCLUSIVE;
#else
m_pUserSession->SendAcquireSkill( nSkillID, ERROR_SKILL_ACQUIRE_FAIL_EXCLUSIVE );
return;
#endif
}
// #36858 <20>۷ι<DBB7> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִٸ<D6B4> <20>ش<EFBFBD> <20>׷<EFBFBD><D7B7>߿<EFBFBD> <20>ϳ<EFBFBD><CFB3><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>θ<EFBFBD> <20><>ų <20><><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD>.
bool bAlreadyGlobalSkillAcquired = false;
if( HasSameGlobalIDSkill( pSkillData->nGlobalSkillGroup ) )
bAlreadyGlobalSkillAcquired = true;
INT64 iNowMoney = m_pUserSession->GetCoin();
if( iNowMoney < pSkillData->nUnlockPrice )
{
//m_pUserSession->SendUnlockSkill( nSkillID, ERROR_SKILL_UNLOCK_NOT_ENOUGH_MONEY );
// Ŭ<>󿡼<EFBFBD> <20>޽<EFBFBD><DEBD><EFBFBD> <20>ڵ鸵 <20><><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ȹ<><EFBFBD><E6BFA1> ó<><C3B3><EFBFBD>ϹǷ<CFB9>..
#if defined(PRE_ADD_SKILL_LEVELUP_RESERVATION)
return ERROR_SKILL_UNLOCK_NOT_ENOUGH_MONEY;
#else
m_pUserSession->SendAcquireSkill( nSkillID, ERROR_SKILL_UNLOCK_NOT_ENOUGH_MONEY );
return;
#endif
}
bool bAlreadyPossess = this->FindSkill( nSkillID );
if( bAlreadyPossess )
{
#if defined(PRE_ADD_SKILL_LEVELUP_RESERVATION)
return ERROR_SKILL_UNLOCK_ALREADY_OPEN;
#else
m_pUserSession->SendAcquireSkill( nSkillID, ERROR_SKILL_UNLOCK_ALREADY_OPEN );
return;
#endif
}
// <20>׷<EFBFBD><D7B7><EFBFBD> ȹ<><C8B9> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˻<EFBFBD><CBBB>ؼ<EFBFBD> ȹ<><C8B9><EFBFBD><EFBFBD>.
int nRetCode = ERROR_NONE;
CDnSkillTreeSystem* pSkillTreeSystem = g_pDataManager->GetSkillTreeSystem();
#ifdef PRE_ADD_ONLY_SKILLBOOK
if( pSkillTreeSystem )
{
bool bExistSkill = false;
bool bNeedSkillBook = pSkillTreeSystem->IsNeedSkillBook( nSkillID, bExistSkill );
if( bExistSkill && bNeedSkillBook )
{
return ERROR_SKILL_UNLOCK_FAIL;
}
}
#endif // PRE_ADD_ONLY_SKILLBOOK
CDnSkillTreeSystem::S_OUTPUT Output;
CDnSkillTreeSystem::S_TRY_ACQUIRE TryAcquire( GetPossessedSkillInfo() );
TryAcquire.iCurrentCharLevel = m_pUserSession->GetLevel();
TryAcquire.iTryAcquireSkillID = nSkillID;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><> <20><> <20>ִ<EFBFBD> SP <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
TryAcquire.iHasSkillPoint = GetAvailSkillPointByJob( nSkillID );
pSkillTreeSystem->TryAcquireSkill( TryAcquire, &Output );
bool bIgnoreParentSkillCondition = ( (CDnSkillTreeSystem::R_DONT_HAVE_PARENT_SKILL == Output.eResult) ||
(CDnSkillTreeSystem::R_LOCKED_PARENTSKILL == Output.eResult) ||
(CDnSkillTreeSystem::R_NOT_ENOUGH_PARENT_SKILL_LEVEL == Output.eResult) ) &&
true == bAlreadyGlobalSkillAcquired;
if( CDnSkillTreeSystem::R_SUCCESS == Output.eResult || true == bIgnoreParentSkillCondition )
{
// <20><>ų <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><>ų <20>߰<EFBFBD>.
TSkill Skill;
memset(&Skill, 0, sizeof(TSkill));
Skill.nSkillID = nSkillID;
Skill.cSkillLevel = 0;
Skill.bLock = false; // <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;;
m_SkillList[GetCurrentSkillPage()][nSkillID] = Skill;
// <20><><EFBFBD><EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ƴ<EFBFBD><C6B3><EFBFBD> <20><><EFBFBD>Ϳ<EFBFBD> <20>߰<EFBFBD>.
CDnSkillTreeSystem::S_POSSESSED_SKILL_INFO SkillInfo;
SkillInfo.iSkillID = nSkillID;
SkillInfo.iSkillLevel = 0;
SkillInfo.bCurrentLock = false;
m_vlPossessedSkill[GetCurrentSkillPage()].push_back( SkillInfo );
// <20><> <20><><EFBFBD><EFBFBD>
m_pUserSession->DelCoin( pSkillData->nUnlockPrice, DBDNWorldDef::CoinChangeCode::DoNotDBSave, 0 );
// <20><><EFBFBD><EFBFBD> <20><>Ŷ Ŭ<><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
#if !defined(PRE_ADD_SKILL_LEVELUP_RESERVATION)
m_pUserSession->SendUnlockSkill( nSkillID, ERROR_NONE );
#endif // #if !defined(PRE_ADD_SKILL_LEVELUP_RESERVATION)
m_pUserSession->GetDBConnection()->QueryAddSkill(m_pUserSession, nSkillID, SkillInfo.iSkillLevel, 0, DBDNWorldDef::SkillChangeCode::GainByBuy, pSkillData->nUnlockPrice);
// TODO: <20><>ų ȹ<><C8B9> <20><><EFBFBD><EFBFBD> <20>̼<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3>.
//m_pUserSession->GetEventSystem()->OnEvent( EventSystem::OnSkillAdd, 1, EventSystem::SkillID, nSkillID );
SetSkillLevel(nSkillID, 1, DBDNWorldDef::SkillChangeCode::Use, false); // <20>Լ<EFBFBD><D4BC>ȿ<EFBFBD><C8BF><EFBFBD> <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>
// ȹ<><C8B9> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>뺸.CDnSkillTreeSystem::S_OUTPUT Output;CDnSkillTreeSystem::S_OUTPUT Output;
#if defined(PRE_ADD_SKILL_LEVELUP_RESERVATION)
return ERROR_NONE;
#else
m_pUserSession->SendAcquireSkill( nSkillID, ERROR_NONE );
#endif
}
else
{
switch( Output.eResult )
{
// ij<><C4B3><EFBFBD><EFBFBD> <20><EFBFBD><E4B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ڶ<EFBFBD>.
case CDnSkillTreeSystem::R_NOT_ENOUGH_CHAR_LEVEL:
nRetCode = ERROR_SKILL_ACQUIRE_FAIL_NOT_ENOUGH_CHAR_LEVEL;
break;
// <20><><EFBFBD><EFBFBD>(<28>θ<EFBFBD>) <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD>.
case CDnSkillTreeSystem::R_DONT_HAVE_PARENT_SKILL:
nRetCode = ERROR_SKILL_ACQUIRE_FAIL_DONT_HAVE_PARENT_SKILL;
break;
// <20>θ<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
case CDnSkillTreeSystem::R_NOT_ENOUGH_PARENT_SKILL_LEVEL:
nRetCode = ERROR_SKILL_ACQUIRE_FAIL_NOT_ENOUGH_PARENT_SKILL_LEVEL;
break;
// <20><>ų <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD> <20><>ų<EFBFBD><C5B3> ȹ<><C8B9><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.
case CDnSkillTreeSystem::R_NOT_ENOUGH_SKILLPOINT_TO_ACQUIRE:
nRetCode = ERROR_SKILL_ACQUIRE_FAIL_NOT_ENOUGH_SKILLPOINT;
break;
default:
nRetCode = ERROR_SKILL_UNLOCK_FAIL;
break;
}
#if defined(PRE_ADD_SKILL_LEVELUP_RESERVATION)
return nRetCode;
#else
m_pUserSession->SendAcquireSkill( nSkillID, nRetCode );
#endif
}
#if defined(PRE_ADD_SKILL_LEVELUP_RESERVATION)
return ERROR_NONE;
#endif
}
bool CDNUserSkill::UseSkillBook( int nItemID )
{
#ifdef PRE_ADD_SP_REVISION
// #29463 <20>̽<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><>ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>ٸ<EFBFBD> <20><><EFBFBD><20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
#ifdef _FINAL_BUILD
CheckAndRevisionSkillPoint();
#endif // #ifdef _FINAL_BUILD
#endif // #ifdef PRE_ADD_SP_REVISION
CDnSkillTreeSystem* pSkillTreeSystem = g_pDataManager->GetSkillTreeSystem();
// <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD>, Ʈ<><C6AE><EFBFBD>̳ʿ<CCB3><CABF><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20>ÿ<EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD> <20><> ȹ<><C8B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϰ<EFBFBD> ó<><C3B3><EFBFBD>ǵ<EFBFBD><C7B5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
// SP <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϰų<CFB0> <20><><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD>ų<EFBFBD>, <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ų<EFBFBD>, ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> üũ<C3BC>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD><C7BE><EFBFBD> <20><><EFBFBD>
// <20><>ų <20><><EFBFBD><EFBFBD> <20><> 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
// <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 0<><30> <20><><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>غ<EFBFBD><D8BA><EFBFBD>.
int iSkillIDToUnLock = pSkillTreeSystem->FindSkillBySkillBook( nItemID );
if( 0 == iSkillIDToUnLock )
{
g_Log.Log( LogType::_ERROR, L"[UseSkillBook Fail!!!] Can't find SkillID that using %d SkillBook Item ID\n", iSkillIDToUnLock );
_ASSERT( !"<EFBFBD>ش<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> ã<><C3A3> <20><> <20><><EFBFBD><EFBFBD>." );
return false;
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.
const TSkillData* pSkillData = g_pDataManager->GetSkillData( iSkillIDToUnLock );
if( IsExclusiveSkill( iSkillIDToUnLock, pSkillData->nExclusiveID ) )
{
m_pUserSession->SendAcquireSkill( iSkillIDToUnLock, ERROR_SKILL_ACQUIRE_FAIL_EXCLUSIVE );
return false;
}
// #36858 <20>۷ι<DBB7> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִٸ<D6B4> <20>ش<EFBFBD> <20>׷<EFBFBD><D7B7>߿<EFBFBD> <20>ϳ<EFBFBD><CFB3><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>θ<EFBFBD> <20><>ų <20><><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD>.
bool bAlreadyGlobalSkillAcquired = false;
if( HasSameGlobalIDSkill( pSkillData->nGlobalSkillGroup ) )
bAlreadyGlobalSkillAcquired = true;
bool bSuccess = false;
bool bAlreadyPossess = this->FindSkill( iSkillIDToUnLock );
int nRetCode = ERROR_NONE;
int nResultSkillID = 0;
if( false == bAlreadyPossess )
{
CDnSkillTreeSystem::S_OUTPUT Output;
CDnSkillTreeSystem::S_TRY_UNLOCK CurrentSkillInfo;
CurrentSkillInfo.iTryUnlockSkillID = iSkillIDToUnLock;
CurrentSkillInfo.iCurrentCharLevel = m_pUserSession->GetLevel();
CurrentSkillInfo.iSkillBookItemID = nItemID;
// <20><>ų<EFBFBD><C5B3> <20><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E4B8AE> <20>ִ<EFBFBD><D6B4><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>Ƽ<EFBFBD> ó<><C3B3>.
TSkillData* pSkillData = g_pDataManager->GetSkillData( iSkillIDToUnLock );
if (pSkillData == NULL)
{
g_Log.Log( LogType::_ERROR, L"[UseSkillBook - GetSkillData Fail!!!] Can't find %d SkillID\n", iSkillIDToUnLock );
return false;
}
CurrentSkillInfo.iJobID = -1;
for( int i = 0; i < JOBMAX; ++i )
{
BYTE cJob = m_pUserSession->GetStatusData()->cJobArray[ i ];
if( 0 < cJob )
{
if( cJob == pSkillData->nNeedJobID )
{
CurrentSkillInfo.iJobID = pSkillData->nNeedJobID;
}
}
else
break;
}
if( -1 != CurrentSkillInfo.iJobID )
{
pSkillTreeSystem->TryUnLockSkill( CurrentSkillInfo, &Output );
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20>뺸.
if( CDnSkillTreeSystem::R_SUCCESS == Output.eResult )
{
// <20><><EFBFBD><EFBFBD>.
nResultSkillID = iSkillIDToUnLock;
// <20>׷<EFBFBD><D7B7><EFBFBD> ȹ<><C8B9> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˻<EFBFBD>.
CDnSkillTreeSystem* pSkillTreeSystem = g_pDataManager->GetSkillTreeSystem();
CDnSkillTreeSystem::S_TRY_ACQUIRE TryAcquire( GetPossessedSkillInfo() );
TryAcquire.iCurrentCharLevel = m_pUserSession->GetLevel();
TryAcquire.iTryAcquireSkillID = nResultSkillID;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><> <20><> <20>ִ<EFBFBD> SP <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
TryAcquire.iHasSkillPoint = GetAvailSkillPointByJob( nResultSkillID );
pSkillTreeSystem->TryAcquireSkill( TryAcquire, &Output );
#if defined(PRE_ADD_SKILL_LEVELUP_LIMIT_BY_SP)
std::vector<int> nNeedSPValues;
pSkillTreeSystem->GetNeedSPValuesByJob(nResultSkillID, nNeedSPValues);
std::vector<int> jobHistory;
GetJobHistory(m_pUserSession->GetStatusData()->cJobArray, jobHistory);
bool bAvailableSPByJob = IsAvailableSPByJob(jobHistory, nNeedSPValues);
if (bAvailableSPByJob == false)
Output.eResult = CDnSkillTreeSystem::R_NOT_ENOUGH_SKILLPOINT_TO_ACQUIRE;
#endif // PRE_ADD_SKILL_LEVELUP_LIMIT_BY_SP
bool bIgnoreParentSkillCondition = ( (CDnSkillTreeSystem::R_DONT_HAVE_PARENT_SKILL == Output.eResult) ||
(CDnSkillTreeSystem::R_LOCKED_PARENTSKILL == Output.eResult) ||
(CDnSkillTreeSystem::R_NOT_ENOUGH_PARENT_SKILL_LEVEL == Output.eResult) ) &&
true == bAlreadyGlobalSkillAcquired;
if( CDnSkillTreeSystem::R_SUCCESS == Output.eResult ||
true == bIgnoreParentSkillCondition )
{
// Ŭ<><C5AC><EFBFBD><EFBFBD> <20><20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><C3BC><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 0<><30><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>... <20><> <20><>ų <20>߰<EFBFBD>.
UnLockSkill( nResultSkillID ); // SendUnlockSkill() <20><><EFBFBD>ο<EFBFBD><CEBF><EFBFBD> ȣ<><C8A3><EFBFBD>Ǿ<EFBFBD> <20><>Ŷ <20><><EFBFBD><EFBFBD>.
bSuccess = true;
SetSkillLevel( nResultSkillID, 1, DBDNWorldDef::SkillChangeCode::Use, false );
// ȹ<><C8B9> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>뺸.
m_pUserSession->SendAcquireSkill( nResultSkillID, ERROR_NONE );
}
else
{
switch( Output.eResult )
{
// ij<><C4B3><EFBFBD><EFBFBD> <20><EFBFBD><E4B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ڶ<EFBFBD>.
case CDnSkillTreeSystem::R_NOT_ENOUGH_CHAR_LEVEL:
nRetCode = ERROR_SKILL_ACQUIRE_FAIL_NOT_ENOUGH_CHAR_LEVEL;
break;
// <20><><EFBFBD><EFBFBD>(<28>θ<EFBFBD>) <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD>.
case CDnSkillTreeSystem::R_DONT_HAVE_PARENT_SKILL:
nRetCode = ERROR_SKILL_ACQUIRE_FAIL_DONT_HAVE_PARENT_SKILL;
break;
//// <20>θ<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD>.
//case CDnSkillTreeSystem::R_LOCKED_PARENTSKILL:
// break;
// <20>θ<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
case CDnSkillTreeSystem::R_NOT_ENOUGH_PARENT_SKILL_LEVEL:
nRetCode = ERROR_SKILL_ACQUIRE_FAIL_NOT_ENOUGH_PARENT_SKILL_LEVEL;
break;
// <20><>ų <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD> <20><>ų<EFBFBD><C5B3> ȹ<><C8B9><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.
case CDnSkillTreeSystem::R_NOT_ENOUGH_SKILLPOINT_TO_ACQUIRE:
nRetCode = ERROR_SKILL_ACQUIRE_FAIL_NOT_ENOUGH_SKILLPOINT;
break;
}
}
}
else
{
nRetCode = ERROR_SKILL_UNLOCK_FAIL;
}
}
else
{
nRetCode = ERROR_SKILL_UNLOCK_MISMATCH_JOB;
}
}
else
{
// <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
nRetCode = ERROR_SKILL_UNLOCK_ALREADY_OPEN;
}
if( false == bSuccess )
{
//m_pUserSession->SendUnlockSkill( nResultSkillID, nRetCode );
m_pUserSession->SendAcquireSkill( nResultSkillID, nRetCode );
}
return bSuccess;
}
// <20><>ų ȹ<><C8B9>. (<28><><EFBFBD><EFBFBD> 0<><30><EFBFBD><EFBFBD> 1<><31> <20>ٲ<EFBFBD>)
// <20><>ų <20><><EFBFBD><EFBFBD> <20><> <20>ٽ<EFBFBD> ȹ<><C8B9><EFBFBD><EFBFBD> <20>̰<EFBFBD> ȣ<><C8A3><EFBFBD>ȴ<EFBFBD>.
#if defined(PRE_ADD_SKILL_LEVELUP_RESERVATION)
int CDNUserSkill::AcquireSkill( int nSkillID )
#else
void CDNUserSkill::AcquireSkill( int nSkillID )
#endif
{
#ifdef PRE_ADD_SP_REVISION
// #29463 <20>̽<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><>ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>ٸ<EFBFBD> <20><><EFBFBD><20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
#ifdef _FINAL_BUILD
CheckAndRevisionSkillPoint();
#endif // #ifdef _FINAL_BUILD
#endif // #ifdef PRE_ADD_SP_REVISION
TMapSkillList::iterator iter = m_SkillList[GetCurrentSkillPage()].find( nSkillID );
int nRetCode = ERROR_NONE;
if( iter != m_SkillList[GetCurrentSkillPage()].end() )
{
_ASSERT( false == iter->second.bLock );
_ASSERT( 0 == iter->second.cSkillLevel );
// <20><>ų <20><><EFBFBD><EFBFBD> <20><> <20><>ȹ<EFBFBD><C8B9> <20>ϴ<EFBFBD> <20><><EFBFBD><20><>ȣ <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20>ִ<EFBFBD><D6B4><EFBFBD> üũ
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.
TSkillData* pSkillData = g_pDataManager->GetSkillData( nSkillID );
if( m_pUserSession->GetSkill()->IsExclusiveSkill( nSkillID, pSkillData->nExclusiveID ) )
{
// <20><EFBFBD><E2BABB><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD> Ŭ<>󿡼<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD><EFBFBD>ٸ<EFBFBD> <20><><EFBFBD>̴<EFBFBD>.
#if defined(PRE_ADD_SKILL_LEVELUP_RESERVATION)
return ERROR_SKILL_ACQUIRE_FAIL_EXCLUSIVE;
#else
m_pUserSession->SendAcquireSkill( nSkillID, ERROR_SKILL_ACQUIRE_FAIL_EXCLUSIVE );
return;
#endif // #if defined(PRE_ADD_SKILL_LEVELUP_RESERVATION)
}
// #36858 <20>۷ι<DBB7> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִٸ<D6B4> <20>ش<EFBFBD> <20>׷<EFBFBD><D7B7>߿<EFBFBD> <20>ϳ<EFBFBD><CFB3><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>θ<EFBFBD> <20><>ų <20><><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD>.
bool bAlreadyGlobalSkillAcquired = false;
if( HasSameGlobalIDSkill( pSkillData->nGlobalSkillGroup ) )
bAlreadyGlobalSkillAcquired = true;
CDnSkillTreeSystem* pSkillTreeSystem = g_pDataManager->GetSkillTreeSystem();
CDnSkillTreeSystem::S_TRY_ACQUIRE TryAcquire( GetPossessedSkillInfo() );
CDnSkillTreeSystem::S_OUTPUT Output;
TryAcquire.iCurrentCharLevel = m_pUserSession->GetLevel();
TryAcquire.iTryAcquireSkillID = nSkillID;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><> <20><> <20>ִ<EFBFBD> SP <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
TryAcquire.iHasSkillPoint = GetAvailSkillPointByJob( nSkillID );
// <20><>ų<EFBFBD><C5B3> <20><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E4B8AE> <20>ִ<EFBFBD><D6B4><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>Ƽ<EFBFBD> ó<><C3B3>.
TryAcquire.iJobID = -1;
if (pSkillData){
for( int i = 0; i < JOBMAX; ++i )
{
BYTE cJob = m_pUserSession->GetStatusData()->cJobArray[ i ];
if( 0 < cJob )
{
if( cJob == pSkillData->nNeedJobID )
{
TryAcquire.iJobID = pSkillData->nNeedJobID;
}
}
else
break;
}
}
if( -1 != TryAcquire.iJobID )
{
pSkillTreeSystem->TryAcquireSkill( TryAcquire, &Output );
bool bIgnoreParentSkillCondition = ( (CDnSkillTreeSystem::R_DONT_HAVE_PARENT_SKILL == Output.eResult) ||
(CDnSkillTreeSystem::R_LOCKED_PARENTSKILL == Output.eResult) ||
(CDnSkillTreeSystem::R_NOT_ENOUGH_PARENT_SKILL_LEVEL == Output.eResult) ) &&
true == bAlreadyGlobalSkillAcquired;
if( CDnSkillTreeSystem::R_SUCCESS == Output.eResult ||
true == bIgnoreParentSkillCondition )
{
SetSkillLevel( nSkillID, 1, DBDNWorldDef::SkillChangeCode::Use, false );
// TODO: <20><>ų ȹ<><C8B9> <20><><EFBFBD><EFBFBD> <20>̼<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3>.
//m_pUserSession->GetEventSystem()->OnEvent( EventSystem::OnSkillAdd, 1, EventSystem::SkillID, nSkillID );
}
else
{
switch( Output.eResult )
{
// ij<><C4B3><EFBFBD><EFBFBD> <20><EFBFBD><E4B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ڶ<EFBFBD>.
case CDnSkillTreeSystem::R_NOT_ENOUGH_CHAR_LEVEL:
nRetCode = ERROR_SKILL_ACQUIRE_FAIL_NOT_ENOUGH_CHAR_LEVEL;
break;
// <20><><EFBFBD><EFBFBD>(<28>θ<EFBFBD>) <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD>.
case CDnSkillTreeSystem::R_DONT_HAVE_PARENT_SKILL:
nRetCode = ERROR_SKILL_ACQUIRE_FAIL_DONT_HAVE_PARENT_SKILL;
break;
//// <20>θ<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD>.
//case CDnSkillTreeSystem::R_LOCKED_PARENTSKILL:
// break;
// <20>θ<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
case CDnSkillTreeSystem::R_NOT_ENOUGH_PARENT_SKILL_LEVEL:
nRetCode = ERROR_SKILL_ACQUIRE_FAIL_NOT_ENOUGH_PARENT_SKILL_LEVEL;
break;
// <20><>ų <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD> <20><>ų<EFBFBD><C5B3> ȹ<><C8B9><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.
case CDnSkillTreeSystem::R_NOT_ENOUGH_SKILLPOINT_TO_ACQUIRE:
nRetCode = ERROR_SKILL_ACQUIRE_FAIL_NOT_ENOUGH_SKILLPOINT;
break;
}
}
}
else
nRetCode = ERROR_SKILL_ACQUIRE_FAIL_MISMATCH_JOB;
}
else
{
// <20>ش<EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. ERROR_SKILL_LEVELUPFAIL_ISNOT_YOURS Ŭ<><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
nRetCode = ERROR_SKILL_ACQUIRE_FAIL_ISNOT_YOURS;
}
#if defined(PRE_ADD_SKILL_LEVELUP_RESERVATION)
return nRetCode;
#else
m_pUserSession->SendAcquireSkill( nSkillID, nRetCode );
#endif
}
// ġƮŰ <20><><EFBFBD><EFBFBD> <20><>ų ȹ<><C8B9> <20>Լ<EFBFBD>..
void CDNUserSkill::CheatAcquireSkill( int nSkillID )
{
TMapSkillList::iterator iter = m_SkillList[GetCurrentSkillPage()].find( nSkillID );
int nRetCode = ERROR_NONE;
if( iter != m_SkillList[GetCurrentSkillPage()].end() )
{
SetSkillLevel( nSkillID, 1, DBDNWorldDef::SkillChangeCode::ModSkillLevelByAdmin, false );
m_pUserSession->SendAcquireSkill( nSkillID, nRetCode );
}
}
#if defined(PRE_ADD_SKILL_LEVELUP_RESERVATION)
void CDNUserSkill::ReservationSkillList(CSReservationSkillListReq* pUnlockSkillByMoneyReq)
{
if( pUnlockSkillByMoneyReq->nCount <= 0 )
return;
SCReservationSkillListAck ReservationSkillAck;
memset(&ReservationSkillAck, 0, sizeof(SCReservationSkillListAck));
for( int i=0; i<pUnlockSkillByMoneyReq->nCount; ++i)
{
memcpy(&ReservationSkillAck.tReservationSkillAck[i].tReservationSkill, &pUnlockSkillByMoneyReq->tReservationSkill[i], sizeof(TReservationSkillReq));
if(pUnlockSkillByMoneyReq->tReservationSkill[i].cType == ReservationSKillList::Type::UnLock)
{
ReservationSkillAck.tReservationSkillAck[i].nResult = UnLockSkillByMoney(pUnlockSkillByMoneyReq->tReservationSkill[i].nSkillID);
}
else if(pUnlockSkillByMoneyReq->tReservationSkill[i].cType == ReservationSKillList::Type::Acquire)
{
ReservationSkillAck.tReservationSkillAck[i].nResult = AcquireSkill(pUnlockSkillByMoneyReq->tReservationSkill[i].nSkillID);
}
else if(pUnlockSkillByMoneyReq->tReservationSkill[i].cType == ReservationSKillList::Type::LevelUp)
{
int nResult = ERROR_NONE;
int nCurLevel = GetSkillLevel(pUnlockSkillByMoneyReq->tReservationSkill[i].nSkillID);
if( nCurLevel >= pUnlockSkillByMoneyReq->tReservationSkill[i].nLevel)
{
nResult = ERROR_GENERIC_UNKNOWNERROR;
}
else
{
for( int j=nCurLevel;j<pUnlockSkillByMoneyReq->tReservationSkill[i].nLevel;++j)
{
nResult = SkillLevelUp(pUnlockSkillByMoneyReq->tReservationSkill[i].nSkillID);
if( nResult != ERROR_NONE)
break;
}
}
ReservationSkillAck.tReservationSkillAck[i].nResult = nResult;
}
else
break;
++ReservationSkillAck.nCount;
if(ReservationSkillAck.tReservationSkillAck[i].nResult != ERROR_NONE ) // <20><><EFBFBD>߿<EFBFBD> 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>׳<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..
break;
}
int nLen = sizeof(SCReservationSkillListAck) - sizeof(ReservationSkillAck.tReservationSkillAck) + (sizeof(TReservationSkillAck)*ReservationSkillAck.nCount);
m_pUserSession->AddSendData(SC_SKILL, eSkill::SC_RESERVATION_SKILL_LIST_ACK, (char*)&ReservationSkillAck, nLen);
}
#endif //#if defined(PRE_ADD_SKILL_LEVELUP_RESERVATION)
void CDNUserSkill::ResetSkill( int nSkillPage )
{
// <20><><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų <20>ʱ<EFBFBD>ȭ.
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ؾ<EFBFBD><D8BE><EFBFBD>.
ResetAllSkill( nSkillPage );
m_pUserSession->GetDBConnection()->QueryResetSkill(m_pUserSession, nSkillPage);
}
void CDNUserSkill::WaitForUseSkillResetCashItemFromDBServer( vector<int>& vlSkillIDsToReset )
{
m_vlWaitingSkillIDsToReset = vlSkillIDsToReset;
}
void CDNUserSkill::OnResponseSkillResetCashItemFromDBServer( bool bSuccess )
{
if( bSuccess )
{
// <20>޾Ƴ<DEBE><C6B3>Ҵ<EFBFBD> <20><>ų <20><><EFBFBD>̵<EFBFBD><CCB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. <20><>ų <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> DB<44><42><EFBFBD><EFBFBD> <20><><EFBFBD>ڸ<EFBFBD><DAB8><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD><EFBFBD>ֹǷ<D6B9> <20><><EFBFBD><20>Ű<EFBFBD> <20>Ƚᵵ <20><>.
int aiDefaultSkills[ DEFAULTSKILLMAX ] = { 0 };
g_pDataManager->GetCreateDefaultSkill( m_pUserSession->GetClassID(), aiDefaultSkills );
int nCount = 0;
for( int i = 0; i != (int)m_vlWaitingSkillIDsToReset.size(); ++i )
{
TMapSkillList::iterator iter = m_SkillList[GetCurrentSkillPage()].find( m_vlWaitingSkillIDsToReset.at(i) );
_ASSERT( m_SkillList[GetCurrentSkillPage()].end() != iter );
if( m_SkillList[GetCurrentSkillPage()].end() == iter )
continue;
bool bDefaultSkill = false;
for( int k = 0; k < DEFAULTSKILLMAX; ++k )
{
if( aiDefaultSkills[ k ] == iter->second.nSkillID )
{
bDefaultSkill = true;
break;
}
}
if( bDefaultSkill )
{
iter->second.cSkillLevel = 1;
}
else
iter->second.cSkillLevel = 0;
for( UINT k = 0; k < m_vlPossessedSkill[GetCurrentSkillPage()].size(); ++k )
{
if( iter->second.nSkillID == m_vlPossessedSkill[GetCurrentSkillPage()].at( k ).iSkillID )
m_vlPossessedSkill[GetCurrentSkillPage()].at( k ).iSkillLevel = iter->second.cSkillLevel;
}
nCount++;
}
}
m_vlWaitingSkillIDsToReset.clear();
}
void CDNUserSkill::GatherThisJobSkill( BYTE cJob, IN OUT vector<int>& vlResult )
{
// <20><><EFBFBD><EFBFBD> <20>ӵ<EFBFBD><D3B5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȴٸ<C8B4> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD> <20>Ѵ<EFBFBD>.
vector<CDnSkillTreeSystem::S_POSSESSED_SKILL_INFO>::iterator iter = m_vlPossessedSkill[GetCurrentSkillPage()].begin();
for ( iter; iter != m_vlPossessedSkill[GetCurrentSkillPage()].end(); ++iter )
{
TSkillData* pSkillData = g_pDataManager->GetSkillData( iter->iSkillID );
if (!pSkillData) continue;
if( pSkillData->nNeedJobID == cJob )
{
// ȹ<><C8B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>¿<EFBFBD><C2BF><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
if( 0 < iter->iSkillLevel )
vlResult.push_back( iter->iSkillID );
}
}
}
int CDNUserSkill::GetLevelUpSkillPoint( int nPrevLevel, int nCurLevel )
{
if( nPrevLevel == nCurLevel ) return 0;
int nSkillPoint = 0;
for( int i=nPrevLevel+1; i<=nCurLevel; i++ ) {
nSkillPoint += CPlayerLevelTable::GetInstance().GetValue( m_pUserSession->GetClassID(), i, CPlayerLevelTable::SkillPoint );
}
return nSkillPoint;
}
bool CDNUserSkill::IsExclusiveSkill( int nSkillID, int nExclusiveID )
{
if( 0 != nExclusiveID )
{
TMapSkillList::iterator iter = m_SkillList[GetCurrentSkillPage()].begin();
for(iter; iter != m_SkillList[GetCurrentSkillPage()].end(); ++iter)
{
const TSkill& ExistSkillData = iter->second;
if( ExistSkillData.nSkillID <= 0 )
continue;
if( nSkillID == ExistSkillData.nSkillID )
continue;
// <20><><EFBFBD><EFBFBD> 0 ¥<><C2A5><EFBFBD><EFBFBD> <20><><EFBFBD>µ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ƴϹǷ<CFB9> <20>񱳴<EFBFBD><F1B1B3B4><EFBFBD><EFBFBD><EFBFBD> <20>ƴ<EFBFBD>.
if( 0 == ExistSkillData.cSkillLevel )
continue;
const TSkillData* pSkillData = g_pDataManager->GetSkillData( ExistSkillData.nSkillID );
if( 0 != pSkillData->nExclusiveID )
{
if( nExclusiveID == pSkillData->nExclusiveID )
return true;
}
}
}
return false;
}
int CDNUserSkill::GetUsedSPByJob( int nJobID )
{
int iResult = 0;
for( int i = 0; i < (int)m_vlPossessedSkill[GetCurrentSkillPage()].size(); ++i )
{
int iSkillID = m_vlPossessedSkill[GetCurrentSkillPage()].at( i ).iSkillID;
const TSkillData* pSkillData = g_pDataManager->GetSkillData( iSkillID );
// <20><><EFBFBD>̳<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD><CFB6><EFBFBD> NULL üũ. <20>׽<EFBFBD>Ʈ <20>ܰ迡<DCB0><E8BFA1><EFBFBD><EFBFBD> <20>׵<EFBFBD><D7B5><EFBFBD>..
#if defined(_FINAL_BUILD)
if( NULL == pSkillData )
continue;
#endif // #if defined(_FINAL_BUILD)
if( pSkillData->nNeedJobID == nJobID )
{
int iLevel = m_vlPossessedSkill[GetCurrentSkillPage()].at( i ).iSkillLevel;
int iSize = (int)pSkillData->vLevelDataList.size();
for( int k = 0; k < min(iLevel, iSize); ++k )
iResult += pSkillData->vLevelDataList.at( k ).nNeedSkillPoint;
if (iLevel > iSize)
g_Log.Log(LogType::_ERROR, L"GetUsedSPByJob - Wrong Skill Size(WORSETID:%d, CHARID:%d, iLevel:%d, iSize:%d)\r\n", m_pUserSession->GetWorldSetID(), m_pUserSession->GetCharacterDBID(), iLevel, iSize);
}
}
return iResult;
}
int CDNUserSkill::GetAvailSkillPointByJob( int nSkillID )
{
int iWholeSP = GetLevelUpSkillPoint( 1, m_pUserSession->GetLevel() );
float fAvailSPRatioByJob = m_pUserSession->GetAvailSkillPointRatioByJob( nSkillID );
const TSkillData* pSkillDataToLevelUp = g_pDataManager->GetSkillData( nSkillID );
int iUsedSPThisJob = 0;
if (pSkillDataToLevelUp)
iUsedSPThisJob = GetUsedSPByJob( pSkillDataToLevelUp->nNeedJobID );
// <20><>ü <20><><EFBFBD><EFBFBD><EBB0A1> SP <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> SP <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ü <20><><EFBFBD><EFBFBD><EBB0A1> SP <20><> <20><>¥<EFBFBD>̹Ƿ<CCB9> <20>ش<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD>.
int iAvailPoint = int(fAvailSPRatioByJob*iWholeSP)-iUsedSPThisJob;
if( m_pUserSession->GetSkillPoint() < iAvailPoint )
iAvailPoint = m_pUserSession->GetSkillPoint();
return iAvailPoint;
}
void CDNUserSkill::OnAttachEquip( TItem *pItem )
{
if( pItem->nItemID > 0 ) {
TItemData *pItemData = g_pDataManager->GetItemData( pItem->nItemID );
if( pItemData && (pItemData->nSkillID > 0) ) {
if( !FindSkill( pItemData->nSkillID ) ) {
TSkill Skill;
memset(&Skill, 0, sizeof(TSkill));
Skill.nSkillID = pItemData->nSkillID;
Skill.cSkillLevel = 1;
Skill.bLock = false;
m_SkillList[GetCurrentSkillPage()][pItemData->nSkillID] = Skill;
CDnSkillTreeSystem::S_POSSESSED_SKILL_INFO SkillInfo;
SkillInfo.iSkillID = pItemData->nSkillID;
SkillInfo.iSkillLevel = Skill.cSkillLevel;
SkillInfo.bCurrentLock = Skill.bLock;
m_vlPossessedSkill[GetCurrentSkillPage()].push_back( SkillInfo );
}
}
}
}
void CDNUserSkill::OnDetachEquip( TItem *pItem )
{
if( pItem->nItemID > 0 ) {
TItemData *pItemData = g_pDataManager->GetItemData( pItem->nItemID );
if( pItemData && (pItemData->nSkillID > 0) ) {
TMapSkillList::iterator iter = m_SkillList[GetCurrentSkillPage()].find( pItemData->nSkillID );
if (iter != m_SkillList[GetCurrentSkillPage()].end()){
m_SkillList[GetCurrentSkillPage()].erase(iter);
vector<CDnSkillTreeSystem::S_POSSESSED_SKILL_INFO>::iterator iter = m_vlPossessedSkill[GetCurrentSkillPage()].begin();
for( iter; m_vlPossessedSkill[GetCurrentSkillPage()].end() != iter; ++iter )
{
if( iter->iSkillID == pItemData->nSkillID )
{
m_vlPossessedSkill[GetCurrentSkillPage()].erase( iter );
break;
}
}
}
}
}
}
#ifdef PRE_ADD_SP_REVISION
#ifdef _FINAL_BUILD
void CDNUserSkill::CheckAndRevisionSkillPoint( bool bSendRevisionSPToClient/* = true*/ )
{
if( NULL == m_pUserSession )
return;
// #29463 <20>̽<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><>ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>ٸ<EFBFBD> <20><><EFBFBD><20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
int nUseSkillPoint = 0;
int nWholeSP = GetLevelUpSkillPoint( 1, m_pUserSession->GetLevel() );
// <20><><EFBFBD><EFBFBD>Ʈ <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><>ų<EFBFBD><20>ְ<EFBFBD> 1<><31><EFBFBD>̶<EFBFBD><CCB6><EFBFBD> <20><>ų<EFBFBD><C5B3> <20>ϳ<EFBFBD><CFB3><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.
int aiDefaultSkills[ DEFAULTSKILLMAX ] = { 0 };
g_pDataManager->GetCreateDefaultSkill( m_pUserSession->GetClassID(), aiDefaultSkills );
int iNumSkill = (int)m_vlPossessedSkill[GetCurrentSkillPage()].size();
for( int i = 0; i < iNumSkill; ++i )
{
CDnSkillTreeSystem::S_POSSESSED_SKILL_INFO& PossessedSkill = m_vlPossessedSkill[GetCurrentSkillPage()].at( i );
// <20><><EFBFBD><EFBFBD>Ʈ <20><>ų<EFBFBD>̰<EFBFBD> <20><><EFBFBD><EFBFBD> 1<≯<EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EABFA1> <20><><EFBFBD><EFBFBD>.
bool bDefaultSkill = false;
bool bDefaultSkillOneLevel = false;
for( int k = 0; k < DEFAULTSKILLMAX; ++k )
{
if( aiDefaultSkills[ k ] == 0 )
break;
if( PossessedSkill.iSkillID == aiDefaultSkills[ k ] )
{
bDefaultSkill = true;
if( 1 == PossessedSkill.iSkillLevel )
{
bDefaultSkillOneLevel = true;
}
break;
}
}
if( bDefaultSkill && bDefaultSkillOneLevel )
continue;
for( int k = 0; k < PossessedSkill.iSkillLevel; ++k )
{
// <20><><EFBFBD><EFBFBD>Ʈ <20><>ų<EFBFBD><C5B3> 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
// <20><><EFBFBD>̺<EFBFBD><CCBA><EFBFBD> <20>ʿ<EFBFBD> SP <20><> 0<><30><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ϳ<EFBFBD> <20>߸<EFBFBD> <20>ԷµǾ<C2B5><C7BE><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڵ忡<DAB5><E5BFA1> <20><><EFBFBD>´<EFBFBD>.
if( bDefaultSkill && 0 == k )
continue;
nUseSkillPoint += g_pDataManager->GetNeedSkillPoint(PossessedSkill.iSkillID, k + 1);
}
}
int nLeftSkillPoint = nWholeSP - nUseSkillPoint;
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE>ִ<EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20>ٸ<EFBFBD><D9B8>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD>ó<EFBFBD><C3B3>.
int nNowSkillPoint = m_pUserSession->GetSkillPoint();
// <20><><EFBFBD><EFBFBD> <20>ʰ<EFBFBD><CAB0>ؼ<EFBFBD> <20>̹<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><C2B6><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><>ų ȹ<><C8B9><EFBFBD>Ҷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ǵ<EFBFBD><C7B5><EFBFBD> <20>׳<EFBFBD> <20><><EFBFBD><20>ѱ<EFBFBD><D1B1><EFBFBD>.
if( nLeftSkillPoint < 0 )
return;
if( nNowSkillPoint != nLeftSkillPoint )
{
m_pUserSession->SetSkillPoint( nLeftSkillPoint, GetCurrentSkillPage() );
#ifdef PRE_FIX_SP_REVISION_CHANGE_SP
m_pUserSession->GetDBConnection()->QuerySetSkillPoint( m_pUserSession, nLeftSkillPoint, GetCurrentSkillPage() );
#else
int nSkillPointDelta = nLeftSkillPoint - nNowSkillPoint;
if( 0 < nSkillPointDelta )
{
m_pUserSession->GetDBConnection()->QueryIncreaseSkillPoint( m_pUserSession, nSkillPointDelta, DBDNWorldDef::SkillPointCode::Repair, GetCurrentSkillPage() );
}
else
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ҵ<EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѱ<EFBFBD><D1B0>ָ<EFBFBD> DB <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ش<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>.
m_pUserSession->GetDBConnection()->QueryDecreaseSkillPoint( m_pUserSession, -nSkillPointDelta, GetCurrentSkillPage() );
}
#endif // #ifdef PRE_FIX_SP_REVISION_CHANGE_SP
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD>Ե<EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD>Ʈ <20><>Ŷ<EFBFBD><C5B6> <20>о<EFBFBD><D0BE>ش<EFBFBD>.
if( bSendRevisionSPToClient )
m_pUserSession->SendPushSkillPoint( nLeftSkillPoint );
}
}
#endif // #ifdef _FINAL_BUILD
#endif // #ifdef PRE_ADD_SP_REVISION
void CDNUserSkill::ResetAllSkill(int nSkillPage )
{
// <20><20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> 0<><30><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. <20>Ҹ<EFBFBD><D2B8><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŵ.
// <20><20><>ų<EFBFBD><C5B3> 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
int aiDefaultSkills[ DEFAULTSKILLMAX ] = { 0 };
g_pDataManager->GetCreateDefaultSkill( m_pUserSession->GetClassID(), aiDefaultSkills );
TMapSkillList::iterator iter;
int nCount = 0;
if( nSkillPage < DualSkill::Type::Primary || nSkillPage >= DualSkill::Type::MAX )
return;
for (iter = m_SkillList[nSkillPage].begin(); iter != m_SkillList[nSkillPage].end(); ++iter)
{
bool bDefaultSkill = false;
for( int i = 0; i < DEFAULTSKILLMAX; ++i )
{
if( aiDefaultSkills[ i ] == iter->second.nSkillID )
{
bDefaultSkill = true;
break;
}
}
if( bDefaultSkill )
{
iter->second.cSkillLevel = 1;
}
else
iter->second.cSkillLevel = 0;
for( int i = 0; i < (int)m_vlPossessedSkill[nSkillPage].size(); ++i )
{
if( iter->second.nSkillID == m_vlPossessedSkill[nSkillPage].at( i ).iSkillID )
m_vlPossessedSkill[nSkillPage].at( i ).iSkillLevel = iter->second.cSkillLevel;
}
nCount++;
}
}
#ifdef PRE_ADD_CHANGEJOB_CASHITEM
void CDNUserSkill::OnResponseChangeJobCode( USHORT wTotalSkillPoint )
{
for(int nSkillPage = DualSkill::Type::Primary; nSkillPage < DualSkill::Type::MAX ; nSkillPage++ )
{
ResetAllSkill( nSkillPage );
m_pUserSession->SetSkillPoint( wTotalSkillPoint, nSkillPage );
}
}
#endif // #ifdef PRE_ADD_CHANGEJOB_CASHITEM
bool CDNUserSkill::HasSameGlobalIDSkill( int iGlobalSkillGroupID )
{
bool bResult = false;
if( 0 < iGlobalSkillGroupID )
{
TMapSkillList::iterator iter = m_SkillList[GetCurrentSkillPage()].begin();
for(iter; iter != m_SkillList[GetCurrentSkillPage()].end(); ++iter)
{
const TSkillData* pExistSkillData = g_pDataManager->GetSkillData( iter->second.nSkillID );
if( pExistSkillData )
{
if( pExistSkillData->nGlobalSkillGroup == iGlobalSkillGroupID )
{
bResult = true;
break;
}
}
}
}
return bResult;
}
void CDNUserSkill::ApplyExpendedSkillPage( int nSkillPage )
{
if( nSkillPage == GetCurrentSkillPage() || nSkillPage <= DualSkill::Type::Primary || nSkillPage >= DualSkill::Type::MAX)
return;
int aiDefaultSkills[ DEFAULTSKILLMAX ] = { 0 };
int addCount = 0;
int nUseSkillPoint = 0;
g_pDataManager->GetCreateDefaultSkill( m_pUserSession->GetClassID(), aiDefaultSkills );
for(int i=0; i<DEFAULTSKILLMAX; i++ )
{
if( aiDefaultSkills[i] > 0 )
{
m_pSkillData[nSkillPage].SkillList[addCount].cSkillLevel = 1;
m_pSkillData[nSkillPage].SkillList[addCount].nSkillID = aiDefaultSkills[i];
m_pSkillData[nSkillPage].SkillList[addCount].nCoolTime = 0;
addCount++;
}
}
for (int i = 0; i < SKILLMAX; i++){
if (m_pSkillData[nSkillPage].SkillList[i].nSkillID <= 0) continue;
// <20><><EFBFBD><EFBFBD><EFBFBD>Ϳ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų ID<49><44> DB <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE>ִٸ<D6B4> <20>о<EFBFBD><D0BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
const TSkillData* pSkillData = g_pDataManager->GetSkillData( m_pSkillData[nSkillPage].SkillList[i].nSkillID );
if( NULL == pSkillData )
continue;
m_SkillList[nSkillPage][m_pSkillData[nSkillPage].SkillList[i].nSkillID] = m_pSkillData[nSkillPage].SkillList[i];
CDnSkillTreeSystem::S_POSSESSED_SKILL_INFO SkillInfo;
SkillInfo.iSkillID = m_pSkillData[nSkillPage].SkillList[i].nSkillID;
SkillInfo.iSkillLevel = m_pSkillData[nSkillPage].SkillList[i].cSkillLevel;
SkillInfo.bCurrentLock = m_pSkillData[nSkillPage].SkillList[i].bLock;
m_vlPossessedSkill[nSkillPage].push_back( SkillInfo );
if (m_pSkillData[nSkillPage].SkillList[i].nSkillID > 0){
for (int j = 0; j < m_pSkillData[nSkillPage].SkillList[i].cSkillLevel; j++){
nUseSkillPoint += g_pDataManager->GetNeedSkillPoint(m_pSkillData[nSkillPage].SkillList[i].nSkillID, j + 1);
}
}
}
}
int CDNUserSkill::GetCurrentSkillPage()
{
return m_pUserSession->GetSkillPage();
}
#if defined(PRE_ADD_SKILL_LEVELUP_LIMIT_BY_SP)
void CDNUserSkill::GetJobHistory(BYTE *cJobArray, vector<int>& jobHistory)
{
for (int j = 0; j < JOBMAX; j++){
if (cJobArray[j] <= 0) continue;
jobHistory.push_back((int)cJobArray[j]);
}
}
bool CDNUserSkill::IsAvailableSPByJob(vector<int>& jobHistory, vector<int>& needSPValues)
{
bool isAvailableSPByJob = true;
int nJobCount = (int)jobHistory.size();
int nJobID = -1;
for (int i = 0; i < nJobCount; ++i)
{
if (IsAvailableSPByJob(jobHistory, needSPValues, i) == false)
{
isAvailableSPByJob = false;
break;
}
}
return isAvailableSPByJob;
}
bool CDNUserSkill::IsAvailableSPByJob(std::vector<int>& jobHistory, vector<int>& needSPValues, int nIndex)
{
bool isAvailableSPByJob = false;
int nJobCount = (int)jobHistory.size();
int nNeedSPValue = 0;
int nSPValueCount = (int)needSPValues.size();
if (nIndex >= 0 && nIndex < nSPValueCount)
nNeedSPValue = needSPValues[nIndex];
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>??
if (nIndex >= nJobCount)
{
if (nNeedSPValue <= 0)
return true;
else
return false;
}
int nJobID = -1;
nJobID = jobHistory[nIndex];
int iUsedSkillPointInThisJob = GetUsedSPByJob( nJobID );
//<2F>ش<EFBFBD> JobID<49><44> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SP<53><50><EFBFBD><EFBFBD> Ȯ<>ο<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŀ<><C4BF> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>..
if (iUsedSkillPointInThisJob >= nNeedSPValue)
isAvailableSPByJob = true;
return isAvailableSPByJob;
}
#endif // PRE_ADD_SKILL_LEVELUP_LIMIT_BY_SP