From e6c32f28bc794d6a77c7857eafd007c423ff6220 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 17 Mar 2023 17:53:14 +0800 Subject: [PATCH] 1 --- server/gameserver/buff/callfunc.cc | 149 +++++++++++++++-------------- 1 file changed, 78 insertions(+), 71 deletions(-) diff --git a/server/gameserver/buff/callfunc.cc b/server/gameserver/buff/callfunc.cc index 6a31a02b..98e91bf5 100644 --- a/server/gameserver/buff/callfunc.cc +++ b/server/gameserver/buff/callfunc.cc @@ -333,81 +333,85 @@ void CallFuncBuff::ProcLightCircle() int keep_buff_uniid = 0; ); - { - auto on_enter = - [this, context] (Human* hum) - { - if (context->in_human_infos.find(hum->GetUniId()) != context->in_human_infos.end()) { - abort(); - } - const mt::Skill* curr_skill_meta = context->active_skill_meta ? - context->active_skill_meta : skill_meta; - InnerObject o; - o.c = hum->GetWeakPtrRef(); + auto on_enter = + [this, context] (Human* hum) + { + if (context->in_human_infos.find(hum->GetUniId()) != context->in_human_infos.end()) { + abort(); + } + const mt::Skill* curr_skill_meta = context->active_skill_meta ? + context->active_skill_meta : skill_meta; - const mt::Skill* old_skill_meta = skill_meta; - skill_meta = curr_skill_meta; - if (context->active_skill_meta) { - for (int buff_id : meta->_buff_param3_int_list) { - o.buff_uniids.insert(hum->TryAddBuff(GetCaster().Get(), buff_id, skill_meta)); - } - } else { - for (int buff_id : meta->_buff_param2_int_list) { - o.buff_uniids.insert(hum->TryAddBuff(GetCaster().Get(), buff_id, skill_meta)); - } - } - skill_meta = old_skill_meta; + InnerObject o; + o.c = hum->GetWeakPtrRef(); - context->in_human_infos[hum->GetUniId()] = o; - context->in_human_infos[hum->GetUniId()].OnEnter(); - }; - auto on_stay = - [this, context] (Human* hum) - { - }; - auto on_leave = - [this, context] (Human* hum) - { - auto itr = context->in_human_infos.find(hum->GetUniId()); - if (itr == context->in_human_infos.end()) { - abort(); + const mt::Skill* old_skill_meta = skill_meta; + skill_meta = curr_skill_meta; + if (context->active_skill_meta) { + for (int buff_id : meta->_buff_param3_int_list) { + o.buff_uniids.insert(hum->TryAddBuff(GetCaster().Get(), buff_id, skill_meta)); } - for (int buff_uniid : itr->second.buff_uniids) { - hum->RemoveBuffByUniId(buff_uniid); + } else { + for (int buff_id : meta->_buff_param2_int_list) { + o.buff_uniids.insert(hum->TryAddBuff(GetCaster().Get(), buff_id, skill_meta)); } - itr->second.OnLeave(); - }; - auto check_cb = - [this, context, on_enter, on_stay, on_leave] - () - { - const mt::Skill* curr_skill_meta = context->active_skill_meta ? - context->active_skill_meta : skill_meta; - if (!owner->dead) { - float range = curr_skill_meta->_number_meta->_float_range2; - int size = 0; - std::array hit_humans; - owner->GetTeam()->TraverseMembers - ( - [this, range, &hit_humans, &size] (Human* hum) mutable - { - if (!hum->dead && - Collision::CheckCC(owner, owner->GetRadius(), - hum, range)) { - if (size < MAX_TEAM_NUM) { - hit_humans[size++] = hum; - } + } + skill_meta = old_skill_meta; + + context->in_human_infos[hum->GetUniId()] = o; + context->in_human_infos[hum->GetUniId()].OnEnter(); + }; + auto on_stay = + [this, context] (Human* hum) + { + }; + auto on_leave = + [this, context] (Human* hum) + { + auto itr = context->in_human_infos.find(hum->GetUniId()); + if (itr == context->in_human_infos.end()) { + abort(); + } + for (int buff_uniid : itr->second.buff_uniids) { + hum->RemoveBuffByUniId(buff_uniid); + } + itr->second.OnLeave(); + }; + auto check_cb = + [this, context, on_enter, on_stay, on_leave] + () + { + if (owner->HasBuffEffect(kBET_Fly) || + owner->HasBuffEffect(kBET_Jump)) { + return; + } + const mt::Skill* curr_skill_meta = context->active_skill_meta ? + context->active_skill_meta : skill_meta; + if (!owner->dead) { + float range = curr_skill_meta->_number_meta->_float_range2; + int size = 0; + std::array hit_humans; + owner->GetTeam()->TraverseMembers + ( + [this, range, &hit_humans, &size] (Human* hum) mutable + { + if (!hum->dead && + Collision::CheckCC(owner, owner->GetRadius(), + hum, range)) { + if (size < MAX_TEAM_NUM) { + hit_humans[size++] = hum; } - return true; - }); - std::vector leave_humans; - for (auto& pair : context->in_human_infos) { - bool found = false; - for (int i = 0; i < size; ++i){ - if (hit_humans[i] == pair.second.c.Get()) { - found = true; - break; + } + return true; + }); + std::vector leave_humans; + for (auto& pair : context->in_human_infos) { + bool found = false; + for (int i = 0; i < size; ++i){ + if (hit_humans[i] == pair.second.c.Get()) { + found = true; + break; } } if (!found) { @@ -473,7 +477,6 @@ void CallFuncBuff::ProcLightCircle() } }, &xtimer_attacher); - } { owner->GetTrigger()->AddListener @@ -525,9 +528,13 @@ void CallFuncBuff::ProcLightCircle() owner->GetTrigger()->AddListener ( kStartJump, - [this, context] (const a8::Args& args) mutable + [this, context, on_leave] (const a8::Args& args) mutable { if (context->keep_buff_uniid) { + for (auto& pair : context->in_human_infos) { + on_leave(pair.second.c.Get()->AsHuman()); + } + context->in_human_infos.clear(); owner->RemoveBuffByUniId(context->keep_buff_uniid); context->keep_buff_uniid = 0; }