This commit is contained in:
aozhiwei 2023-02-28 11:32:07 +08:00
parent 0ae31ebc0d
commit df5d8402f6

View File

@ -610,27 +610,29 @@ void Skill::Proc30501TZ()
void Skill::Proc30601DJS() 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
}; (
auto context = A8_MAKE_ANON_STRUCT_SHARED a8::XTimerWp passive_skill_timer;
( a8::XTimerWp active_skill_timer;
std::map<int, InnerObject> in_human_infos; std::vector<std::weak_ptr<Effect>> curr_effect_list;
); std::map<int, InnerObject> in_human_infos;
);
{
auto on_enter = auto on_enter =
[this, context] (Human* hum, const mt::Skill* active_skill_meta) [this, context] (Human* hum, const mt::Skill* active_skill_meta)
{ {
@ -727,7 +729,7 @@ void Skill::Proc30601DJS()
}; };
const mt::Skill* active_skill_meta = nullptr; const mt::Skill* active_skill_meta = nullptr;
std::set<Human*> in_range_humans; std::set<Human*> in_range_humans;
passive_skill_timer = owner->room->xtimer.SetIntervalWpEx context->passive_skill_timer = owner->room->xtimer.SetIntervalWpEx
( (
SERVER_FRAME_RATE, SERVER_FRAME_RATE,
[this, in_range_humans, active_skill_meta, on_enter, on_stay, on_leave, check_cb] [this, in_range_humans, active_skill_meta, on_enter, on_stay, on_leave, check_cb]
@ -752,40 +754,53 @@ void Skill::Proc30601DJS()
} }
}, },
&xtimer_attacher); &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 owner->GetTrigger()->AddListener
( (
kUseSkillEvent, 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; return;
} }
Skill* skill = args.Get<Skill*>(0); Skill* skill = args.Get<Skill*>(0);
if (skill->meta->GetMagicId() == MAGIC_20601_DJS) { if (skill->meta->GetMagicId() == MAGIC_20601_DJS) {
if (!active_skill_timer.expired()) { if (!context->active_skill_timer.expired()) {
return; return;
} }
a8::Args event_args({skill->meta}); a8::Args event_args({skill->meta});
owner->room->xtimer.FireEvent(passive_skill_timer, owner->room->xtimer.FireEvent(context->passive_skill_timer,
kActiveDjsSkillTimerEvent, kActiveDjsSkillTimerEvent,
&event_args); &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, 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) { if (a8::TIMER_DELETE_EVENT == event) {
a8::Args event_args({}); a8::Args event_args({});
owner->room->xtimer.FireEvent(passive_skill_timer, owner->room->xtimer.FireEvent(context->passive_skill_timer,
kDeactiveDjsSkillTimerEvent, kDeactiveDjsSkillTimerEvent,
&event_args); &event_args);
for (int effect_id : meta->_number_meta->_effect_list) {
context->curr_effect_list.push_back(owner->AddEffect(effect_id));
}
} }
}, },
&xtimer_attacher); &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));
}
} }
} }
); );