bool CAPet::AddExpSP( LONGLONG exp, int sp, bool bDirect ) { if( GetStmLevel() > 1 || GetFaithLevel() > 1 ) // 충성도나 기아 레벨 2 이상이면 경험치 획득 없음 return false; if( m_level >= MAX_APET_LEVEL ) return false; if( DEAD(this) ) return false; LONGLONG add_exp =0; if (m_level <= MAX_APET_LEVEL) add_exp = exp; if (m_level >= MAX_APET_LEVEL && m_exp > GetNeedExp()) add_exp = GetNeedExp(); if ( sp > 0 ) m_nSP += sp; if(bDirect == false) { if( add_exp > 0 && m_pOwner->m_assist.m_avAddition.hcPetExpBoost == true ) { m_pOwner->m_assist.CureByItemIndex(7344); add_exp = 4 * add_exp; } if( m_pOwner->m_assist.m_avAddition.hcCashPetExpUp_2358 == true ) add_exp = 2 * add_exp; else if( m_pOwner->m_assist.m_avAddition.hcCashPetExpUp_2359 == true ) add_exp = 3 * add_exp; #ifdef DOUBLE_PET_EXP if( gserver->m_bDoublePetExpEvent == true ) add_exp = add_exp * gserver->m_PetExpPercent / 10000000; #endif // DOUBLE_PET_EXP } if(add_exp > exp * (1500000 / 1000)) // 1500%이상 못먹게 함. { add_exp = exp * (1500000 / 1000); } m_exp += add_exp; if ( m_exp < 0 ) m_exp = 0; if (m_nSP > MAX_SKILLPOINT) m_nSP = MAX_SKILLPOINT; CalcLevelup(); return true; }
bool Player::GiveExp(Game_Manager* gm_, int value_) { if(GetNeedExp(level+1) == -1) return false; exp+=value_; if(exp >= GetNeedExp(level+1)) { LevelUp(gm_); } return false; }
void CAPet::AddExpSP_Direct( LONGLONG _exp, int _sp ) { m_exp += _exp; m_nSP += _sp; // EXP 최대치 검사 if (m_level >= MAX_APET_LEVEL && m_exp > GetNeedExp()) m_exp = GetNeedExp(); // SP 최대치 검사 if (m_nSP > MAX_SKILLPOINT) m_nSP = MAX_SKILLPOINT; // 레벨업 확인 CalcLevelup(); }
void CAPet::CalcLevelup() { if ( m_exp < 0 ) m_exp = 0; if (m_nSP > MAX_SKILLPOINT) m_nSP = MAX_SKILLPOINT; if ( GetNeedExp() <= m_exp && m_level < MAX_APET_LEVEL) { do { GAMELOG << init("APET LEVEL UP", GetOwner() ) << m_level << " ==> " << m_level + 1 << end; m_exp -= GetNeedExp(); m_level++; // 레벨업 효과 LevelUp(true); if( m_level >= MAX_APET_LEVEL ) m_exp = 0; } while ( GetNeedExp() <= m_exp ); } { CNetMsg::SP rmsg(new CNetMsg); ExAPetStatusMsg(rmsg, this); SEND_Q(rmsg, GetOwner()->m_desc); } }
float Player::GetExpPercent() { if(GetNeedExp(level+1) == -1) return 1.0f; return ((float)(exp - GetNeedExp(level)))/(GetNeedExp(level+1)-GetNeedExp(level)); }