diff --git a/server/gameserver/skill.cc b/server/gameserver/skill.cc index 3f8b7c3b..c3d66001 100644 --- a/server/gameserver/skill.cc +++ b/server/gameserver/skill.cc @@ -633,77 +633,96 @@ void Skill::Proc30601DJS() const mt::Skill* active_skill_meta = nullptr; std::set in_range_humans; auto on_enter = - [] (Human* num) + [this] (Human* num, const mt::Skill* active_skill_meta) { - + if (active_skill_meta) { + owner->GetAbility()->AddSpeedRuduce(active_skill_meta->_number_meta->_float_speed); + } }; auto on_stay = - [] (Human* hum) + [this] (Human* hum, const mt::Skill* active_skill_meta) { }; auto on_leave = - [] (Human* hum) + [this] (Human* hum, const mt::Skill* active_skill_meta) { - + if (active_skill_meta) { + owner->GetAbility()->DelSpeedRuduce(active_skill_meta->_number_meta->_float_speed); + } + }; + auto check_cb = + [this, on_enter, on_stay, on_leave] + (std::set& in_range_humans, const mt::Skill* active_skill_meta) + { + if (!owner->dead) { + float range = meta->_number_meta->_float_range2; + float resume_hp = meta->_number_meta->resume(); + int size = 0; + std::array hit_humans; + owner->GetTeam()->TraverseMembers + ( + [this, range, hit_humans, &size] (Human* hum) mutable + { + if (owner != hum && + Collision::CheckCC(owner, owner->GetRadius(), + hum, range)) { + if (size < MAX_TEAM_NUM) { + hit_humans[size++] = hum; + } + } + return true; + }); + std::vector leave_humans; + for (Human* hum : in_range_humans) { + bool found = false; + for (int i = 0; i < size; ++i){ + if (hit_humans[i] == hum) { + found = true; + break; + } + } + if (!found) { + on_leave(hum, active_skill_meta); + leave_humans.push_back(hum); + } + } + for (Human* hum : leave_humans) { + in_range_humans.erase(hum); + } + for (int i = 0; i < size; ++i){ + if (in_range_humans.find(hit_humans[i]) == in_range_humans.end()) { + on_enter(hit_humans[i], active_skill_meta); + on_stay(hit_humans[i], active_skill_meta); + in_range_humans.insert(hit_humans[i]); + } else { + on_stay(hit_humans[i], active_skill_meta); + } + } + } }; passive_skill_timer = owner->room->xtimer.SetIntervalWpEx ( SERVER_FRAME_RATE, - [this, in_range_humans, active_skill_meta, on_enter, on_stay, on_leave] + [this, in_range_humans, active_skill_meta, on_enter, on_stay, on_leave, check_cb] (int event, const a8::Args* args) mutable { if (a8::TIMER_EXEC_EVENT == event) { - if (!owner->dead) { - float range = meta->_number_meta->_float_range2; - float resume_hp = meta->_number_meta->resume(); - int size = 0; - std::array hit_humans; - owner->GetTeam()->TraverseMembers - ( - [this, range, hit_humans, &size] (Human* hum) mutable - { - if (owner != hum && - Collision::CheckCC(owner, owner->GetRadius(), - hum, range)) { - if (size < MAX_TEAM_NUM) { - hit_humans[size++] = hum; - } - } - return true; - }); - std::vector leave_humans; - for (Human* hum : in_range_humans) { - bool found = false; - for (int i = 0; i < size; ++i){ - if (hit_humans[i] == hum) { - found = true; - break; - } - } - if (!found) { - on_leave(hum); - leave_humans.push_back(hum); - } - } - for (Human* hum : leave_humans) { - in_range_humans.erase(hum); - } - for (int i = 0; i < size; ++i){ - if (in_range_humans.find(hit_humans[i]) == in_range_humans.end()) { - on_enter(hit_humans[i]); - in_range_humans.insert(hit_humans[i]); - } else { - on_stay(hit_humans[i]); - } - } - } + check_cb(in_range_humans, active_skill_meta); } else if (kActiveDjsSkillTimerEvent == event) { + for (Human* hum : in_range_humans) { + on_leave(hum, active_skill_meta); + } + in_range_humans.clear(); active_skill_meta = args->Get(0); - //owner->GetAbility()->AddSpeedRuduce(active_skill_meta->_number_meta->speed()); + check_cb(in_range_humans, active_skill_meta); } else if (kDeactiveDjsSkillTimerEvent == event) { - //owner->GetAbility()->DecSpeedRuduce(active_skill_meta->_number_meta->speed()); + for (Human* hum : in_range_humans) { + on_leave(hum, active_skill_meta); + } + in_range_humans.clear(); active_skill_meta = nullptr; + check_cb(in_range_humans, active_skill_meta); } }, &xtimer_attacher);