This commit is contained in:
aozhiwei 2023-03-17 17:53:14 +08:00
parent ef830ecbab
commit e6c32f28bc

View File

@ -333,81 +333,85 @@ void CallFuncBuff::ProcLightCircle()
int keep_buff_uniid = 0; int keep_buff_uniid = 0;
); );
{
auto on_enter =
[this, context] (Human* hum)
{
if (context->in_human_infos.find(hum->GetUniId()) != context->in_human_infos.end()) {
abort();
}
const mt::Skill* curr_skill_meta = context->active_skill_meta ?
context->active_skill_meta : skill_meta;
InnerObject o; auto on_enter =
o.c = hum->GetWeakPtrRef(); [this, context] (Human* hum)
{
if (context->in_human_infos.find(hum->GetUniId()) != context->in_human_infos.end()) {
abort();
}
const mt::Skill* curr_skill_meta = context->active_skill_meta ?
context->active_skill_meta : skill_meta;
const mt::Skill* old_skill_meta = skill_meta; InnerObject o;
skill_meta = curr_skill_meta; o.c = hum->GetWeakPtrRef();
if (context->active_skill_meta) {
for (int buff_id : meta->_buff_param3_int_list) {
o.buff_uniids.insert(hum->TryAddBuff(GetCaster().Get(), buff_id, skill_meta));
}
} else {
for (int buff_id : meta->_buff_param2_int_list) {
o.buff_uniids.insert(hum->TryAddBuff(GetCaster().Get(), buff_id, skill_meta));
}
}
skill_meta = old_skill_meta;
context->in_human_infos[hum->GetUniId()] = o; const mt::Skill* old_skill_meta = skill_meta;
context->in_human_infos[hum->GetUniId()].OnEnter(); skill_meta = curr_skill_meta;
}; if (context->active_skill_meta) {
auto on_stay = for (int buff_id : meta->_buff_param3_int_list) {
[this, context] (Human* hum) o.buff_uniids.insert(hum->TryAddBuff(GetCaster().Get(), buff_id, skill_meta));
{
};
auto on_leave =
[this, context] (Human* hum)
{
auto itr = context->in_human_infos.find(hum->GetUniId());
if (itr == context->in_human_infos.end()) {
abort();
} }
for (int buff_uniid : itr->second.buff_uniids) { } else {
hum->RemoveBuffByUniId(buff_uniid); for (int buff_id : meta->_buff_param2_int_list) {
o.buff_uniids.insert(hum->TryAddBuff(GetCaster().Get(), buff_id, skill_meta));
} }
itr->second.OnLeave(); }
}; skill_meta = old_skill_meta;
auto check_cb =
[this, context, on_enter, on_stay, on_leave] context->in_human_infos[hum->GetUniId()] = o;
() context->in_human_infos[hum->GetUniId()].OnEnter();
{ };
const mt::Skill* curr_skill_meta = context->active_skill_meta ? auto on_stay =
context->active_skill_meta : skill_meta; [this, context] (Human* hum)
if (!owner->dead) { {
float range = curr_skill_meta->_number_meta->_float_range2; };
int size = 0; auto on_leave =
std::array<Human*, MAX_TEAM_NUM> hit_humans; [this, context] (Human* hum)
owner->GetTeam()->TraverseMembers {
( auto itr = context->in_human_infos.find(hum->GetUniId());
[this, range, &hit_humans, &size] (Human* hum) mutable if (itr == context->in_human_infos.end()) {
{ abort();
if (!hum->dead && }
Collision::CheckCC(owner, owner->GetRadius(), for (int buff_uniid : itr->second.buff_uniids) {
hum, range)) { hum->RemoveBuffByUniId(buff_uniid);
if (size < MAX_TEAM_NUM) { }
hit_humans[size++] = hum; itr->second.OnLeave();
} };
auto check_cb =
[this, context, on_enter, on_stay, on_leave]
()
{
if (owner->HasBuffEffect(kBET_Fly) ||
owner->HasBuffEffect(kBET_Jump)) {
return;
}
const mt::Skill* curr_skill_meta = context->active_skill_meta ?
context->active_skill_meta : skill_meta;
if (!owner->dead) {
float range = curr_skill_meta->_number_meta->_float_range2;
int size = 0;
std::array<Human*, MAX_TEAM_NUM> hit_humans;
owner->GetTeam()->TraverseMembers
(
[this, range, &hit_humans, &size] (Human* hum) mutable
{
if (!hum->dead &&
Collision::CheckCC(owner, owner->GetRadius(),
hum, range)) {
if (size < MAX_TEAM_NUM) {
hit_humans[size++] = hum;
} }
return true; }
}); return true;
std::vector<Human*> leave_humans; });
for (auto& pair : context->in_human_infos) { std::vector<Human*> leave_humans;
bool found = false; for (auto& pair : context->in_human_infos) {
for (int i = 0; i < size; ++i){ bool found = false;
if (hit_humans[i] == pair.second.c.Get()) { for (int i = 0; i < size; ++i){
found = true; if (hit_humans[i] == pair.second.c.Get()) {
break; found = true;
break;
} }
} }
if (!found) { if (!found) {
@ -473,7 +477,6 @@ void CallFuncBuff::ProcLightCircle()
} }
}, },
&xtimer_attacher); &xtimer_attacher);
}
{ {
owner->GetTrigger()->AddListener owner->GetTrigger()->AddListener
@ -525,9 +528,13 @@ void CallFuncBuff::ProcLightCircle()
owner->GetTrigger()->AddListener owner->GetTrigger()->AddListener
( (
kStartJump, kStartJump,
[this, context] (const a8::Args& args) mutable [this, context, on_leave] (const a8::Args& args) mutable
{ {
if (context->keep_buff_uniid) { if (context->keep_buff_uniid) {
for (auto& pair : context->in_human_infos) {
on_leave(pair.second.c.Get()->AsHuman());
}
context->in_human_infos.clear();
owner->RemoveBuffByUniId(context->keep_buff_uniid); owner->RemoveBuffByUniId(context->keep_buff_uniid);
context->keep_buff_uniid = 0; context->keep_buff_uniid = 0;
} }