From a72eb798d93fc45ddbf019739c831d68c1e1fefb Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 19 Mar 2021 15:54:10 +0800 Subject: [PATCH] 1 --- server/gameserver/creature.cc | 54 +++++++++-------------------------- server/gameserver/creature.h | 6 ++-- server/gameserver/skill.cc | 28 ++++++++++++++++++ server/gameserver/skill.h | 4 +++ 4 files changed, 48 insertions(+), 44 deletions(-) diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 76fd963..450bf37 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -226,7 +226,7 @@ void Creature::FillBuffList(::google::protobuf::RepeatedPtrField<::cs::MFBuff>* void Creature::AddPassiveSkill(int skill_id) { MetaData::Skill* skill_meta = MetaMgr::Instance()->GetSkill(skill_id); - if (skill_meta && !HasPassiveSkill(skill_meta->i->skill_id())) { + if (skill_meta && !GetPassiveSkill(skill_meta->i->skill_id())) { Skill* skill = new Skill; skill->owner = this; skill->meta = skill_meta; @@ -236,20 +236,22 @@ void Creature::AddPassiveSkill(int skill_id) SERVER_FRAME_RATE * skill_meta->i->skill_cd(), a8::XParams() .SetSender(this) - .SetParam1(skill_meta), + .SetParam1(skill_id), [] (const a8::XParams& param) { Creature* c = (Creature*)param.sender.GetUserData(); - MetaData::Skill* skill_meta = (MetaData::Skill*)param.param1.GetUserData(); - c->ClearPassiveSkillBuff(skill_meta); - c->AddPassiveSkillBuff(skill_meta); + Skill* skill = c->GetPassiveSkill(param.param1); + if (skill) { + skill->ClearPassiveSkillBuff(); + skill->AddPassiveSkillBuff(); + } }, &skill->xtimer_attacher.timer_list_); passive_skill_hash_[skill_meta->i->skill_id()] = skill; - AddPassiveSkillBuff(skill_meta); + skill->AddPassiveSkillBuff(); if (skill_meta->i->skill_cd() > 10000) { //永久被动被动技能 - AddPassiveSkillBuff(skill_meta); + skill->AddPassiveSkillBuff(); } } } @@ -258,7 +260,7 @@ void Creature::RemovePassiveSkill(int skill_id) { auto itr = passive_skill_hash_.find(skill_id); if (itr != passive_skill_hash_.end()) { - ClearPassiveSkillBuff(itr->second->meta); + itr->second->ClearPassiveSkillBuff(); delete itr->second; passive_skill_hash_.erase(itr); } @@ -276,40 +278,10 @@ void Creature::ClearPassiveSkill() } } -bool Creature::HasPassiveSkill(int skill_id) +Skill* Creature::GetPassiveSkill(int skill_id) { - return passive_skill_hash_.find(skill_id) != passive_skill_hash_.end(); -} - -void Creature::ClearPassiveSkillBuff(MetaData::Skill* skill_meta) -{ - for (int buff_id : skill_meta->buff_list) { - Buff* buff = GetBuffById(buff_id); - if (buff && - (buff->meta->i->buff_target() == kBuffTargetSelf || - buff->meta->i->buff_target() == kBuffTargetFriendly)) { - RemoveBuffById(buff_id); - } - } -} - -void Creature::AddPassiveSkillBuff(MetaData::Skill* skill_meta) -{ - if (!skill_meta) { - return; - } - int old_skill_target_id_ = skill_target_id_; - a8::Vec2 old_skill_target_pos_ = skill_target_pos_; - - skill_target_id_ = GetEntityUniId(); - skill_target_pos_ = GetPos(); - - std::set target_list; - SelectSkillTargets(CurrentSkill(), GetPos(), target_list); - TriggerBuff(CurrentSkill(), target_list, kBTT_UseSkill); - - skill_target_id_ = old_skill_target_id_; - skill_target_pos_ = old_skill_target_pos_; + auto itr = passive_skill_hash_.find(skill_id); + return itr != passive_skill_hash_.end() ? itr->second : nullptr; } void Creature::SelectSkillTargets(Skill* skill, const a8::Vec2& target_pos, std::set& target_list) diff --git a/server/gameserver/creature.h b/server/gameserver/creature.h index c78cca3..4d1fa10 100644 --- a/server/gameserver/creature.h +++ b/server/gameserver/creature.h @@ -75,10 +75,8 @@ private: void ProcBuffEffect(Creature* caster, Buff* buff); void TriggerOneObjectBuff(Skill* skill, Entity* target, BuffTriggerType_e trigger_type); - bool HasPassiveSkill(int skill_id); + Skill* GetPassiveSkill(int skill_id); void RemovePassiveSkill(int skill_id); - void ClearPassiveSkillBuff(MetaData::Skill* skill_meta); - void AddPassiveSkillBuff(MetaData::Skill* skill_meta); private: std::array buff_attr_abs_ = {}; @@ -94,4 +92,6 @@ private: a8::Vec2 skill_target_pos_; std::map skill_hash_; std::map passive_skill_hash_; + + friend class Skill; }; diff --git a/server/gameserver/skill.cc b/server/gameserver/skill.cc index fdf8c5a..21933f7 100644 --- a/server/gameserver/skill.cc +++ b/server/gameserver/skill.cc @@ -16,3 +16,31 @@ int Skill::GetLeftTime() int skill_left_time = std::max(0, GetCd() - passed_time); return skill_left_time; } + +void Skill::ClearPassiveSkillBuff() +{ + for (int buff_id : meta->buff_list) { + Buff* buff = owner->GetBuffById(buff_id); + if (buff && + (buff->meta->i->buff_target() == kBuffTargetSelf || + buff->meta->i->buff_target() == kBuffTargetFriendly)) { + owner->RemoveBuffById(buff_id); + } + } +} + +void Skill::AddPassiveSkillBuff() +{ + int old_skill_target_id_ = owner->skill_target_id_; + a8::Vec2 old_skill_target_pos_ = owner->skill_target_pos_; + + owner->skill_target_id_ = owner->GetEntityUniId(); + owner->skill_target_pos_ = owner->GetPos(); + + std::set target_list; + owner->SelectSkillTargets(this, owner->GetPos(), target_list); + owner->TriggerBuff(this, target_list, kBTT_UseSkill); + + owner->skill_target_id_ = old_skill_target_id_; + owner->skill_target_pos_ = old_skill_target_pos_; +} diff --git a/server/gameserver/skill.h b/server/gameserver/skill.h index 57b3d88..92c563a 100644 --- a/server/gameserver/skill.h +++ b/server/gameserver/skill.h @@ -16,4 +16,8 @@ class Skill int GetCd(); int GetLeftTime(); + + void ClearPassiveSkillBuff(); + void AddPassiveSkillBuff(); + };