1564 lines
48 KiB
C++
1564 lines
48 KiB
C++
|
|
#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
|