From df5d8402f6aeacaf68db39dbe85e7db5afef237b Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 28 Feb 2023 11:32:07 +0800 Subject: [PATCH] 1 --- server/gameserver/skill.cc | 63 +++++++++++++++++++++++--------------- 1 file changed, 39 insertions(+), 24 deletions(-) diff --git a/server/gameserver/skill.cc b/server/gameserver/skill.cc index 7abc7139..32610b9d 100644 --- a/server/gameserver/skill.cc +++ b/server/gameserver/skill.cc @@ -610,27 +610,29 @@ void Skill::Proc30501TZ() void Skill::Proc30601DJS() { - a8::XTimerWp passive_skill_timer; + struct InnerObject { - struct InnerObject + CreatureWeakPtr c; + + void OnEnter() { - CreatureWeakPtr c; - void OnEnter() - { + } - } + void OnLeave() + { - void OnLeave() - { + } - } - - }; - auto context = A8_MAKE_ANON_STRUCT_SHARED - ( - std::map in_human_infos; - ); + }; + auto context = A8_MAKE_ANON_STRUCT_SHARED + ( + a8::XTimerWp passive_skill_timer; + a8::XTimerWp active_skill_timer; + std::vector> curr_effect_list; + std::map in_human_infos; + ); + { auto on_enter = [this, context] (Human* hum, const mt::Skill* active_skill_meta) { @@ -727,7 +729,7 @@ void Skill::Proc30601DJS() }; const mt::Skill* active_skill_meta = nullptr; std::set in_range_humans; - passive_skill_timer = owner->room->xtimer.SetIntervalWpEx + context->passive_skill_timer = owner->room->xtimer.SetIntervalWpEx ( SERVER_FRAME_RATE, [this, in_range_humans, active_skill_meta, on_enter, on_stay, on_leave, check_cb] @@ -752,40 +754,53 @@ void Skill::Proc30601DJS() } }, &xtimer_attacher); + for (int effect_id : meta->_number_meta->_effect_list) { + context->curr_effect_list.push_back(owner->AddEffect(effect_id)); + } } { - a8::XTimerWp active_skill_timer; owner->GetTrigger()->AddListener ( kUseSkillEvent, - [this, passive_skill_timer, active_skill_timer] (const a8::Args& args) mutable + [this, context] (const a8::Args& args) mutable { - if (passive_skill_timer.expired()) { + if (context->passive_skill_timer.expired()) { return; } Skill* skill = args.Get(0); if (skill->meta->GetMagicId() == MAGIC_20601_DJS) { - if (!active_skill_timer.expired()) { + if (!context->active_skill_timer.expired()) { return; } a8::Args event_args({skill->meta}); - owner->room->xtimer.FireEvent(passive_skill_timer, + owner->room->xtimer.FireEvent(context->passive_skill_timer, kActiveDjsSkillTimerEvent, &event_args); - active_skill_timer = owner->room->xtimer.SetTimeoutWpEx + context->active_skill_timer = owner->room->xtimer.SetTimeoutWpEx ( skill->meta->_number_meta->_float_time / FRAME_RATE_MS, - [this, passive_skill_timer] (int event, const a8::Args* args) mutable + [this, context] (int event, const a8::Args* args) mutable { if (a8::TIMER_DELETE_EVENT == event) { a8::Args event_args({}); - owner->room->xtimer.FireEvent(passive_skill_timer, + owner->room->xtimer.FireEvent(context->passive_skill_timer, kDeactiveDjsSkillTimerEvent, &event_args); + for (int effect_id : meta->_number_meta->_effect_list) { + context->curr_effect_list.push_back(owner->AddEffect(effect_id)); + } } }, &xtimer_attacher); + for (auto effect : context->curr_effect_list) { + owner->RemoveEffect(effect); + } + context->curr_effect_list.clear(); + for (int effect_id : skill->meta->_number_meta->_effect_list) { + context->curr_effect_list.push_back(owner->AddEffect(effect_id)); + } + } } );