Code:
BOOL CMover::AddExperience( EXPINTEGER nExp, BOOL bFirstCall, BOOL bMultiPly, BOOL bMonster )
{
#ifdef __VTN_TIMELIMIT
// mulcom BEGIN100315 º£Æ®³² ½Ã°£ Á¦ÇÑ
if( ::GetLanguage() == LANG_VTN )
{
if( IsPlayer() && m_nAccountPlayTime != -1 )
{
if( m_nAccountPlayTime < 0 || m_nAccountPlayTime > MIN( 300 ) )
{
nExp = 0;
}
else if( m_nAccountPlayTime >= MIN( 180 ) && m_nAccountPlayTime <= MIN( 300 ) )
{
nExp = (EXPINTEGER)( nExp * 0.5f );
}
}
}
// mulcom END100315 º£Æ®³² ½Ã°£ Á¦ÇÑ
#endif // __VTN_TIMELIMIT
if( nExp <= 0 ) // nExp°¡ ¸¶À̳ʽºÀ̰ųª 0À̸é ó¸®ÇÒÇÊ¿ä ¾øÀ½.
return FALSE;
if( m_nHitPoint <= 0 )
return FALSE;
#if __VER < 15 // __GUILD_HOUSE
if( bFirstCall && bMultiPly )
{
nExp *= GetExpFactor();
}
#endif // __GUILD_HOUSE
#ifdef __INTERNALSERVER
TRACE( "EXP = %I64d\n", nExp );
#endif // __INTERNALSERVER
#if __VER >= 14 // __ANGEL_EXPERIENCE
#ifdef __3RD_LEGEND16
if( IsMaster() || IsHero() || IsLegendHero())
#else // __3RD_LEGEND16
if( IsMaster() || IsHero() )
#endif // __3RD_LEGEND16
nExp /= 2;
#if __VER >= 15 // __GUILD_HOUSE
if( bFirstCall && bMultiPly )
{
#ifdef __WORLDSERVER
EXPINTEGER nAddExp = static_cast<CUser*>( this )->GetAddExpAfterApplyRestPoint( nExp );
nExp = (EXPINTEGER)( nExp * GetExpFactor() );
nExp += nAddExp;
#endif // __WORLDSERVER
}
#endif // __GUILD_HOUSE
#if __VER >= 8 //__CSC_VER8_5
if( bFirstCall && HasBuffByIk3( IK3_ANGEL_BUFF ) )
{
int nAngel = 100;
#ifdef __BUFF_1107
IBuff* pBuff = m_buffs.GetBuffByIk3( IK3_ANGEL_BUFF );
WORD wId = ( pBuff? pBuff->GetId(): 0 );
#else // __BUFF_1107
LPSKILLINFLUENCE lpSkillIn = m_SkillState.GetItemBuf( IK3_ANGEL_BUFF );
WORD wId = ( lpSkillIn? lpSkillIn->wID: 0 );
#endif // __BUFF_1107
if( wId > 0 )
{
ItemProp* pItemProp = prj.GetItemProp( wId );
if( pItemProp )
nAngel = (int)( (float)pItemProp->nAdjParamVal1 );
}
if( nAngel <= 0 || 100 < nAngel )
nAngel = 100;
// ˬ: ÀüÁ÷ Àü ¿£Á© ¹öÇÁ Ȱ¼ºÈ* ÈÄ ÀüÁ÷ÇÏ´Â °æ¿ì, ÇÊ¿ä ¼öÄ¡°¡ ³Ê¹« Å©´Ù.
EXPINTEGER nMaxAngelExp = prj.m_aExpCharacter[m_nAngelLevel].nExp1 / 100 * nAngel;
if( m_nAngelExp < nMaxAngelExp )
{
nExp /= 2;
m_nAngelExp += nExp;
#ifdef __WORLDSERVER
#ifdef __ANGEL_LOG
#ifdef __EXP_ANGELEXP_LOG
int nAngelExpPercent = (int)( m_nAngelExp * 100 / nMaxAngelExp );
int nNextAngelExpLog = (int)(((CUser*)this)->m_nAngelExpLog / 20 + 1) * 20;
if( nAngelExpPercent >= nNextAngelExpLog )
{
((CUser*)this)->m_nAngelExpLog = nAngelExpPercent;
ItemProp* pItemProp = prj.GetItemProp( wId );
if( pItemProp )
{
LogItemInfo aLogItem;
aLogItem.Action = "&";
aLogItem.SendName = ((CUser*)this)->GetName();
aLogItem.RecvName = "ANGEL_EXP_LOG";
aLogItem.WorldId = ((CUser*)this)->GetWorld()->GetID();
aLogItem.Gold = aLogItem.Gold2 = ((CUser*)this)->GetGold();
//aLogItem.ItemName = pItemProp->szName;
_stprintf( aLogItem.szItemName, "%d", pItemProp->dwID );
aLogItem.Gold_1 = (DWORD)( m_nAngelExp );
g_DPSrvr.OnLogItem( aLogItem );
}
}
#endif // __EXP_ANGELEXP_LOG
#endif // __ANGEL_LOG
BOOL bAngelComplete = FALSE;
if( m_nAngelExp > nMaxAngelExp )
{
m_nAngelExp = nMaxAngelExp;
bAngelComplete = TRUE;
}
((CUser*)this)->AddAngelInfo( bAngelComplete );
#endif // __WORLDSERVER
}
}
#endif // __CSC_VER8_5
#endif // __ANGEL_EXPERIENCE
if( IsBaseJob() )
{
if( m_nLevel >= MAX_JOB_LEVEL )
{
m_nExp1 = 0;
return TRUE;
}
}
else if( IsExpert() )
{
if( m_nLevel >= MAX_JOB_LEVEL + MAX_EXP_LEVEL )
{
m_nExp1 = 0;
return TRUE;
}
}
else if( IsPro() )
{
if( m_nLevel > MAX_GENERAL_LEVEL )
{
m_nLevel = MAX_GENERAL_LEVEL;
return TRUE;
}
}
#if __VER >= 10 // __LEGEND // 10Â÷ Àü½Â½Ã½ºÅÛ Neuz, World, Trans
else if(IsMaster())
{
if( m_nLevel > MAX_GENERAL_LEVEL )
{
m_nLevel = MAX_GENERAL_LEVEL;
return TRUE;
}
#if __VER < 14 // __ANGEL_EXPERIENCE
else
{
nExp /= 2;
}
#endif // __ANGEL_EXPERIENCE
}
else if(IsHero())
{
#ifdef __3RD_LEGEND16
if( m_nLevel >= MAX_LEGEND_LEVEL )
#else // __3RD_LEGEND16
if( m_nLevel > MAX_LEGEND_LEVEL )
#endif // __3RD_LEGEND16
{
m_nLevel = MAX_LEGEND_LEVEL;
return TRUE;
}
#if __VER < 14 // __ANGEL_EXPERIENCE
else
{
nExp /= 2;
}
#endif // __ANGEL_EXPERIENCE
}
#endif //__LEGEND // 10Â÷ Àü½Â½Ã½ºÅÛ Neuz, World, Trans
#ifdef __3RD_LEGEND16
else if( IsLegendHero() )
{
if( m_nLevel > MAX_3RD_LEGEND_LEVEL )
{
m_nLevel = MAX_3RD_LEGEND_LEVEL;
return TRUE;
}
}
#endif // __3RD_LEGEND16
int nLevelbuf = m_nLevel;
int nNextLevel = m_nLevel + 1;
#if __VER < 14 // __ANGEL_EXPERIENCE
#if __VER >= 8 //__CSC_VER8_5
if( bFirstCall && HasBuffByIk3( IK3_ANGEL_BUFF ) )
{
int nAngel = 100;
#ifdef __BUFF_1107
IBuff* pBuff = m_buffs.GetBuffByIk3( IK3_ANGEL_BUFF );
WORD wId = ( pBuff? pBuff->GetId(): 0 );
#else // __BUFF_1107
LPSKILLINFLUENCE lpSkillIn = m_SkillState.GetItemBuf( IK3_ANGEL_BUFF );
WORD wId = ( lpSkillIn? lpSkillIn->wID: 0 );
#endif // __BUFF_1107
if( wId > 0 )
{
ItemProp* pItemProp = prj.GetItemProp( wId );
if( pItemProp )
nAngel = (float)pItemProp->nAdjParamVal1;
}
if( nAngel <= 0 || 100 < nAngel )
nAngel = 100;
// ˬ: ÀüÁ÷ Àü ¿£Á© ¹öÇÁ Ȱ¼ºÈ* ÈÄ ÀüÁ÷ÇÏ´Â °æ¿ì, ÇÊ¿ä ¼öÄ¡°¡ ³Ê¹« Å©´Ù.
EXPINTEGER nMaxAngelExp = prj.m_aExpCharacter[m_nAngelLevel].nExp1 / 100 * nAngel;
if( m_nAngelExp < nMaxAngelExp )
{
nExp /= 2;
m_nAngelExp += nExp;
#ifdef __WORLDSERVER
#ifdef __ANGEL_LOG
#ifdef __EXP_ANGELEXP_LOG
int nAngelExpPercent = m_nAngelExp * 100 / nMaxAngelExp;
int nNextAngelExpLog = (int)(((CUser*)this)->m_nAngelExpLog / 20 + 1) * 20;
if( nAngelExpPercent >= nNextAngelExpLog )
{
((CUser*)this)->m_nAngelExpLog = nAngelExpPercent;
ItemProp* pItemProp = prj.GetItemProp( wId );
if( pItemProp )
{
LogItemInfo aLogItem;
aLogItem.Action = "&";
aLogItem.SendName = ((CUser*)this)->GetName();
aLogItem.RecvName = "ANGEL_EXP_LOG";
aLogItem.WorldId = ((CUser*)this)->GetWorld()->GetID();
aLogItem.Gold = aLogItem.Gold2 = ((CUser*)this)->GetGold();
//aLogItem.ItemName = pItemProp->szName;
_stprintf( aLogItem.szItemName, "%d", pItemProp->dwID );
aLogItem.Gold_1 = m_nAngelExp;
g_DPSrvr.OnLogItem( aLogItem );
}
}
#endif // __EXP_ANGELEXP_LOG
#endif // __ANGEL_LOG
BOOL bAngelComplete = FALSE;
if( m_nAngelExp > nMaxAngelExp )
{
m_nAngelExp = nMaxAngelExp;
bAngelComplete = TRUE;
}
((CUser*)this)->AddAngelInfo( bAngelComplete );
#endif // __WORLDSERVER
}
}
#endif // __CSC_VER8_5
#endif // __ANGEL_EXPERIENCE
m_nExp1 += nExp; // pxp¿Í °ü°è¾øÀÌ exp°¡ Áõ°¡. ¸¸½¦ÀÌ!
if( bFirstCall )
{
#if __VER >= 8 // __S8_PK
#ifdef __WORLDSERVER
if( bMonster && IsChaotic() )
{
m_dwPKExp = (DWORD)( m_dwPKExp + nExp );
DWORD dwPropensity = GetPKPropensity(); // undorflow
int nLevelPKExp = prj.GetLevelExp( GetLevel() ); // Levelº° °¨¼Ò °æÇèÄ¡
if( nLevelPKExp != 0 )
{
int nSubExp = m_dwPKExp / nLevelPKExp;
if( nSubExp )
{
SetPKPropensity( GetPKPropensity() - ( m_dwPKExp / nLevelPKExp ) );
if( dwPropensity <= GetPKPropensity() )
SetPKPropensity( 0 );
m_dwPKExp %= nLevelPKExp;
g_UserMng.AddPKPropensity( this );
g_dpDBClient.SendLogPkPvp( this, NULL, 0, 'P' );
}
}
}
#endif // __WORLDSERVER
#endif // __VER >= 8 // __S8_PK
}
if( m_nExp1 >= prj.m_aExpCharacter[nNextLevel].nExp1 ) // ·¹º§¾÷
{
#ifdef __3RD_LEGEND16
if( IsLegendHero() && ( nNextLevel > MAX_3RD_LEGEND_LEVEL ) )
{
m_nLevel = MAX_3RD_LEGEND_LEVEL;
m_nExp1 = (prj.m_aExpCharacter[nNextLevel].nExp1 - 1);
return FALSE;
}
else if( !IsHero() && !IsLegendHero() && nNextLevel > MAX_GENERAL_LEVEL )
{
m_nLevel = MAX_GENERAL_LEVEL;
m_nExp1 = (prj.m_aExpCharacter[nNextLevel].nExp1 - 1);
return FALSE;
}
#else // __3RD_LEGEND16
#if __VER >= 10 // __LEGEND // 10Â÷ Àü½Â½Ã½ºÅÛ Neuz, World, Trans
if( IsHero() && ( nNextLevel > MAX_LEGEND_LEVEL ) )
{
m_nLevel = MAX_LEGEND_LEVEL;
m_nExp1 = (prj.m_aExpCharacter[nNextLevel].nExp1 - 1);
return FALSE;
}
else if( !IsHero() && nNextLevel > MAX_GENERAL_LEVEL )
{
m_nLevel = MAX_GENERAL_LEVEL;
m_nExp1 = (prj.m_aExpCharacter[nNextLevel].nExp1 - 1);
return FALSE;
}
#else //__LEGEND // 10Â÷ Àü½Â½Ã½ºÅÛ Neuz, World, Trans
if( nNextLevel > MAX_GENERAL_LEVEL )
{
m_nLevel = MAX_GENERAL_LEVEL;
m_nExp1 = (prj.m_aExpCharacter[nNextLevel].nExp1 - 1);
return FALSE;
}
#endif //__LEGEND // 10Â÷ Àü½Â½Ã½ºÅÛ Neuz, World, Trans
#endif // __3RD_LEGEND16
EXPINTEGER nExptmp;
// BOOL f = FALSE;
{
m_nRemainGP += prj.m_aExpCharacter[ nNextLevel ].dwLPPoint;
#if __VER >= 10 // __LEGEND // 10Â÷ Àü½Â½Ã½ºÅÛ Neuz, World, Trans
#ifdef __3RD_LEGEND16
if( IsMaster() || IsHero() || IsLegendHero() )
#else // __3RD_LEGEND16
if( IsMaster() || IsHero() )
#endif // __3RD_LEGEND16
m_nRemainGP++;
#endif //__LEGEND // 10Â÷ Àü½Â½Ã½ºÅÛ Neuz, World, Trans
nExptmp = m_nExp1 - prj.m_aExpCharacter[nNextLevel].nExp1;
#if __VER >= 8
m_nExp1 = 0;
#else // __VER >= 8
m_nExp1 = m_nDeathExp = 0;
#endif // __VER >= 8
m_nLevel = nNextLevel;
// if( m_nLevel > m_nDeathLevel )
// f = TRUE;
BOOL bLevelUp = TRUE;
if( IsBaseJob() && m_nLevel > MAX_JOB_LEVEL )
{
m_nLevel = MAX_JOB_LEVEL;
bLevelUp = FALSE;
}
else if( IsExpert() && m_nLevel > MAX_JOB_LEVEL + MAX_EXP_LEVEL )
{
m_nLevel = MAX_JOB_LEVEL + MAX_EXP_LEVEL;
bLevelUp = FALSE;
}
else if( IsPro() && m_nLevel > MAX_GENERAL_LEVEL )
{
m_nLevel = MAX_GENERAL_LEVEL;
bLevelUp = FALSE;
m_nExp1 = (prj.m_aExpCharacter[nNextLevel].nExp1 - 1);
nExptmp = 0;
return FALSE;
}
#if __VER >= 10 // __LEGEND // 10Â÷ Àü½Â½Ã½ºÅÛ Neuz, World, Trans
else if( IsMaster() && m_nLevel > MAX_GENERAL_LEVEL )
{
m_nLevel = MAX_GENERAL_LEVEL;
bLevelUp = FALSE;
m_nExp1 = (prj.m_aExpCharacter[nNextLevel].nExp1 - 1);
nExptmp = 0;
return FALSE;
}
#ifdef __3RD_LEGEND16
else if( IsHero() && (m_nLevel > MAX_LEGEND_LEVEL ) )
{
m_nLevel = MAX_LEGEND_LEVEL;
bLevelUp = FALSE;
}
else if( IsLegendHero() && m_nLevel > MAX_3RD_LEGEND_LEVEL )
{
m_nLevel = MAX_GENERAL_LEVEL;
bLevelUp = FALSE;
m_nExp1 = (prj.m_aExpCharacter[nNextLevel].nExp1 - 1);
nExptmp = 0;
return FALSE;
}
#else // __3RD_LEGEND16
else if( IsHero() && (m_nLevel > MAX_LEGEND_LEVEL ) )
{
m_nLevel = MAX_LEGEND_LEVEL;
bLevelUp = FALSE;
m_nExp1 = (prj.m_aExpCharacter[nNextLevel].nExp1 - 1);
nExptmp = 0;
return FALSE;
}
#endif // __3RD_LEGEND16
#endif //__LEGEND // 10Â÷ Àü½Â½Ã½ºÅÛ Neuz, World, Trans
if( bLevelUp )
{
m_nHitPoint = GetMaxHitPoint();
m_nManaPoint = GetMaxManaPoint();
m_nFatiguePoint = GetMaxFatiguePoint();
SetJobLevel( m_nLevel, m_nJob );
#if __VER >= 8
if( m_nDeathLevel >= m_nLevel )
{
m_nRemainGP -= prj.m_aExpCharacter[ nNextLevel ].dwLPPoint;
#if __VER >= 10 // __LEGEND // 10Â÷ Àü½Â½Ã½ºÅÛ Neuz, World, Trans
#ifdef __3RD_LEGEND16
if( IsMaster() || IsHero() || IsLegendHero() )
#else // __3RD_LEGEND16
if( IsMaster() || IsHero() )
#endif // __3RD_LEGEND16
m_nRemainGP--;
#endif //__LEGEND // 10Â÷ Àü½Â½Ã½ºÅÛ Neuz, World, Trans
}
#endif // __VER >= 8
#ifdef __WORLDSERVER
if( m_nDeathLevel < m_nLevel )
{
int nGetPoint = ((GetLevel() - 1) / 20) + 2;
#if __VER >= 10 // __LEGEND // 10Â÷ Àü½Â½Ã½ºÅÛ Neuz, World, Trans
if( IsMaster() || IsHero() )
SetMasterSkillPointUp();
else
#endif //__LEGEND // 10Â÷ Àü½Â½Ã½ºÅÛ Neuz, World, Trans
{
AddSkillPoint( nGetPoint );
g_dpDBClient.SendLogSkillPoint( LOG_SKILLPOINT_GET_HUNT, nGetPoint, this, NULL );
#ifdef __S_NEW_SKILL_2
g_dpDBClient.SaveSkill( (CUser*)this );
#endif // __S_NEW_SKILL_2
}
#ifdef __S_RECOMMEND_EVE
if( g_eLocal.GetState( EVE_RECOMMEND ) && IsPlayer() )
{
g_dpDBClient.SendRecommend( (CUser*)this );
}
#endif // __S_RECOMMEND_EVE
#ifdef __EXP_ANGELEXP_LOG
((CUser*)this)->m_nExpLog = 0;
#endif // __EXP_ANGELEXP_LOG
#ifdef __EVENTLUA_GIFT
prj.m_EventLua.SetLevelUpGift( (CUser*)this, m_nLevel );
#endif // __EVENTLUA_GIFT
#if __VER >= 15 // __CAMPUS
CCampusHelper::GetInstance()->SetLevelUpReward( (CUser*)this );
#endif // __CAMPUS
}
#endif // __WORLDSERVER
}
else
{
m_nRemainGP -= prj.m_aExpCharacter[ nNextLevel ].dwLPPoint;
#if __VER >= 10 // __LEGEND // 10Â÷ Àü½Â½Ã½ºÅÛ Neuz, World, Trans
#ifdef __3RD_LEGEND16
if( IsMaster() || IsHero() || IsLegendHero() )
#else // __3RD_LEGEND16
if( IsMaster() || IsHero() )
#endif // __3RD_LEGEND16
m_nRemainGP--;
#endif //__LEGEND // 10Â÷ Àü½Â½Ã½ºÅÛ Neuz, World, Trans
nExptmp = m_nExp1 = 0;
}
// ·¹º§ 20ÀÌ µÇ´Â¼ø°£ ºñÇà·¹º§Àº 1À̵ȴÙ.
if( m_nLevel == 20 )
SetFlightLv( 1 );
#ifdef __CLIENT
if( m_pActMover && ( m_pActMover->IsState( OBJSTA_STAND ) || m_pActMover->IsState( OBJSTA_STAND2 )) )
SetMotion( MTI_LEVELUP, ANILOOP_1PLAY, MOP_FIXED );
CreateSfx(g_Neuz.m_pd3dDevice,XI_GEN_LEVEL_UP01,GetPos(),GetId());
PlayMusic( BGM_IN_LEVELUP );
#endif // __CLIENT
}
if( nExptmp > 0 )
AddExperience( nExptmp, FALSE, bMultiPly );
return TRUE;
}
return FALSE;
}
// °æÇèÄ¡¸¦ nExp¸¸Å* ±ð´Â´Ù. ·¾´Ù¿îµµ µÈ´Ù.
// bExp2Clear : pxp¸¦ 0À¸·Î ÇÒ°ÇÁö ¸»°ÇÁö.
// bLvDown : ·¹º§´Ù¿îÀ» ÇÒ°ÇÁö ¸»°ÇÁö.
BOOL CMover::DecExperience( EXPINTEGER nExp, BOOL bExp2Clear, BOOL bLvDown )
{
if( nExp < 0 ) // °ªÀº Ç×»ó ¾ç¼ö·Î¸¸ Áà¾ß ÇÑ´Ù.
return FALSE;
int nPrevLevel = m_nLevel - 1;
if( nPrevLevel < 1 ) // ·¹º§ 1ÀÌÇϷδ ´õÀÌ»ó ³»·Á°¡Áö ¾ÊÀ½.
return FALSE;
m_nExp1 -= nExp; // nExp¸¸Å* °æÇèÄ¡¸¦ ±ðÀ½. Exp2´Â 0%·Î.
#if __VER < 8 // 8Â÷ ½ºÅ³°æÇèÄ¡´Ù¿îº¯°æ
m_nSkillExp -= nExp;
#endif // __VER >= 8
if( m_nExp1 < 0 )
{
if( bLvDown ) // ·¾´Ù¿îÀÌ µÇ´Â »óȲ.
{
#if __VER >= 8
--m_nLevel;
m_nExp1 = (EXPINTEGER)(prj.m_aExpCharacter[m_nLevel+1].nExp1 + m_nExp1 );
#endif // __VER >= 8
return TRUE; // ·¾´Ù¿î µÆÀ¸¸é TRUE¸®ÅÏ
}
else
{
m_nExp1 = 0;
#ifdef __WORLDSERVER
g_dpDBClient.SendLogLevelUp( this, 7 );
#endif // __WORLDSERVER
}
}
return FALSE;
}
// ÇöÀç ·¹º§ÀÇ ÃÖ´ë°æÇèÄ¡ÀÇ %·Î °æÇèÄ¡ Ç϶ô
// ex) fPercent = 0.2f; // 20%