diff --git a/server/gameserver/buff/callfunc.cc b/server/gameserver/buff/callfunc.cc index 92a292aa..df6248ae 100644 --- a/server/gameserver/buff/callfunc.cc +++ b/server/gameserver/buff/callfunc.cc @@ -187,6 +187,9 @@ void CallFuncBuff::Activate() void CallFuncBuff::Deactivate() { + if (deactivate_cb_) { + deactivate_cb_(); + } switch ((BuffCallFunc_e)meta->_int_buff_param1) { case BuffCallFunc_e::kAddMinorMode: { @@ -1044,10 +1047,11 @@ void CallFuncBuff::RangeHoldBuff() std::set hit_humans; owner->room->TraverseAliveHumanList ( - [this, range] (Human* hum) + [this, range, &hit_humans] (Human* hum) mutable { if (Collision::CheckCC(owner, owner->GetRadius(), hum, range)) { + hit_humans.insert(hum); } return true; }); @@ -1082,22 +1086,32 @@ void CallFuncBuff::RangeHoldBuff() } }, &owner->xtimer_attacher); + auto clear_func = + [this, context, check_timer] () mutable + { + owner->room->xtimer.Delete(check_timer); + for (auto& pair : context->in_human_infos) { + for (int buff_uniid : pair.second.buff_uniids) { + if (pair.second.c.Get()) { + pair.second.c.Get()->RemoveBuffByUniId(buff_uniid); + } + } + } + context->in_human_infos.clear(); + }; { event_handlers_.push_back(owner->GetTrigger()->AddListener ( kDieEvent, - [this, context, check_timer] (const a8::Args& args) mutable + [this, clear_func] (const a8::Args& args) mutable { - owner->room->xtimer.Delete(check_timer); - for (auto& pair : context->in_human_infos) { - for (int buff_uniid : pair.second.buff_uniids) { - if (pair.second.c.Get()) { - pair.second.c.Get()->RemoveBuffByUniId(buff_uniid); - } - } - } - context->in_human_infos.clear(); + clear_func(); } )); + deactivate_cb_ = + [this, clear_func] () mutable + { + clear_func(); + }; } } diff --git a/server/gameserver/buff/callfunc.h b/server/gameserver/buff/callfunc.h index f090fde9..d4fa7666 100644 --- a/server/gameserver/buff/callfunc.h +++ b/server/gameserver/buff/callfunc.h @@ -66,4 +66,5 @@ class CallFuncBuff : public Buff float hold_param2_ = 0.0; Weapon* hold_weapon_ = nullptr; + std::function deactivate_cb_ = nullptr; };