From ad0e12835ff2ca09cec957db8c86c322020cec95 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Thu, 18 Mar 2021 14:40:38 +0800 Subject: [PATCH] 1 --- server/gameserver/creature.cc | 104 ++++++++++++++++++++++++++++++++++ server/gameserver/creature.h | 11 ++++ server/gameserver/human.cc | 94 ------------------------------ server/gameserver/human.h | 11 +--- 4 files changed, 117 insertions(+), 103 deletions(-) diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 5bf12c4..93eb96a 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -210,3 +210,107 @@ void Creature::FillBuffList(::google::protobuf::RepeatedPtrField<::cs::MFBuff>* itr.FillMFBuff(buff); } } + +void Creature::AddPassiveSkill(MetaData::Skill* skill_meta) +{ + if (!HasPassiveSkill(skill_meta)) { + xtimer_list* tmp_timer = room->xtimer.AddRepeatTimerAndAttach + ( + SERVER_FRAME_RATE * skill_meta->i->skill_cd(), + a8::XParams() + .SetSender(this) + .SetParam1(skill_meta), + [] (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); + }, + &xtimer_attacher.timer_list_); + passive_skill_metas_[skill_meta] = tmp_timer; + AddPassiveSkillBuff(skill_meta); + if (skill_meta->i->skill_cd() > 10000) { + //永久被动被动技能 + AddPassiveSkillBuff(skill_meta); + } + } +} + +void Creature::RemovePassiveSkill(MetaData::Skill* skill_meta) +{ + auto itr = passive_skill_metas_.find(skill_meta); + if (itr != passive_skill_metas_.end()) { + ClearPassiveSkillBuff(skill_meta); + room->xtimer.DeleteTimer(itr->second); + passive_skill_metas_.erase(itr); + } +} + +void Creature::ClearPassiveSkill() +{ + std::vector del_skills; + del_skills.reserve(passive_skill_metas_.size()); + for (auto& pair : passive_skill_metas_) { + del_skills.push_back(pair.first); + } + for (MetaData::Skill* skill_meta : del_skills) { + RemovePassiveSkill(skill_meta); + } +} + +bool Creature::HasPassiveSkill(MetaData::Skill* skill_meta) +{ + return passive_skill_metas_.find(skill_meta) != passive_skill_metas_.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; + } + MetaData::Skill* old_curr_skill = skill_meta_; + int old_skill_target_id_ = skill_target_id_; + a8::Vec2 old_skill_target_pos_ = skill_target_pos_; + + skill_meta_ = skill_meta; + skill_target_id_ = GetEntityUniId(); + skill_target_pos_ = GetPos(); + + std::set target_list; + SelectSkillTargets(GetPos(), target_list); + TriggerBuff(target_list, kBTT_UseSkill); + + skill_meta_= old_curr_skill; + skill_target_id_ = old_skill_target_id_; + skill_target_pos_ = old_skill_target_pos_; +} + +void Creature::SelectSkillTargets(const a8::Vec2& target_pos, std::set& target_list) +{ + +} + +void Creature::TriggerBuff(std::set& target_list, BuffTriggerType_e trigger_type) +{ + for (Entity* entity : target_list) { + TriggerOneObjectBuff(entity, trigger_type); + } +} + +void Creature::TriggerOneObjectBuff(Entity* target, BuffTriggerType_e trigger_type) +{ + +} diff --git a/server/gameserver/creature.h b/server/gameserver/creature.h index 49d040a..473dae7 100644 --- a/server/gameserver/creature.h +++ b/server/gameserver/creature.h @@ -34,6 +34,16 @@ class Creature : public MoveableEntity float GetBuffAttrAbs(int attr_id); 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); + + void AddPassiveSkill(MetaData::Skill* skill_meta); + void RemovePassiveSkill(MetaData::Skill* skill_meta); + void ClearPassiveSkill(); + bool HasPassiveSkill(MetaData::Skill* skill_meta); + void ClearPassiveSkillBuff(MetaData::Skill* skill_meta); + void AddPassiveSkillBuff(MetaData::Skill* skill_meta); + + virtual void SelectSkillTargets(const a8::Vec2& target_pos, std::set& target_list); protected: bool use_skill = false; @@ -54,6 +64,7 @@ private: virtual void AddBuffPostProc(Creature* caster, Buff* buff); virtual void OnBuffRemove(const Buff& buff); virtual void SendDebugMsg(const std::string& debug_msg); + virtual void TriggerOneObjectBuff(Entity* target, BuffTriggerType_e trigger_type); private: std::array buff_attr_abs_ = {}; diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 082e743..11746f3 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -3063,13 +3063,6 @@ void Human::TriggerOneObjectBuff(Entity* target, BuffTriggerType_e trigger_type) } } -void Human::TriggerBuff(std::set& target_list, BuffTriggerType_e trigger_type) -{ - for (Entity* entity : target_list) { - TriggerOneObjectBuff(entity, trigger_type); - } -} - void Human::AddBuffPostProc(Creature* caster, Buff* buff) { room->frame_event.AddBuff(this, buff); @@ -3871,93 +3864,6 @@ void Human::ResetSkill() playing_skill = false; } -void Human::AddPassiveSkill(MetaData::Skill* skill_meta) -{ - if (!HasPassiveSkill(skill_meta)) { - xtimer_list* tmp_timer = room->xtimer.AddRepeatTimerAndAttach - ( - SERVER_FRAME_RATE * skill_meta->i->skill_cd(), - a8::XParams() - .SetSender(this) - .SetParam1(skill_meta), - [] (const a8::XParams& param) - { - Human* hum = (Human*)param.sender.GetUserData(); - MetaData::Skill* skill_meta = (MetaData::Skill*)param.param1.GetUserData(); - hum->ClearPassiveSkillBuff(skill_meta); - hum->AddPassiveSkillBuff(skill_meta); - }, - &xtimer_attacher.timer_list_); - passive_skill_metas_[skill_meta] = tmp_timer; - AddPassiveSkillBuff(skill_meta); - if (skill_meta->i->skill_cd() > 10000) { - //永久被动被动技能 - AddPassiveSkillBuff(skill_meta); - } - } -} - -void Human::RemovePassiveSkill(MetaData::Skill* skill_meta) -{ - auto itr = passive_skill_metas_.find(skill_meta); - if (itr != passive_skill_metas_.end()) { - ClearPassiveSkillBuff(skill_meta); - room->xtimer.DeleteTimer(itr->second); - passive_skill_metas_.erase(itr); - } -} - -void Human::ClearPassiveSkill() -{ - std::vector del_skills; - del_skills.reserve(passive_skill_metas_.size()); - for (auto& pair : passive_skill_metas_) { - del_skills.push_back(pair.first); - } - for (MetaData::Skill* skill_meta : del_skills) { - RemovePassiveSkill(skill_meta); - } -} - -bool Human::HasPassiveSkill(MetaData::Skill* skill_meta) -{ - return passive_skill_metas_.find(skill_meta) != passive_skill_metas_.end(); -} - -void Human::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 Human::AddPassiveSkillBuff(MetaData::Skill* skill_meta) -{ - if (!skill_meta) { - return; - } - MetaData::Skill* old_curr_skill = skill_meta_; - int old_skill_target_id_ = skill_target_id_; - a8::Vec2 old_skill_target_pos_ = skill_target_pos_; - - skill_meta_ = skill_meta; - skill_target_id_ = GetEntityUniId(); - skill_target_pos_ = GetPos(); - - std::set target_list; - SelectSkillTargets(GetPos(), target_list); - TriggerBuff(target_list, kBTT_UseSkill); - - skill_meta_= old_curr_skill; - skill_target_id_ = old_skill_target_id_; - skill_target_pos_ = old_skill_target_pos_; -} - void Human::OnMetaChange() { if (GetRace() == kZombieRace) { diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 14d3130..c8fc1678 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -247,8 +247,7 @@ class Human : public Creature int GetSkillCd(); int GetSkillLv(); float GetSkillAtkAdd(int skill_id); - void TriggerOneObjectBuff(Entity* target, BuffTriggerType_e trigger_type); - void TriggerBuff(std::set& target_list, BuffTriggerType_e trigger_type); + virtual void TriggerOneObjectBuff(Entity* target, BuffTriggerType_e trigger_type) override; int GetLevel() {return level_;}; int GetExp() {return exp_;}; void OnAttack() {}; @@ -287,7 +286,7 @@ protected: void ProcLootCar(Loot* entity, MetaData::Equip* item_meta); void ProcCamoutflage(Loot* entity, MetaData::Equip* item_meta); void ProcSpoils(Loot* entity, MetaData::Equip* item_meta); - void SelectSkillTargets(const a8::Vec2& target_pos, std::set& target_list); + virtual void SelectSkillTargets(const a8::Vec2& target_pos, std::set& target_list) override; void ProcSkillPhase(MetaData::SkillPhase* phase); void AutoChgWeapon(); void CancelRevive(); @@ -313,12 +312,6 @@ private: std::set& dec_grids); void RemoveFromScene(); void ResetSkill(); - void AddPassiveSkill(MetaData::Skill* skill_meta); - void RemovePassiveSkill(MetaData::Skill* skill_meta); - void ClearPassiveSkill(); - bool HasPassiveSkill(MetaData::Skill* skill_meta); - void ClearPassiveSkillBuff(MetaData::Skill* skill_meta); - void AddPassiveSkillBuff(MetaData::Skill* skill_meta); void OnMetaChange(); void OnChgToTerminator(); void ProcReloadAction();