diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 93eb96a1..75f7a4f6 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -3,6 +3,7 @@ #include "creature.h" #include "metamgr.h" #include "room.h" +#include "skill.h" bool Creature::HasBuffEffect(int buff_effect_id) { @@ -314,3 +315,18 @@ void Creature::TriggerOneObjectBuff(Entity* target, BuffTriggerType_e trigger_ty { } + +Skill* Creature::GetSkill(int skill_id) +{ + auto itr = skill_hash_.find(skill_id); + return itr != skill_hash_.end() ? itr->second : nullptr; +} + +bool Creature::CanUseSkill(int skill_id) +{ + Skill* skill = GetSkill(skill_id); + if (!skill) { + return false; + } + return skill->GetLeftTime() <= 0; +} diff --git a/server/gameserver/creature.h b/server/gameserver/creature.h index ac32d104..b7e69260 100644 --- a/server/gameserver/creature.h +++ b/server/gameserver/creature.h @@ -11,6 +11,7 @@ namespace MetaData } struct xtimer_list; +class Skill; class Creature : public MoveableEntity { public: @@ -35,6 +36,7 @@ class Creature : public MoveableEntity float GetBuffAttrRate(int attr_id); void FillBuffList(::google::protobuf::RepeatedPtrField<::cs::MFBuff>* pb_buff_list); void TriggerBuff(std::set& target_list, BuffTriggerType_e trigger_type); + Skill* GetSkill(int skill_id); void AddPassiveSkill(MetaData::Skill* skill_meta); void RemovePassiveSkill(MetaData::Skill* skill_meta); @@ -44,6 +46,7 @@ class Creature : public MoveableEntity void AddPassiveSkillBuff(MetaData::Skill* skill_meta); virtual void SelectSkillTargets(const a8::Vec2& target_pos, std::set& target_list); + virtual bool CanUseSkill(int skill_id); protected: size_t curr_skill_phase = 0; @@ -56,6 +59,7 @@ protected: long long last_use_skill_frameno_ = 0; a8::XTimerAttacher skill_xtimer_attacher_; MetaData::Skill* skill_meta_ = nullptr; + std::map skill_hash_; private: diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 4490c106..ee0ecbce 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -1314,16 +1314,7 @@ bool Human::HasNoDownedTeammate() bool Human::CanUseSkill(int skill_id) { - if (downed) { - return false; - } - if (!skill_meta_) { - return false; - } - if (GetSkillLeftTime() > 0) { - return false; - } - return true; + return !downed && Creature::CanUseSkill(skill_id); } void Human::DoJump() diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 3cf7d364..8bf9f17a 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -193,7 +193,7 @@ class Human : public Creature void RemoveOutObjects(Entity* entity); bool HasLiveTeammate(); bool HasNoDownedTeammate(); - bool CanUseSkill(int skill_id); + virtual bool CanUseSkill(int skill_id) override; void DoJump(); void DoSkill(int skill_id, int target_id, const a8::Vec2& target_pos); virtual int SelectSkillId(); diff --git a/server/gameserver/skill.cc b/server/gameserver/skill.cc new file mode 100644 index 00000000..223e5e2a --- /dev/null +++ b/server/gameserver/skill.cc @@ -0,0 +1,8 @@ +#include "precompile.h" + +#include "skill.h" + +int Skill::GetLeftTime() +{ + return 0; +} diff --git a/server/gameserver/skill.h b/server/gameserver/skill.h new file mode 100644 index 00000000..643f046a --- /dev/null +++ b/server/gameserver/skill.h @@ -0,0 +1,17 @@ +#pragma once + +namespace MetaData +{ + struct Skill; +} + +class Creature; +class Skill +{ + public: + Creature* owner = nullptr; + MetaData::Skill* meta = nullptr; + long long add_frameno = 0; + + int GetLeftTime(); +};