diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 59757877..96126dad 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -2429,11 +2429,35 @@ void Creature::DoRecoilForce(int distance) } } -void Creature::WinSkillExp(int win_exp) +void Creature::WinExp(int win_exp) { + if (win_exp <= 0) { + return; + } if (!IsHuman()) { return; } + if (!hero_grow_meta_) { + return; + } + if (hero_grow_meta_->levelExp() <= 0) { + return; + } + if (hero_grow_meta_->IsFullLevel()) { + return; + } + int add_exp = win_exp; + while ( + hero_grow_meta_->GetNextMeta() && + hero_grow_meta_->levelExp() > 0 && + !hero_grow_meta_->IsFullLevel() && + GetHeroExp() + add_exp >= hero_grow_meta_->levelExp() + ) { + add_exp -= hero_grow_meta_->levelExp(); + hero_grow_meta_ = hero_grow_meta_->GetNextMeta(); + hero_level_ = hero_grow_meta_->level(); + GenLevelAttr(); + } } void Creature::RecalcDtoAttr() @@ -3935,6 +3959,29 @@ void Creature::SetHeroLevel(int level, int exp, const mt::BattleHeroGrow* grow_m hero_level_ = level; hero_exp_ = exp; hero_grow_meta_ = grow_meta; + GenLevelAttr(); +} + +int Creature::GetHeroLevel() +{ + return hero_level_; +} + +int Creature::GetHeroExp() +{ + return hero_exp_; +} + +int Creature::GetHeroMaxExp() +{ + if (hero_grow_meta_) { + return hero_grow_meta_->levelExp(); + } + return -1; +} + +void Creature::GenLevelAttr() +{ if (hero_grow_meta_) { { auto attrs = hero_grow_meta_->GetLevelAttrs(); @@ -3973,21 +4020,3 @@ void Creature::SetHeroLevel(int level, int exp, const mt::BattleHeroGrow* grow_m } } } - -int Creature::GetHeroLevel() -{ - return hero_level_; -} - -int Creature::GetHeroExp() -{ - return hero_exp_; -} - -int Creature::GetHeroMaxExp() -{ - if (hero_grow_meta_) { - return hero_grow_meta_->levelExp(); - } - return -1; -} diff --git a/server/gameserver/creature.h b/server/gameserver/creature.h index 288968de..b110d991 100644 --- a/server/gameserver/creature.h +++ b/server/gameserver/creature.h @@ -360,7 +360,7 @@ class Creature : public MoveableEntity int GetHeroLevel(); int GetHeroExp(); int GetHeroMaxExp(); - void WinSkillExp(int win_exp); + void WinExp(int win_exp); void RecalcDtoAttr(); void AutoNavigation(const glm::vec3& target_pos, float speed, std::function cb); @@ -435,6 +435,7 @@ private: void CheckLoadingBullet(); bool InternalCanUseSkill(Skill* skill); void InternalUseSkill(); + void GenLevelAttr(); protected: bool need_sync_active_player_ = false;