diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 6fabe58a..9ce21de0 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -2454,15 +2454,6 @@ void Creature::WinExp(int win_exp) hero_exp_ = 0; GenLevelAttr(); } - if (hero_grow_meta_->levelExp() <= 0) { - hero_exp_ = 0; - return; - } - if (hero_grow_meta_->IsFullLevel()) { - hero_exp_ = 0; - return; - } - hero_exp_ = std::max(hero_exp_ + add_exp, hero_grow_meta_->levelExp() - 1); if (GetHeroLevel() > old_level) { room->frame_event.AddPropChgEx ( @@ -2474,6 +2465,15 @@ void Creature::WinExp(int win_exp) 0, false); } + if (hero_grow_meta_->levelExp() <= 0) { + hero_exp_ = 0; + return; + } + if (hero_grow_meta_->IsFullLevel()) { + hero_exp_ = 0; + return; + } + hero_exp_ = std::min(hero_exp_ + add_exp, hero_grow_meta_->levelExp() - 1); } void Creature::RecalcDtoAttr() diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 8db8eefb..1386c9df 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -1581,14 +1581,20 @@ void Human::OnDie() SyncAroundPlayers(__FILE__, __LINE__, __func__); { Creature* killer = room->GetCreatureByUniId(stats->killer_id); - if (killer && GetHeroGrowMeta() && killer->IsHuman() && + if (killer && GetHeroGrowMeta() && GetHeroGrowMeta()->lootExp() > 0) { - killer->WinExp(GetHeroGrowMeta()->lootExp() * mt::Param::s().battle_gain_exp_rate_killer); - killer->AsHuman()->GetTeam()->TraverseMembers + Human* real_killer = nullptr; + if (killer->IsHuman()) { + real_killer = killer->AsHuman(); + } else if (killer->IsHero() && killer->master.Get() && killer->master.Get()->IsHuman()) { + real_killer = killer->master.Get()->AsHuman(); + } + real_killer->WinExp(GetHeroGrowMeta()->lootExp() * mt::Param::s().battle_gain_exp_rate_killer); + real_killer->AsHuman()->GetTeam()->TraverseMembers ( - [this, killer] (Human* hum) -> bool + [this, real_killer] (Human* hum) -> bool { - if (killer != hum) { + if (real_killer != hum) { if (GetPos().Distance2D2(hum->GetPos().ToGlmVec3()) < mt::Param::s().battle_gain_exp_radium) { hum->WinExp(GetHeroGrowMeta()->lootExp() *