diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index bd6d2e65..fd276a54 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -893,7 +893,7 @@ bool Creature::CanUseSkill(int skill_id) if (IsHuman() && AsHuman()->downed) { return false; } - return skill->GetCurrTimes() > 0; + return skill->GetCurrTimes() > 0 || skill->GetMinorType() != SMT_NONE; } void Creature::DoSkill(int skill_id, @@ -904,6 +904,10 @@ void Creature::DoSkill(int skill_id, { Skill* skill = GetSkill(skill_id); if (skill && CanUseSkill(skill_id)) { + if (skill->GetMinorType()) { + skill->DoMinorMode(); + return; + } DoSkillPreProc(skill_id, target_id, target_pos); ResetSkill(); skill_target_id_ = target_id; diff --git a/server/gameserver/skill.cc b/server/gameserver/skill.cc index 68131c59..f5875cc8 100644 --- a/server/gameserver/skill.cc +++ b/server/gameserver/skill.cc @@ -70,6 +70,7 @@ void Skill::FillMFSkill(cs::MFSkill* skill_pb) skill_pb->set_max_times(GetMaxTimes()); if (minor_type_) { skill_pb->set_minor_type(minor_type_); + skill_pb->set_minor_cd_time(minor_cd_time_); } } @@ -194,5 +195,16 @@ void Skill::AddMinorMode( { minor_type_ = minor_type; minor_cd_time_ = minor_cd_time; + minor_frameno_ = owner->room->GetFrameNo(); minor_cb_ = cb; } + +void Skill::DoMinorMode() +{ + if (GetMinorType() != SMT_NONE) { + minor_cb_(); + minor_type_ = SMT_NONE; + minor_cd_time_ = 0; + minor_cb_ = nullptr; + } +} diff --git a/server/gameserver/skill.h b/server/gameserver/skill.h index c1ea5a9f..01c116b5 100644 --- a/server/gameserver/skill.h +++ b/server/gameserver/skill.h @@ -47,6 +47,7 @@ class Skill int minor_cd_time, std::function cb ); + void DoMinorMode(); void ClearPassiveSkillBuff(); void AddPassiveSkillBuff(); @@ -60,5 +61,6 @@ private: int curr_exp_ = 0; int minor_type_ = 0; int minor_cd_time_ = 0; + long long minor_frameno_ = 0; std::function minor_cb_; };