From fea2976b0f4e19833743e16eb3746c3f3d2e09c1 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Sat, 18 Mar 2023 11:10:10 +0800 Subject: [PATCH] 1 --- server/gameserver/buff/cond_add.cc | 49 +++++++++++++++++++----------- server/gameserver/mt/Buff.h | 10 ++++-- 2 files changed, 40 insertions(+), 19 deletions(-) diff --git a/server/gameserver/buff/cond_add.cc b/server/gameserver/buff/cond_add.cc index 394e42cb..432ea363 100644 --- a/server/gameserver/buff/cond_add.cc +++ b/server/gameserver/buff/cond_add.cc @@ -146,6 +146,8 @@ void CondAddBuff::ProcDisengageBattle() auto context = A8_MAKE_ANON_STRUCT_SHARED ( + std::vector> hold_buff_list; + long long last_check_frameno = 0; ); a8::XTimerWp timer = owner->room->xtimer.SetIntervalWpEx @@ -155,11 +157,29 @@ void CondAddBuff::ProcDisengageBattle() { if (a8::TIMER_EXEC_EVENT == event) { if (!owner->dead) { - #if 0 - if (std::get<0>(*context.get()) == 0) { - std::get<0>(*context.get()) = 1; + for (int buff_id : meta->_buff_param4_int_list) { + int buff_uniid = owner->TryAddBuff + ( + GetCaster().Get(), + buff_id, + skill_meta + ); + if (!meta->_buff_param5_int_set.empty()) { + context->hold_buff_list.push_back + ( + std::make_tuple(buff_uniid, buff_id) + ); + } + } + if (owner->room->GetFrameNo() - context->last_check_frameno > SERVER_FRAME_RATE * 10 && + !meta->_buff_param5_int_set.empty() && + context->hold_buff_list.size() > 0) { + for (size_t i = context->hold_buff_list.size() - 1; i >= 0; --i) { + if (!owner->GetBuffByUniId(std::get<0>(context->hold_buff_list[i]))) { + context->hold_buff_list.erase(context->hold_buff_list.begin() + i); + } + } } - #endif } } }, @@ -171,23 +191,18 @@ void CondAddBuff::ProcDisengageBattle() if (timer.expired()) { return; } - owner->room->xtimer.ResetTimer(timer); - #if 0 - if (std::get<0>(*context.get()) == 1) { - for (int buff_uniid : std::get<1>(*context.get())) { - owner->RemoveBuffByUniId(buff_uniid); + if (!meta->_buff_param5_int_set.empty()) { + for (auto& tuple : context->hold_buff_list) { + if (meta->_buff_param5_int_set.find(std::get<1>(tuple)) != + meta->_buff_param5_int_set.end()) { + owner->RemoveBuffByUniId(std::get<0>(tuple)); + } } - std::get<0>(*context.get()) = 0; - std::get<1>(*context.get()).clear(); + context->hold_buff_list.clear(); } - #endif + owner->room->xtimer.ResetTimer(timer); }; - owner->GetTrigger()->AddListener - ( - kDieEvent, - cb - ); owner->GetTrigger()->AddListener ( kReceiveDmgEvent, diff --git a/server/gameserver/mt/Buff.h b/server/gameserver/mt/Buff.h index d22108f3..10c68d8e 100644 --- a/server/gameserver/mt/Buff.h +++ b/server/gameserver/mt/Buff.h @@ -42,10 +42,16 @@ namespace mt int _int_buff_param6 = 0; std::vector _buff_param1_int_list; std::vector _buff_param2_int_list; - std::set _buff_param1_int_set; - std::set _buff_param2_int_set; std::vector _buff_param3_int_list; std::vector _buff_param4_int_list; + std::vector _buff_param5_int_list; + std::vector _buff_param6_int_list; + std::set _buff_param1_int_set; + std::set _buff_param2_int_set; + std::set _buff_param3_int_set; + std::set _buff_param4_int_set; + std::set _buff_param5_int_set; + std::set _buff_param6_int_set; std::vector>>> _batch_add_list; std::vector>> _post_remove_action; std::set _immune_buffeffect;