1
This commit is contained in:
parent
d0519e8a4d
commit
1d137dabcd
@ -633,77 +633,96 @@ 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;
|
||||||
auto on_enter =
|
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 =
|
auto on_stay =
|
||||||
[] (Human* hum)
|
[this] (Human* hum, const mt::Skill* active_skill_meta)
|
||||||
{
|
{
|
||||||
|
|
||||||
};
|
};
|
||||||
auto on_leave =
|
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
|
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]
|
[this, in_range_humans, active_skill_meta, on_enter, on_stay, on_leave, check_cb]
|
||||||
(int event, const a8::Args* args) mutable
|
(int event, const a8::Args* args) mutable
|
||||||
{
|
{
|
||||||
if (a8::TIMER_EXEC_EVENT == event) {
|
if (a8::TIMER_EXEC_EVENT == event) {
|
||||||
if (!owner->dead) {
|
check_cb(in_range_humans, active_skill_meta);
|
||||||
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]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (kActiveDjsSkillTimerEvent == event) {
|
} 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);
|
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) {
|
} 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;
|
active_skill_meta = nullptr;
|
||||||
|
check_cb(in_range_humans, active_skill_meta);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
&xtimer_attacher);
|
&xtimer_attacher);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user