This commit is contained in:
aozhiwei 2023-02-15 19:38:20 +08:00
parent d0519e8a4d
commit 1d137dabcd

View File

@ -633,77 +633,96 @@ void Skill::Proc30601DJS()
const mt::Skill* active_skill_meta = nullptr;
std::set<Human*> 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<Human*>& 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<Human*, MAX_TEAM_NUM> 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<Human*> 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<Human*, MAX_TEAM_NUM> 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<Human*> 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<const mt::Skill*>(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);