1
This commit is contained in:
parent
ef830ecbab
commit
e6c32f28bc
@ -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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user