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;
);
{
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;
o.c = hum->GetWeakPtrRef();
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;
const mt::Skill* old_skill_meta = skill_meta;
skill_meta = curr_skill_meta;
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;
InnerObject o;
o.c = hum->GetWeakPtrRef();
context->in_human_infos[hum->GetUniId()] = o;
context->in_human_infos[hum->GetUniId()].OnEnter();
};
auto on_stay =
[this, context] (Human* hum)
{
};
auto on_leave =
[this, context] (Human* hum)
{
auto itr = context->in_human_infos.find(hum->GetUniId());
if (itr == context->in_human_infos.end()) {
abort();
const mt::Skill* old_skill_meta = skill_meta;
skill_meta = curr_skill_meta;
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));
}
for (int buff_uniid : itr->second.buff_uniids) {
hum->RemoveBuffByUniId(buff_uniid);
} else {
for (int buff_id : meta->_buff_param2_int_list) {
o.buff_uniids.insert(hum->TryAddBuff(GetCaster().Get(), buff_id, skill_meta));
}
itr->second.OnLeave();
};
auto check_cb =
[this, context, on_enter, on_stay, on_leave]
()
{
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;
}
}
skill_meta = old_skill_meta;
context->in_human_infos[hum->GetUniId()] = o;
context->in_human_infos[hum->GetUniId()].OnEnter();
};
auto on_stay =
[this, context] (Human* hum)
{
};
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) {
hum->RemoveBuffByUniId(buff_uniid);
}
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;
});
std::vector<Human*> leave_humans;
for (auto& pair : context->in_human_infos) {
bool found = false;
for (int i = 0; i < size; ++i){
if (hit_humans[i] == pair.second.c.Get()) {
found = true;
break;
}
return true;
});
std::vector<Human*> leave_humans;
for (auto& pair : context->in_human_infos) {
bool found = false;
for (int i = 0; i < size; ++i){
if (hit_humans[i] == pair.second.c.Get()) {
found = true;
break;
}
}
if (!found) {
@ -473,7 +477,6 @@ void CallFuncBuff::ProcLightCircle()
}
},
&xtimer_attacher);
}
{
owner->GetTrigger()->AddListener
@ -525,9 +528,13 @@ void CallFuncBuff::ProcLightCircle()
owner->GetTrigger()->AddListener
(
kStartJump,
[this, context] (const a8::Args& args) mutable
[this, context, on_leave] (const a8::Args& args) mutable
{
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);
context->keep_buff_uniid = 0;
}