diff --git a/server/gameserver/skill.cc b/server/gameserver/skill.cc index 044002af..89f72444 100644 --- a/server/gameserver/skill.cc +++ b/server/gameserver/skill.cc @@ -25,6 +25,7 @@ #include "mt/Skill.h" #include "mt/SkillNumber.h" #include "mt/Equip.h" +#include "mt/MergeItem.h" static int GetTraceTargetId(Creature* c) { @@ -504,7 +505,26 @@ void Skill::Active() NotifySkillState(); } +void Skill::Clear() +{ + for (int buff_uniid : hold_buffs_) { + owner->RemoveBuffByUniId(buff_uniid); + } + hold_buffs_.clear(); +} + void Skill::LevelUp() { - + if (owner->GetInventory(IS_BLUE_STONE) % 3 == 0) { + Clear(); + auto merge_item_meta = mt::MergeItem::GetById(mt::Equip::BLUE_STONE_ID); + if (merge_item_meta) { + std::set* buffs = merge_item_meta->GetBuffs(owner->GetInventory(IS_BLUE_STONE)); + if (buffs) { + for (int buff_id : *buffs) { + hold_buffs_.push_back(owner->TryAddBuff(owner, buff_id, nullptr)); + } + } + } + } } diff --git a/server/gameserver/skill.h b/server/gameserver/skill.h index af36f918..be681db4 100644 --- a/server/gameserver/skill.h +++ b/server/gameserver/skill.h @@ -49,6 +49,7 @@ class Skill void Deactive() { actived_ = false; } bool IsMainSkill(); void LevelUp(); + void Clear(); private: void InitActiveSkill(); @@ -73,6 +74,7 @@ private: int minor_cd_time_ = 0; long long minor_frameno_ = 0; std::function minor_cb_; + std::vector hold_buffs_; friend class PBUtils; };